我正在为我的应用程序创建一个 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但是,我无法理解如何按照他们的建议去做。他们提出以下建议:
- 创建一个新的实例角色。
- 添加允许 ec2.amazonaws.com 代入该角色的信任关系。
- 创建一个指定所需权限的新策略。
- 将新策略添加到新实例角色。
- 创建一个指定 IAM 角色的新 EC2 实例。
- 使用 AWS 开发工具包之一构建您的应用程序。调用方法时不要指定凭据,因为 SDK 会自动添加临时凭据。
下面我会提到我为上述每一点所做的工作。
- 完毕
- 我无法添加信任关系。我选择“Amazon EC2”服务角色,“第 3 步:建立信任”会自动为我填写
3 和 4. 我附上了“AmazonS3FullAccess”政策
- 我启动了一个新的 EC2 实例,它指定在 (1) 中创建的角色
但是,我不确定(6)是什么意思?
使用 AWS 开发工具包之一构建您的应用程序。调用方法时不要指定凭据,因为 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,我的应用程序是在 Docker 容器内的 JVM 上运行的 Grails 应用程序。