Назад | Перейти на главную страницу

S3 - соединение прервано / разорвана труба при загрузке на заранее заданные URL-адреса одного сегмента, но другие сегменты в порядке

У меня есть корзина S3 в стеке Cloudformation, в которой хранятся артефакты. Лямбда-функция в том же стеке генерирует заранее подписанный URL-адрес, по которому клиенты могут загружать файлы в корзину.

У меня уже был работающий код заранее, но после того, как я сегодня повторно развернул стек, ни один из моих клиентов не смог загрузить что-либо по заранее заданным URL-адресам - похоже, S3 закрывает соединение, не возвращая ответа. Я проверил, что лямбда-функция имеет доступ CRUD к корзине, но чтобы исключить проблемы с IAM, я запустил тестовый код (ниже) локально на своей машине с учетными данными администратора IAM:

import boto3
import requests

s3_client = boto3.client("s3")

# re-enacting what my lambda function would have done
data = s3_client.generate_presigned_post(Bucket="my-cursed-bucket", Key="somefile.txt")
# {'url' : 'https://my-cursed-bucket.s3.amazonaws.com', 'fields': ...}

# re-enacting what my REST clients would have done
file = open('somefile.txt', 'rb')
requests.post(url=data['url'], data=data['fields'], files={'file': file})

S3 никогда не возвращает ответ, но закрывает его, а requests / urllib выдает исключения о сломанных каналах:

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 119, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BrokenPipeError(32, 'Broken pipe'))

Я никогда раньше не сталкивался с этой проблемой - когда у меня были плохо настроены ACL / условия предварительного подписания, S3, по крайней мере, возвращал мне определенный код состояния HTTP и сообщение XML, в котором говорилось, что было не так.

К сожалению, похоже, это происходит только с этим конкретным ведром, принадлежащим стеку. Если я использую тот же код, приведенный выше, для генерации предварительно подписанных URL-адресов для любого другого сегмента с различными правилами ACL / настройками CORS и т. Д., Все они будут работать.

Повторное развертывание стека или создание копии стека под другим именем (приводящее к другим именам корзин, но по-прежнему принадлежащих стеку) все равно приведет к сбою предварительно заданной загрузки.

Я не вносил никаких изменений в свойства корзины в стеке, когда эта проблема началась сегодня. Объявление моей корзины в моем шаблоне CloudFormation (SAM) просто:

MyCursedBucket:
    Type: AWS::S3::Bucket

и больше ничего.

Что вызывает эту проблему? Требуются ли специальные настройки для работы предварительных загрузок, которые я пропустил в шаблоне CF?