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