Что мне делать, когда S3-клиент boto3 выдает случайную ошибку EndpointConnectionError - PullRequest
0 голосов
/ 21 февраля 2020

Я использую 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 лимит?

Спасибо!

...