他の 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」(PutObject オペレーションを呼び出すときにエラー (AccessDenied) が発生しました: アクセスが拒否されました) というエラーメッセージが表示されます。
バケット内にある、他のアカウントが所有する既存のオブジェクトについては、オブジェクトの所有者が 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 ACL を使用してアップロードされた新しいオブジェクトは、バケットのアカウントによって自動的に所有されます。
関連情報
別の AWS アカウントによって私の Amazon S3 バケットへアップロードされたオブジェクトにアクセスする方法を教えてください。
バケット所有者はフルコントロール権限を持ちながら、オブジェクトをアップロードするクロスアカウントアクセス許可を付与する
IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任
ACL 許可とアクセスポリシーの許可のマッピング