Копирование aws s3 завершается ошибкой: «Закрытое соединение удаленного конца без ответа» - PullRequest
0 голосов
/ 20 ноября 2018

Последний шаг моей лямбда-функции - скопировать временный ключ s3 в его окончательное имя (которое может существовать или не существовать).Эта копия успешно выполняется большую часть времени, но может завершиться ошибкой:

ConnectionError: ('Соединение прервано.', RemoteDisconnected ('Соединение с удаленным концом закрыто без ответа',))

File "/var/task/main.py", line 217, in _s3_copy
s3cli.copy_object(Bucket=dst_bucketname, Key=dst_keyname, **xtra)
File "/var/runtime/botocore/client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 599, in _make_api_call
operation_model, request_dict)
File "/var/runtime/botocore/endpoint.py", line 148, in make_request
return self._send_request(request_dict, operation_model)
File "/var/runtime/botocore/endpoint.py", line 177, in _send_request
success_response, exception):
File "/var/runtime/botocore/endpoint.py", line 273, in _needs_retry
caught_exception=caught_exception, request_dict=request_dict)
File "/var/runtime/botocore/hooks.py", line 227, in emit
return self._emit(event_name, kwargs)
File "/var/runtime/botocore/hooks.py", line 210, in _emit
response = handler(**kwargs)
File "/var/runtime/botocore/retryhandler.py", line 183, in __call__
if self._checker(attempts, response, caught_exception):
File "/var/runtime/botocore/retryhandler.py", line 251, in __call__
caught_exception)
File "/var/runtime/botocore/retryhandler.py", line 277, in _should_retry
return self._checker(attempt_number, response, caught_exception)
File "/var/runtime/botocore/retryhandler.py", line 317, in __call__
caught_exception)
File "/var/runtime/botocore/retryhandler.py", line 223, in __call__
attempt_number, caught_exception)
File "/var/runtime/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
File "/var/runtime/botocore/endpoint.py", line 222, in _get_response
proxies=self.proxies, timeout=self.timeout)
File "/var/runtime/botocore/vendored/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/var/runtime/botocore/vendored/requests/adapters.py", line 415, in send
raise ConnectionError(err, request=request)
botocore.vendored.requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

Какое средство от этого?Повторные?Или другие параметры повторных попыток / тайм-аута клиента?

Примечание. В лямбда-версии это boto3 1.7.74 и botocore 1.10.74.Размер файлов варьируется, но они находятся в диапазоне 2-4 ГБ.

1 Ответ

0 голосов
/ 20 ноября 2018

Я нашел причину для этого, но из трассировки стека не было совершенно очевидно, что происходит.

Решение. Оказалось, что политика в роли, назначенной лямбдене разрешил действие PutObject для целевого сегмента.Я просто добавил целевую корзину в список.

То, как я это выяснил, состояло в том, чтобы поднять детализацию ведения журнала boto3.Непосредственно перед копированием я добавил следующее:

 boto3.set_stream_logger('', logging.DEBUG)

Первый параметр - это обычно имя службы, но '' интерпретируется как все службы.Моя регистрация для лямбды была настроена на сброс в журналы cloudwatch, поэтому я мог проверить их там.

Я обнаружил следующие ошибки во время CopyObject:

[DEBUG] 2018-11-20T10:20:37.981Z    4a230839-ecac-11e8-8412-7bf802a1306b    ConnectionError received when sending HTTP request.
Traceback (most recent call last):
File "/var/runtime/botocore/vendored/requests/packages/urllib3/connectionpool.py", line 372, in _make_request
httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'

During handling of the above exception, another exception occurred:

...repeated...

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/var/runtime/botocore/endpoint.py", line 222, in _get_response
proxies=self.proxies, timeout=self.timeout)
File "/var/runtime/botocore/vendored/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/var/runtime/botocore/vendored/requests/adapters.py", line 415, in send
raise ConnectionError(err, request=request)
botocore.vendored.requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

Выглядело так, как будтосначала возникла ошибка TypeError, которая заставила меня поверить, что я мог столкнуться с несовместимостью версий пакетов между запросами и urllib3.Но оказывается, что этот путь к коду является устаревшим путем к коду, выбранному urllib3, и ожидается, что он будет использован при возникновении других сетевых ошибок (см. проблема буферизации на github ).Это была красная сельдь - это нормально.Реальная причина - это то, что спровоцировало это в первую очередь.

Я обнаружил еще несколько записей до того момента в трассировке, где соединение с конечной точкой https сегмента установилось успешно, но ответ не мог быть прочитан.Таким образом, соединение было закрыто до того, как requests смог даже прочитать код состояния в PUT.

Я ожидал, что смогу хотя бы прочитать AccessDenied, что облегчило бы диагностику.Другие вызовы S3 завершатся неудачно с AccessDenied, я не уверен, почему этот вызов особенный.Возможно, это политика, которая помогает защитить общедоступные корзины.не уверен.

В любом случае, настройка разрешений исправила его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...