AWSElasticBeanstalk環境でNode.jsサンプルアプリを作成、S3バケットへの接続をしたところ、Error Access Denied となり接続できません。接続するにはアクセスキーのほかにバケットポリシーを適切に許可する必要がありました。
ひと頃流行った「アイスバケツチャレンジ」とはこのことだったのか・・・・。
冗談はさておき、AWSのストレージPaaSとして「S3」が無料トライアルで利用可能だったのでテキストの通り、アクセスキーを [ElasticBeanstalk] – [環境] – [設定] – [ソフトウェア] から設定しましたが表題の件でエラーが出ます。
パブリックアクセスを[公開]にして[ポリシーの編集]から 必要なIAMユーザーのARN(Amazon Resource Name)とS3バケットARN, EC2RoleのARNを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PolicyForAllowUploadWithACL",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/myusername"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::s3-sample-bucket-name/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "PolicyForAllowUploadWithEC2-role",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:role/aws-elasticbeanstalk-ec2-role"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::s3-sample-bucket-name/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
IAMから[aws-elasticbeanstalk-ec2-role] に下記ポリシーを追加。
これで無事、アップロードした画像がS3バケットに保存できるようになりました。
参考URL: Bucket policy examples – Amazon Simple Storage Service

