S3 クロスアカウントバケット権限

S3 クロスアカウントバケット権限

この記事[0]で説明されているように、私が勤務する会社では、要塞AWSアカウントを使用してIAMユーザーと他のAWSアカウントを保存し、異なる実行環境(本番環境、開発環境など)を分離しています。これが重要な理由は、複数のAWSアカウントがあり、いくつかの特殊なケースではこれらのAWSアカウントが単一のS3バケットにアクセスする必要があるためです。

これを正しく機能させるには、特定の AWS アカウントの VPC から S3 エンドポイントのバケットへのアクセスを許可するバケットポリシーを設定します。

  1. バケットポリシーdata-warehouse

    {
        "Sid": "access-from-dev-VPCE",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::data-warehouse",
            "arn:aws:s3:::data-warehouse/*"
        ],
        "Condition": {
            "StringEquals": {
                "aws:sourceVpce": "vpce-d95b05b0"
            }
        }
    }
    
  2. ロールのロールポリシーEMRRole

     {
        "Sid": "AllowRoleToListBucket",
        "Effect": "Allow",
        "Action": "s3:ListBucket",
        "Resource": [
            "arn:aws:s3:::data-warehouse",
        ]
    },
    {
        "Sid": "AllowRoleToGetBucketObjects",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:GetObjectVersion"
        ],
        "Resource": "arn:aws:s3:::data-warehouse/*"
    }
    

残念ながら、ACLを明示的に設定しないと機能しません。各オブジェクトアクセス元の AWS アカウントの所有者にそのオブジェクトへのフルコントロールを許可します。これを行わないと、次のようになります。

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

これを実行しているインスタンス (EMR) には正しいロールがあります。

[hadoop@ip-10-137-221-91 tmp]$  aws sts get-caller-identity
{
    "Account": "1234567890",
    "UserId": "AROAIGVIL6ZDI6SR87KXO:i-0eaf8a5ca52876835",
    "Arn": "arn:aws:sts::1234567890:assumed-role/EMRRole/i-0eaf8a5ca52876835"
}

バケット内のオブジェクトの ACL はdata-warehouse次のようになります。

aws s3api get-object-acl --bucket=data-warehouse --key=content_category/build=2017-11-23/part0000.gz.parquet
{
    "Owner": {
        "DisplayName": "aws+dev",
        "ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "aws+dev",
                "ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

上記のACLでは、devAWSアカウントはオブジェクトを読み取ることができますが、別のAWSアカウント(たとえば)prodない「受領者」として追加されるまで、オブジェクトを読み取ることはできません。

私の質問:個々のオブジェクトごとに ACL を設定せずに、複数の AWS アカウントから S3 バケットにオブジェクトを読み書きする方法はありますか?

注: s3a を使用して s3 に書き込むには、spark を使用します。

[0]https://engineering.coinbase.com/you-need-more-than-one-aws-account-aws-bastions-and-assume-role-23946c6dfde3

答え1

オブジェクトごとに ACL を設定する方法は見つかりませんでしたが、バケットポリシーを使用してアップロード時に ACL が正しく設定されるよう強制する方法はあります。このポリシー例では、AWS アカウントがオブジェクトをバケットにアップロードできるようにし、バケット所有者にアップロードされたすべてのオブジェクトに対する完全な制御権を付与することを要求する方法を示しています。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowSourceAccount0123456789ToPutObjects",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::0123456789:root"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::data-warehouse/*"
    },
    {
        "Sid": "RequireAllUploadedObjectsToAssignFullControlToBucketOwner",
        "Effect": "Deny",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::data-warehouse/*",
        "Condition": {
            "StringNotEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control"
            }
        }
    }
]

}

鍵となるのは、明示的な拒否です。これはx-amz-acl: bucket-owner-full-controlヘッダーをチェックし(Michael-sqlbotがコメントで言及)、これが設定されていないアップロードは失敗します。AWS CLIを使用してファイルをアップロードする場合、--acl バケット所有者フルコントロール設定するフラグ。

例:

aws s3 cp example-file.txt s3://data-warehouse/example-file.txt --profile aws-profile-name --acl bucket-owner-full-control

できれば、AWS が将来的に ACL をより適切に処理する方法を提供してくれることを期待しています。

関連情報