Я использую boto3 для запроса S3 на наличие данного файла X в лямбда-функции.
Я вызываю лямбда-функцию один раз (с 3 повторными попытками) в функции шага.
Функция шага вызывается ~ 200 раз с разными входами, и поэтому при каждом лямбда-вызове значение X изменяется.
При выполнении ~ 200 вызовов я получаю, возможно, 10 сбоев, которые приводят к :
{
"error": "EndpointConnectionError",
"cause": {
"errorMessage": "Could not connect to the endpoint URL: \"https://<my-bucket>.s3.eu-west-2.amazonaws.com/<folder-name>/<folder-2-name>/<filename>\"",
"errorType": "EndpointConnectionError",
"stackTrace": [
[
"/var/task/sentinel-retrieve-tile.py",
107,
"handler",
"if band_exists_in_s3(band, product_id, imagery_folder):"
],
[
"/var/task/sentinel-retrieve-tile.py",
183,
"band_exists_in_s3",
"get_s3_resource().Object(<my-bucket>, f\"{imagery_folder}/{product_id}/{band}.tif\").load()"
],
[
"/var/runtime/boto3/resources/factory.py",
505,
"do_action",
"response = action(self, *args, **kwargs)"
],
[
"/var/runtime/boto3/resources/action.py",
83,
"__call__",
"response = getattr(parent.meta.client, operation_name)(**params)"
],
[
"/var/runtime/botocore/client.py",
272,
"_api_call",
"return self._make_api_call(operation_name, kwargs)"
],
[
"/var/runtime/botocore/client.py",
563,
"_make_api_call",
"operation_model, request_dict, request_context)"
],
[
"/var/runtime/botocore/client.py",
582,
"_make_request",
"return self._endpoint.make_request(operation_model, request_dict)"
],
[
"/var/runtime/botocore/endpoint.py",
102,
"make_request",
"return self._send_request(request_dict, operation_model)"
],
[
"/var/runtime/botocore/endpoint.py",
137,
"_send_request",
"success_response, exception):"
],
[
"/var/runtime/botocore/endpoint.py",
231,
"_needs_retry",
"caught_exception=caught_exception, request_dict=request_dict)"
],
[
"/var/runtime/botocore/hooks.py",
356,
"emit",
"return self._emitter.emit(aliased_event_name, **kwargs)"
],
[
"/var/runtime/botocore/hooks.py",
228,
"emit",
"return self._emit(event_name, kwargs)"
],
[
"/var/runtime/botocore/hooks.py",
211,
"_emit",
"response = handler(**kwargs)"
],
[
"/var/runtime/botocore/retryhandler.py",
183,
"__call__",
"if self._checker(attempts, response, caught_exception):"
],
[
"/var/runtime/botocore/retryhandler.py",
251,
"__call__",
"caught_exception)"
],
[
"/var/runtime/botocore/retryhandler.py",
277,
"_should_retry",
"return self._checker(attempt_number, response, caught_exception)"
],
[
"/var/runtime/botocore/retryhandler.py",
317,
"__call__",
"caught_exception)"
],
[
"/var/runtime/botocore/retryhandler.py",
223,
"__call__",
"attempt_number, caught_exception)"
],
[
"/var/runtime/botocore/retryhandler.py",
359,
"_check_caught_exception",
"raise caught_exception"
],
[
"/var/runtime/botocore/endpoint.py",
200,
"_do_get_response",
"http_response = self._send(request)"
],
[
"/var/runtime/botocore/endpoint.py",
244,
"_send",
"return self.http_session.send(request)"
],
[
"/var/runtime/botocore/httpsession.py",
283,
"send",
"raise EndpointConnectionError(endpoint_url=request.url, error=e)"
]
]
}
}
Что-то явно мешает с boto при повторной попытке, возникает та же ошибка, означающая, что состояние ошибки сохраняется во время горячих запусков.
Я сделал много итераций того, как Я создаю экземпляр своего объекта S3 Resource:
- Вне области действия обработчика (IE статически)
- Внутри обработчика и передаю его соответствующим методам
- Для каждого вызова метода для проверки существование X (в строке, когда используется)
Я не могу на всю жизнь понять, как обойти это. Я думал, что это может быть проблема региона, но мой Lambdas + Bucket находится в eu-west-2
, я даже жестко закодировал region_name
в своем экземпляре ресурса.
У кого-нибудь есть какие-либо предложения? AWS ограничивает количество вызовов, которые может принимать ведро? Есть ли у boto3 лимит?
Спасибо!