アプリケーションの最新バージョンをダウンロードするためにプライベート S3 バケットにアクセスする必要があるスタックを構築しています。私はIAM ロールを使用しています。これは、EC2 インスタンスに特定のロールを割り当てることができる比較的新しい AWS 機能であり、その後、IAM ポリシーと結合されます。残念ながら、これらのロールには、インスタンス化時に生成された一時的な API 資格情報が付属しています。それは不自由ではありませんが、この cloud-init スクリプトのようなことをすることを余儀なくされました (関連するビットだけに簡略化されています):
#!/bin/sh
# Grab our credentials from the meta-data and parse the response
CREDENTIALS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access)
S3_ACCESS_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['AccessKeyId'];")
S3_SECRET_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['SecretAccessKey'];")
S3_TOKEN=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['Token'];")
# Create an executable script to pull the file
cat << EOF > /tmp/pullS3.rb
require 'rubygems'
require 'aws-sdk'
AWS.config(
:access_key_id => "$S3_ACCESS_KEY",
:secret_access_key => "$S3_SECRET_KEY",
:session_token => "$S3_TOKEN")
s3 = AWS::S3.new()
myfile = s3.buckets['mybucket'].objects["path/to/my/file"]
File.open("/path/to/save/myfile", "w") do |f|
f.write(myfile.read)
end
EOF
# Downloading the file
ruby /tmp/pullS3.rb
何よりもまず、これは機能し、かなりうまく機能します。それでも、CloudFormation のソース アクセスに対する既存のサポートを使用したいと思います。具体的には、 S3 バケットなどの保護されたデータを取得するための認証リソースcfn-init
の使用をサポートします。内からこれらのキーを取得したり、IAM ロールを認証リソースに関連付けたりする方法はありますか?cfn-init
別の方法として、ソースを他の認証済みサービスの背後に配置することも考えられますが、現時点では実行可能なオプションではありません。
別の有望なリードはAWS::IAM::AccessKey リソースですが、ドキュメントではロールで使用できることは示唆されていません。とにかくやってみます。