S3にファイルを保存していて、.ebextensions
configを使用して、それらを新しいインスタンスに自動的にコピーします。 ElasticBeanstalkコンソールで次のエラーが発生します。
[インスタンス:[〜#〜] instanceid [〜#〜]モジュール:AWSEBAutoScalingGroup ConfigSet:null]コマンドがインスタンスで失敗しました。リターンコード:1出力:[CMD-AppDeploy/AppDeployStage0/EbExtensionPreBuild]コマンドがエラーコード1で失敗しました:ビルド中にエラーが発生しました:取得に失敗しました https://s3-us-west-1.amazonaws.com/ MyBucket/MyFolder/ _ MyFile.txt :HTTPエラー403 :
AccessDenied
私の.ebextension設定ファイルには次のセクションがあります。
files:
"/target/file/path" :
mode: "000777"
owner: ec2-user
group: ec2-user
source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt
このファイルコピーを機能させるために、Elastic Beanstalk IAMロールにすべてのS3への標準の読み取り専用アクセスポリシーを与えることで、アクセス許可を緩和しました。ポリシーは次のとおりです。
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
それでも、ビルド前のコピー手順は失敗します。ソースURLを正しい形式で指定しましたか?別のセキュリティエンティティ/ポリシーが関係していますか?助けてください :)
このエラーを克服するための解決策を見つけました。 Resources
セクションを.ebextensions構成ファイルに追加すると機能することがわかりました。ファイル全体は次のようになります。
files:
"/target/file/path" :
mode: "000777"
owner: ec2-user
group: ec2-user
source: https://s3-us-west-1.amazonaws.com/_MyBucket_/_MyFolder_/_MyFile.txt
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Access:
type: S3
roleName: aws-elasticbeanstalk-ec2-role
buckets: _MyBucket
この時点で、なぜそれがこのようにならなければならないのかを理解するのに十分なことはわかりません。うまくいけば、それは失われた誰かが前進し、最終的にはより良い理解を得るのを助けることができます。私はこのリンクに基づいて答えました https://forums.aws.Amazon.com/message.jspa?messageID=541634
ドキュメントはこのテーマについて非常に大雑把です(おそらくStackExchangeドキュメントの理想的な候補です!)。
.ebextensions
でこれを正しく行うには、バケットポリシーでBeanstalkインスタンスIAMユーザーを許可し、AWS::CloudFormation::Authentication:
auth configをセットアップし、configをリモートソースにアタッチする必要があります。これは他のすべての答えのハイブリッドのようなものですが、私にとってはすべてが何らかの形で失敗しました。
IAMインスタンスの役割がaws-elasticbeanstalk-ec2-role
であると仮定します:
BeanstalkIAMユーザーを許可するようにAWSバケットを設定します。 「バケットポリシー」を編集します。
{
"Version": "2012-10-17",
"Id": "BeanstalkS3Copy",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "<beanstalk_iam_role_arn>"
},
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:GetObjectVersion",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<bucket_name>",
"arn:aws:s3:::<bucket_name>/*"
]
}
]
}
どこ:
beanstalk_iam_role_arn=完全修飾インスタンスIAMロール。可能な場合は、実行中のインスタンスに関連付けられている「IAMロール」を参照するか、環境構成を参照してください。例:
arn:aws:iam::12345689:role/aws-elasticbeanstalk-ec2-role
bucket_name=バケット名
.ebextension/myconfig.config
に、IAMインスタンスユーザーを使用するS3認証ブロックを追加します。
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["bucket_name"]
roleName:
"Fn::GetOptionSetting":
Namespace: "aws:asg:launchconfiguration"
OptionName: "IamInstanceProfile"
DefaultValue: "aws-elasticbeanstalk-ec2-role"
bucket_nameを適切に設定します
リモートファイルを定義し、S3認証ブロックを添付します。
"/etc/myfile.txt" :
mode: "000400"
owner: root
group: root
authentication: "S3Auth" # Matches to auth block above.
source: https://s3-eu-west-1.amazonaws.com/mybucket/myfile.txt
source URLを適切に設定します
Chaseadamsioの回答と同様に、S3リソースにアクセスするポリシーを使用してEC2インスタンスに与えられたロールを設定し、プリインストールされたAWSCLIユーティリティを使用してファイルを移動できます。
私がこれにアプローチした方法は、特定のEBアプリケーション専用のロールを作成し、次のようなポリシーを添付することです。
"Statement": [
{
"Sid": "<sid>",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<your_bucket_path>/*"
]
}
]
これにより、インスタンスにアクセスできるようになり、ファイルを取得するには、次のような「コマンド」ブロックを構成に追加します。
commands:
01-get-file:
command: aws s3 cp s3://<your_bucket_path>/your-file.txt /home/ec2-user
02-execute-actions:
[unpack, run scripts, etc..]
もちろん、必要に応じて他のAWSCLIユーティリティを使用できます。これにより、S3アクセスで発生していた多くの問題が解決され、展開がはるかに簡単になることがわかりました。
.ebextensions
構成を設定する代わりに、IAMマネージャー内のaws-elasticbeanstalk-ec2-role
にポリシーを設定する(または、自動スケーリングされたec2インスタンスをサンドボックス化するためにElasticBeanstalk環境専用の新しいロールを作成する)。
これを行うには、Webコンソール内のIAMマネージャーに移動し、左側の[ロール]をクリックします。ロールのリストにインスタンス名が表示されているはずです。それをクリックすると、その特定のロールの管理ページに移動します。 「Permissions」の下のロールに新しいロールポリシーを添付し、ec2にアクセス許可を与えるものと一致するポリシードキュメントを作成します(この場合、_MyBucket
というs3バケットにアクセスするためのポリシーを指定します。 .ebextensions
設定のResources
セクションは不要になります。
ファイルにアクセスするように構成されたマシンのIAMロールがある場合は、.ebextensions
で次の操作を実行できます。
commands:
01a_copy_file:
command: aws s3 cp s3://bucket/path/file /destination/