アプリケーション用の 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 のいずれかを使用してアプリを構築します。SDK によって一時的な資格情報が自動的に追加されるため、メソッドを呼び出すときに資格情報を指定しないでください。
以下に、上記の各ポイントに対して私が行ったことについて言及します。
- 終わり
- 信頼関係を追加できません。「Amazon EC2」サービスロールを選択すると、「ステップ 3: 信頼の確立」が自動的に入力されます
3 と 4. 「AmazonS3FullAccess」ポリシーをアタッチします
- (1)で作成したロールを指定した新しいEC2インスタンスを起動しました
しかし、(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、私のアプリケーションは、docker コンテナー内の JVM で実行される Grails アプリケーションです。