他の AWS アカウントが私の Amazon S3 バケットにオブジェクトをアップロードするときに、それらのアカウントがオブジェクトの完全なコントロールを私に付与することを義務付けるにはどうすればよいですか?

最終更新日: 2021 年 1 月 5 日

他の 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 を使用してアップロードされた新しいオブジェクトは、バケットのアカウントによって自動的に所有されます。