У меня есть корзина 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?