Как диагностировать несогласованные ошибки разрешений S3
Я запускаю сценарий Python в функции AWS Lambda. Он запускается сообщениями SQS, которые сообщают сценарию, что определенные объекты загружаются из корзины S3 для дальнейшей обработки.
Похоже, что разрешения настроены правильно, с политикой корзины, которая позволяет роли выполнения Lambda выполнять любые действия с любым объектом в корзине. А Lambda может получить доступ ко всему большую часть времени. Объекты загружаются черезpandas
а также s3fs
: pandas.read_csv(f's3://{s3_bucket}/{object_key}')
.
Однако, когда новый объект загружается в корзину S3, Lambda не может сначала получить к нему доступ. Вbotocore
SDK кидает An error occurred (403) when calling the HeadObject operation: Forbidden
при попытке доступа к объекту. Повторные вызовы (даже более 50) лямбды в течение нескольких минут (через SQS) дают ту же ошибку. Однако при вызове Lambda с другим сообщением SQS (которое загружает разные объекты из S3), а затем повторном вызове с исходным сообщением, Lambda может внезапно получить доступ к объекту S3 (который ранее каждый раз терпел неудачу). Все последующие попытки доступа к этому объекту из лямбды будут успешными.
Я не понимаю, что могло вызвать это. Этот повторяющийся трехэтапный процесс (1) завершается ошибкой для вновь загруженного объекта, 2) выполняется с другими объектами 3) выполняется успешно для исходных объектов) может происходить в одном контейнере Lambda (все они находятся в одном потоке журнала CloudWatch, что кажется для корреляции с контейнерами Lambda). Итак, похоже, это не из-за необходимости нового контейнера / экземпляра Lambda.
Мысли или идеи, как это дальше отлаживать?
1 ответ
Amazon S3 - это система хранения объектов, а не файловая система. Он доступен через вызовы API, которые выполняют такие действия, какGetObject
, PutObject
а также ListBucket
.
Утилиты вроде s3fs
позволяют "смонтировать" корзину Amazon S3 как файловую систему. Однако за кулисами s3fs выполняет обычные вызовы API, как и любая другая программа.
Иногда (часто?) Это может приводить к проблемам, особенно если файлы быстро создаются, обновляются и удаляются. S3fs может занять некоторое время, чтобы обновить S3, чтобы он соответствовал ожиданиям от локальной файловой системы.
Поэтому не рекомендуется использовать такие инструменты, как s3fs, для "монтирования" S3 в качестве файловой системы, особенно для производственного использования. Лучше вызвать AWS API напрямую.