Доступ к S3 из lambda с использованием предполагаемой роли

#amazon-web-services #amazon-s3 #aws-lambda #terraform

Вопрос:

Я пытаюсь создать простую инфраструктуру с использованием terraform.Terraform должен создать корзину lambda и s3, lambda запускается с помощью API gateway, который снова создается terraform. Я создал роль и назначил ее lambda, чтобы lambda могла помещать объекты в корзину s3. Мой lambda написан на Java, поскольку я назначаю роль lambda для доступа к S3, как мне использовать эту роль в своем коде? Я наткнулся на другую статью, в которой предлагалось получить доступ к S3 с помощью приведенного ниже кода. Я предположил, что об этом позаботится генерация токена.

 var s3Client = AmazonS3ClientBuilder.standard()
         .withCredentials(InstanceProfileCredentialsProvider(false))
        .withRegion("ap-southeast-2")
        .build()
 

Я не понимаю, как получить доступ к s3, нужно ли мне использовать роль, созданную terraform в моем коде, или есть другой способ доступа к S3 из кода Java?

Комментарии:

1. Не указывайте регион или поставщика учетных данных, и все должно быть в порядке.

Ответ №1:

Вам не нужно брать на себя роль внутри функции Lambda. Вместо этого просто настройте функцию Lambda на принятие роли IAM. Или добавьте соответствующую политику S3 к существующей роли IAM в Lambda.

Обычно в этом случае вам не нужно явно указывать учетные данные или регион. Просто используйте:

 AmazonS3 s3Client = new AmazonS3Client();
 

Смотрите Базовый пример Terraform по созданию роли IAM и лямбда-функции и настройке лямбда-функции для принятия настроенной роли.

Комментарии:

1. Большое вам спасибо, это сработало. Я также допустил еще одну ошибку при вызове S3.« S3Client.putObject( PutObjectRequest(«bucket-test», response.fileName, response.content))« Содержимое должно быть преобразовано в поток байтов, но я передавал строку, в которой используется другой конструктор.

Ответ №2:

Ответ Jarmods верен, что вы можете настроить роль лямбды напрямую, но есть конкретные случаи использования, когда вам может потребоваться быть первым в одной учетной записи, чем в другой. Если вам нужно взять на себя роль в середине вашего кода, используйте функциональность STS вашего SDK. STS — это библиотека в aws sdk, которая управляет принятием учетных данных роли с помощью кода.