どうやってbucket-owner-full-control ACL を Amazon S3 内のオブジェクトに追加するんですか?

最終更新日: 2021 年 12 月 10 日

bucket-owner-full-control アクセスコントロールリスト (ACL) を Amazon Simple Storage Service (Amazon S3) 内の存在するオブジェクトに追加してみます。これを行うにはどうすればよいですか?

簡単な説明

デフォルトでは、他の AWS アカウントが Amazon S3 バケットにオブジェクトをアップロードするクロスアカウントシナリオでは、オブジェクトはアップロードするアカウントによって所有されたままになります。bucket-owner-full-control ACL が追加されると、バケット所有者は、他のアカウントによって書き込まれた新しいオブジェクトをすべて完全に制御できるようになります。

オブジェクト作成者がオブジェクト ACL レベルでターゲットアカウントのアクセス許可を指定しない場合、ターゲットアカウントはオブジェクトを削除することしかできません。

Bucket-owner-full-control ACL を追加すると、バケット所有者は、他の AWS アカウントによって書き込まれた新しいオブジェクトをすべて完全に制御できるようになります。この ACL は、対象バケットが S3 オブジェクト所有権を有効することも必要です。S3 オブジェクト所有権が有効な場合、新しいオブジェクトの所有者が対象アカウントに更新します。

重要:バケットおよびオブジェクト ACL によるクロスアカウントアクセスを付与することは、S3 オブジェクトの所有権が [Bucket Owner Enforced] に設定されているバケットでは機能しません。ほとんどの場合、ACL はオブジェクトやバケットにアクセス権限を付与するために必要がありません。代わりに、AWS Identity Access and Management (IAM) 施策と S3 バケット施策を使用して、オブジェクトとバケットにアクセス許可を付与します。

既存のオブジェクトの場合、オブジェクト所有者は、オブジェクトの ACL を更新することで、バケット所有者にオブジェクトのフルコントロールを付与することができます。新しいオブジェクトを書き込む場合、PUT または COPY オペレーションで bucket-owner-full-control ACL を指定できます。

アカウント A のユーザーがアカウント B のオブジェクトに bucket-owner-full-control 既定 ACL を付与するために、次のアクセス許可を付与する必要があります。

  • アカウント A の IAM ロールまたはユーザーは、アカウント B のバケットにアクセスを付与する必要があります
  • アカウント B のバケット施策は、アカウント A の IAM ロールまたはユーザーにアクセスを付与する必要があります

次の方法でオブジェクトへの bucket-owner-full-control アクセスを付与することができます。

  • 既定 ACL
  • S3 バッチ操作 (大規模なバッチ操作用)

注: bucket-owner-full-control 既定 ACL を S3 オブジェクトに追加するときは、VPC エンドポイントポリシーを必ず確認してください。

解決方法

アカウント A の IAM ロールまたはユーザーは、アカウント B のバケットにアクセスを付与する必要があります

注: アップロード時に IAM ユーザーまたはロールがオブジェクトの ACL を更新する必要がある場合、ユーザーの IAM 施策の s3:PutObjectAcl にアクセス許可が必要です。

アカウント A で IAMロールを作成します。ロール/ユーザーにアカウント B のオブジェクトで PutObjectAcl を実行するアクセス許可を付与します。

次の施策の例は、アカウント B のオブジェクトに対して GetObjectPutObject、および PutObjectAcl アクションを実行するアクセス許可をアカウント A の IAM ロールに付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountB-Bucket/*"
        }
    ]
}

アカウント B のバケットは、アカウント A の IAM ユーザーまたはにアクセス許可を付与する必要があります。

バケットポリシーは、オブジェクトのアップロード時の既定 ACL の要件に応じて異なる場合があります。例えば、次の 2 つのバケットポリシーでは、アカウント A の IAM ユーザーまたはロールにアクセスを付与する方法が異なります。

  • ポリシー 1: Amazon S3 PUT オペレーションにバケット所有者フルコントロールの既定 ACL を含める必要なくアカウント A の IAM ユーザーまたはロールにアクセスを許可します。
  • ポリシー 2: すべての Amazon S3 PUT オペレーションで bucket-owner-full-control 既定 ACL を含める必要があります。

施策 1: Amazon S3 PUT オペレーションにbucket-owner-full-control既定 ACL を含める必要なくアカウント A の IAM ユーザーまたはロールにアクセスを許可します

ACL なしでアカウント A の IAM ロールにアクセスを許可するには、アカウント B (オブジェクトがアップロードされる場所) にバケット施策を作成します。このバケット施策では、アカウント A の IAM ロールまたはユーザーにアクセス許可を付与する必要があります。次のバケット施策では、アカウント B のオブジェクトに対する GetObjectPutObject、および PutObjectACL アクションがアカウント A のロールに許可されます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::AccountB-Bucket/*"
            ]
        }
    ]
}

第 2施策: すべての Amazon S3 PUT オペレーションで bucket-owner-full-control 既定 ACL を含めることに強行します

次のバケットポリシーでは、アカウント A のユーザーまたはロールがアカウント B (オブジェクトをアップロードする場所) のバケットにオブジェクトをアップロードできることが指定されます。アップロードは、オブジェクトの ACL が「bucket-owner-full-control」に設定されている場合にのみ実行できます。例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Only allow writes to my bucket with bucket owner full control",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::AccountA:role/AccountARole"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountB-Bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

注: 前述のバケット施策が適用する場合、ユーザーは PutObject オペレーションで bucket-owner-full-control 既定 ACL を含める必要があります。そうでない場合、オペレーションが失敗し、アクセス拒否エラーを発生します。Amazon S3 が他の AWS アカウントのオブジェクト所有権をどのように有効にするかについては、S3 のオブジェクトの所有権を使用したアップロードされたオブジェクトの所有権を管理するを参照してください。

bucket-owner-full-control アクセスを付与する

既定 ACL

オブジェクトのアップロード時に bucket-owner-full-control 既定 ACL を付与するには、アカウント A (オブジェクト所有者のアカウント) から put-object コマンドを実行します。

aws s3api put-object --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

コピーオペレーションで bucket-owner-full-control 既定 ACL を付与するには、アカウント A (オブジェクト所有者のアカウント) から copy-object コマンドを実行します。

aws s3api copy-object --copy-source accountA-bucket/example.txt --key example.txt --bucket accountB-bucket --acl bucket-owner-full-control

アカウント A から cp コマンドを実行して、bucket-owner-full-control 既定 ACL を付与することもできます。

aws s3 cp s3://accountA-bucket/test.txt s3://accountB-bucket/test2.txt --acl bucket-owner-full-control

複数のオブジェクトのコピーオペレーションの場合は、オブジェクト所有者 (アカウント A) は次のコマンドを実行できます。

aws s3 cp s3://accountA-bucket/ s3://accountB-bucket/ --acl bucket-owner-full-control --recursive

オブジェクトが別のアカウント(アカウントB)のバケットに既存の場合、オブジェクト所有者は、次のコマンドでバケット所有者アクセス許可を付与できます。

aws s3api put-object-acl --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

S3 バッチ操作

多くの Amazon S3 オブジェクトに bucket-owner-full-control 既定 ACL を追加するには、S3 バッチ操作を使用します。S3 バッチ操作では、指定したオブジェクトのリストに対して 1 つのオペレーションを実行できます。S3 バッチ操作を使用して、多数のオブジェクトに ACL を設定することもできます。S3 バッチ操作は、事前定義されたアクセス許可セットと共に Amazon S3 が提供するカスタム ACL と既定 ACL をサポートします。

注: アクセスコントロールリスト (ACL) の置換オペレーションでは、マニフェストにリストされているすべてのオブジェクトの Amazon S3 ACL が置き換えられます。

その他の考慮事項

アクセスがVPC エンドポイント施策に許可される

IAM 担当が、Virtual Private Cloud (VPC) エンドポイントを経由してルーティングされるインスタンスを使用して S3 にオブジェクトをアップロードする場合は、VPC エンドポイント施策を確認してください。たとえば、VPCでAmazon Elastic Compute Cloud(Amazon EC2)インスタンスを使用してオブジェクトをS3にアップロードする場合は、そのVPCエンドポイント施策を確認する必要があります。次のように、エンドポイント施策が PutObjectAcl アクションへにアクセス許可を付与していることを確認してください。

{
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountB-Bucket/*"
        }
    ]
}

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?