他の AWS アカウントのユーザーが私の Amazon Simple Storage Service (Amazon S3) バケットにオブジェクトをアップロードできるようにしたいと考えています。ただし、そのユーザーが私にそのオブジェクトの完全なコントロール権限を付与するように要求したいと考えています。
解決策
ユーザーがバケットにオブジェクトをアップロードするときに、bucket-owner-full-control アクセスコントロールリスト (ACL) を含めるようにユーザーに求めるバケットポリシーを追加します。
例えば、以下のバケットポリシーは、オブジェクトの ACL がbucket-owner-full-control に設定されている場合にのみ、ExampleUser がオブジェクトを DOC-EXAMPLE-BUCKET にアップロードできるように指定しています。
{
"Id": "Policy1541018284691",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1541018283275",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
},
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:user/ExampleUser"
]
}
}
]
}
このバケットポリシーを追加した後、ユーザーは次のように、必要な ACL をアップロードリクエストの一部として含める必要があります。
aws s3 cp example.jpg s3://DOC-EXAMPLE-BUCKET --acl bucket-owner-full-control
ユーザーがアップロードリクエストに必要な ACL を含めていない場合は、次のエラーメッセージが表示されます。
「An error occurred (AccessDenied) when calling the PutObject operation: Access Denied」
バケット内にある、他のアカウントが所有する既存のオブジェクトについては、オブジェクトの所有者が put-object-acl コマンドを実行してお客様に完全なコントロールを付与することができます。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key example.jpg --acl bucket-owner-full-control
bucket-owner-full-control ACL は、バケット所有者に対し、別のアカウントによってアップロードされたオブジェクトへの完全なアクセス権を付与します。ただし、この ACL だけではオブジェクトの所有権を付与しません。bucket-owner-full-control ACL を使用してアップロードされたオブジェクトの所有権を自動的に取得するには、S3 オブジェクト所有権をバケット所有者が優先されるように設定します。S3 オブジェクトの所有権を更新すると、bucket-owner-full-control を使用してアップロードされた新しいオブジェクトは、バケットの所有者によって自動的に所有されます。
関連情報
別の AWS アカウントにより自分の Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?
定型の ACL を使ったバケットの管理
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任
ACL アクセス許可とアクセスポリシーのアクセス許可のマッピング