Предписанные URL-адреса POST работают локально, но не в Lambda - PullRequest
1 голос
/ 18 июня 2019

У меня есть какой-то Python, который может запросить предварительно назначенный URL-адрес POST для загрузки объекта в корзину S3. Он работает, выполняя его локально, под моим пользователем IAM с правами администратора, и я могу загружать вещи в корзину, используя Postman и cURL. Однако при попытке запустить тот же код в Lambda выдается «Идентификатор ключа доступа AWS, который вы указали, не существует в наших записях».

Единственное отличие состоит в том, что функция Lambda работает без прав администратора (но у нее есть политика, позволяющая запускать любое действие S3 в корзине) и использует другую (более старую) версию Boto3.

Это код, который я пытаюсь использовать: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file

Я пытался использовать детали, возвращаемые функцией Lambda, точно так же, как я использую детали, возвращаемые локально, но детали лямбды не работают.

1 Ответ

0 голосов
/ 18 июня 2019

Хороший вопрос. Вы не описали, как вы получаете свои учетные данные для функции Lambda. Ваш код, а именно этот:

s3_client = boto3.client('s3')

ожидает найти учетные данные по умолчанию с помощью файла ~ / .aws / credentials. У вас не будет (и не будет) этого файла в вашей среде выполнения Lambda, но, вероятно, он будет у вас в вашей локальной среде. Я подозреваю, что вы вообще не получаете свои учетные данные для функции Lambda.

В Lambda есть два варианта получения учетных данных.

  1. не используйте учетные данные, но используйте роль IAM для функции Lambda, которая обеспечивает требуемый доступ к S3. Это лучшая практика. Если вы сделаете это, вам не понадобятся учетные данные. Это лучшая практика.
  2. установить учетные данные в качестве переменных среды для вашей лямбда-функции. Вы можете напрямую определить AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, а затем приведенный выше код должен просто подобрать их и использовать их.
...