他アカウントからのS3アクセスを許可する(バケットポリシー利用)

2019-08-14

前提条件

  • S3バケットに対して同一のAWSアカウントのEC2からはアクセスできるが、他アカウントのEC2からはアクセスできないという場合(下記エラーメッセージのサンプル)の対処方法です。

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
  • 他アカウントのEC2には、あらかじめ適切なIAMポリシー/ロールが割り当てられていることが前提です。IAMポリシーの書き方は、下記記事を参照ください。
  • 他アカウントからのAWSリソースの利用にはAssume Roleを利用する方法もありますが、Assume Roleは両アカウントからの設定が必要になり、少し難易度が上がります。そのため、今回は、S3バケットのバケットポリシーで対応しています。

設定1(S3 アクセス権限の設定)

  • S3バケットのアクセス権限の設定より、他アカウントの正規IDを登録し、読み取り/書き込み権限を付与します。

設定2(S3バケットポリシー)

  • 以下、S3バケットのバケットポリシーに記載するサンプルです。”Principal”にAWSアカウントのアカウント番号を記載することで、他アカウントからのアクセスを許可する方法です。”111111111111″にはアカウント番号を記載ください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3-bucket-name/*",
                "arn:aws:s3:::s3-bucket-name"
            ]
        }
    ]
}
 
  • 下記のように、複数のアカウント番号を指定することも可能です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "111111111111",
                    "222222222222"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::s3-bucket-name/*",
                "arn:aws:s3:::s3-bucket-name"
            ]
        }
    ]
}

設定3(IAMポリシーのレビュー)

  • IAMポリシーの権限が適切かを再確認します。例えば、自アカウントからの書き込みでは意識しなくても良かったのですが、現在のIAMポリシーに所有者を変更する権限(ACL)が付いていない場合は、ポリシーに追加します。
  • 例えば、下記のActionになります。
 

↓"Resource"を指定する場合に追加するAction
"s3:ObjectOwnerOverrideToBucketOwner",
"s3:PutBucketPublicAccessBlock",
"s3:PutObjectVersionAcl",
"s3:PutBucketAcl",
"s3:PutBucketPolicy",
"s3:DeleteBucketPolicy",
"s3:PutObjectAcl"

↓"Resource"の"*"に追加するAction
"s3:PutAccountPublicAccessBlock"