プライベートs3バケットからファイルをプルダウンするec2ユーザーデータスクリプトを作成しようとしています。 ec2インスタンスは複数のリージョンにあります。これにより、バケットポリシーを使用してVPCへのアクセスを制限する可能性がなくなると思います(これは私のプロトタイプではうまく機能していましたが、2番目のリージョンで壊れました)。
ここや他の場所でのアドバイスに基づくと、うまくいくはずのアプローチは、ec2インスタンスにそのs3バケットへのアクセス権を持つIAMロールを与えることです。そして実際、これはほとんど私にとってはうまくいくようです。ただし、ユーザーデータスクリプトの実行時ではありません。
私のユーザーデータスクリプトには、s3からダウンロードしようとしているファイルの存在を確認するwhileループがあり、5分間再試行し続けます。そのウィンドウの間に手動でログインし、その5分のウィンドウで正確なawsコマンドを手動で実行すると、user-dataスクリプトは期待どおりに成功しますが、それ自体では成功しません。
apt install -y python-minimal
apt install -y unzip
wget "https://s3.amazonaws.com/aws-cli/awscli-bundle.Zip"
unzip awscli-bundle.Zip
./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
mkdir -p /opt/myapp
cd /opt/myapp
n=0
while [ ! -f app.tar.gz ]; do
aws s3 cp --region us-west-1 "s3://bucket_name/app.tar.gz" app.tar.gz
n=$[$n+1]
[ $n -ge 60 ] && break
sleep 5
done
tar -zxf app.tar.gz
./bin/startapp
これは私のユーザーデータスクリプトの蒸留版です。ログインして同じawsコマンドを手動で実行できる場合は、IAMの役割が正しい必要があると思います。しかし、他に何がうまくいかないのかわかりません。ユーザーデータスクリプトからawsコマンドを実行すると、エラーは次のようになります。致命的なエラー: 'HeadObject操作の呼び出し時にエラーが発生しました(403):禁止'
最終的には問題を解決しましたが、投稿した内容からは問題がわかりませんでした。ユーザーデータスクリプトをここに投稿できるものにまとめましたが、実際にはもっと長くなっています。投稿されていない重要な部分は、このプロセスによって最終的に開始されたアプリがAmazonのSESにアクセスする必要があるということです。この質問を投稿したとき、これらの環境変数はスクリプトの先頭にあり、S3呼び出しは割り当てられた役割ではなく、それらを使用していました。アプリが起動する直前(重要なのは、S3ダウンロードコマンドの後)に環境変数を移動すると、ユーザーデータスクリプトは期待どおりに機能しました。
キャプチャする価値のある重要な部分は、IAMロールがインスタンスに割り当てられ、AWS cliがそれらの認証情報を自動的に使用しますが、認証情報はS3への呼び出しなどのユーザー認証情報と同じように使用されることです。他の資格情報を設定することは、ロールからの資格情報を完全に上書きすることを意味します。この問題を掘り下げる前に、リクエストがAWSの内部にある場合、S3サービスには発信者と発信者のロールを検証する方法があるのではないかという印象を受けました。