Как получить доступ к S3 на AMI в AWS Marketplace?

Я создаю образ AMI для своего приложения и размещаю его на AWS Marketplace. Моему приложению требуется доступ к корзине S3, где хранятся документы, загруженные в мое приложение. При запуске моего приложения я прошу пользователя ввести ключ доступа, секретный ключ и имя корзины следующим образом:

docker run -d  --name ourcontainername -e UPLOAD_ACCESS=<access_key> -e UPLOAD_SECRET=<secret_key> -e UPLOAD_BUCKET=<bucket> ourimagename

Однако похоже, что AWS Marketplace не допускает такой практики.

Однако для AWS Marketplace мы требуем от авторов приложений использовать роли AWS Identity and Access Management (IAM) и не разрешаем использование ключей доступа или секретных ключей.

Я читаю эту документацию, в которой предлагаются способы использования ролей IAM для этого: https://d0.awsstatic.com/whitepapers/strategies-for-managing-access-to-aws-resources-in-aws-marketplace.pdf Однако, Я не могу понять, как сделать то, что они предлагают. Они предлагают следующее:

  1. Создайте новую роль экземпляра.
  2. Добавьте доверительные отношения, которые позволят ec2.amazonaws.com взять на себя эту роль.
  3. Создайте новую политику, определяющую необходимые разрешения.
  4. Добавьте новую политику в новую роль экземпляра.
  5. Создайте новый экземпляр EC2, указывающий роль IAM.
  6. Создайте свое приложение с помощью одного из AWS SDK. Не указывайте учетные данные при вызове методов, поскольку временные учетные данные будут автоматически добавлены пакетом SDK.

Ниже я упоминаю, что я сделал для каждого из пунктов выше.

  1. Готово
  2. Не могу добавить доверительные отношения. Я выбираю сервисную роль «Amazon EC2», и для меня автоматически заполняется «Шаг 3: Установить доверие».

введите здесь описание изображения

3 и 4. Прилагаю политику "AmazonS3FullAccess"

  1. Я запустил новый экземпляр EC2, в котором указана роль, созданная в (1)

Однако я не уверен, что означает (6)?

Создайте свое приложение с помощью одного из AWS SDK. Не указывайте учетные данные при вызове методов, поскольку временные учетные данные будут автоматически добавлены пакетом SDK.

В новом экземпляре, который я создал, когда я делаю

[ec2-user@ip-172-31-42-131 ~]$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<rolename>

Я вижу ACCESS_KEY, SECRET_KEY и TOKEN. Должно ли мое приложение использовать их вместо этого?

FWIW, мое приложение — это приложение Grails, которое работает на JVM внутри док-контейнера.


person Anthony    schedule 15.12.2016    source источник
comment
№ 6 означает, что в идеале ваше приложение должно получать доступ к S3 (или любому другому необходимому ресурсу AWS) через AWS SDK, и причина в том, что вашему приложению не нужно беспокоиться об аутентификации. SDK будет использовать учетные данные, которыми экземпляр EC2 по своей природе был запущен с ролью IAM.   -  person jarmod    schedule 15.12.2016
comment
Но, как я показал в вопросе, экземпляр ec2, запущенный с ролью IAM, не имеет метаданных о роли. Я показал это в команде curl. Кроме того, знаете ли вы, есть ли пример, показывающий, как использовать SDK для выполнения вызовов S3 без доступа и секретного ключа?   -  person Anthony    schedule 15.12.2016
comment
iam/учетные данные безопасности/имя-роли   -  person jarmod    schedule 15.12.2016
comment
@jarmod, не могли бы вы уточнить? это путь к чему-то? Вот как выглядит URL-адрес, который я использую в экземпляре ec2 для curl.   -  person Anthony    schedule 15.12.2016
comment
дох... я понял это. Это должно быть http://169.254.169.254/latest/meta-data/iam/security-credentials/<role-name>, где <role-name> — имя роли, используемое в (1).   -  person Anthony    schedule 15.12.2016