
この記事[0]で説明されているように、私が勤務する会社では、要塞AWSアカウントを使用してIAMユーザーと他のAWSアカウントを保存し、異なる実行環境(本番環境、開発環境など)を分離しています。これが重要な理由は、複数のAWSアカウントがあり、いくつかの特殊なケースではこれらのAWSアカウントが単一のS3バケットにアクセスする必要があるためです。
これを正しく機能させるには、特定の AWS アカウントの VPC から S3 エンドポイントのバケットへのアクセスを許可するバケットポリシーを設定します。
バケットポリシー
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" } } }
ロールのロールポリシー
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では、dev
AWSアカウントはオブジェクトを読み取ることができますが、別のAWSアカウント(たとえば)prod
はない「受領者」として追加されるまで、オブジェクトを読み取ることはできません。
私の質問:個々のオブジェクトごとに ACL を設定せずに、複数の AWS アカウントから S3 バケットにオブジェクトを読み書きする方法はありますか?
注: s3a を使用して s3 に書き込むには、spark を使用します。
答え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 をより適切に処理する方法を提供してくれることを期待しています。