別の AWS アカウントから S3 オブジェクトをコピーするにはどうすればよいですか。

最終更新日: 2022 年 10 月 25 日

Amazon Simple Storage Service (Amazon S3) オブジェクトを AWS アカウント間でコピーしたいです。コピー先アカウントが、コピーされたオブジェクトを所有するようにしたいと考えています。どうすればそれができますか?

解決方法

重要:S3 内のオブジェクトは、アップロードした AWS アカウントによって常に自動的に所有されるわけではありません。オブジェクトの所有権を変更する場合は、[Bucket owner enforced] 設定を使用することがベストプラクティスです。ただし、このオプションでは、すべてのバケット ACL と、バケット内のすべてのオブジェクトの ACL が無効になります。

S3 Object Ownerships で [Bucket owner enforced] が適用された設定により、Amazon S3 バケット内のすべてのオブジェクトをバケット所有者が所有できるようになりました。[Bucket owner enforced] 機能では、すべてのアクセスコントロールリスト (ACL) も無効化されるため、S3 に保存されているデータのアクセス管理が簡素化されます。ただし、既存のバケットの場合、ACL を明示的に無効にしない限り、Amazon S3 オブジェクトはアップロードした AWS アカウントが引き続き所有します。

既存のオブジェクト共有方法が ACL の使用に依存している場合は、ACL を使用してオブジェクトにアクセスするプリンシパルを特定します。ACL を無効にする前にアクセス許可を確認する方法の詳細については、「ACL を無効にするための前提条件」を参照してください。

ACL を無効にできない場合は、バケットポリシーを調整できるようになるまで、以下のステップに従ってオブジェクトの所有権を取得します。

1.    ソースアカウントで、AWS Identity and Access Management (IAM) カスタマー管理ポリシーを作成します。このポリシーは、IAM ID (ユーザーまたはロール) に適切なアクセス許可を付与します。IAM ユーザーは、ソースバケットからオブジェクトを取得し、コピー先バケットにオブジェクトを戻すためのアクセス権が必要です。次のような IAM ポリシーを使用できます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ]
    }
  ]
}

注: この IAM ポリシーの例には、オブジェクトを一覧表示したり、異なるアカウントのバケット間でオブジェクトをコピーしたりするのに最低限必要なアクセス許可のみが含まれています。ユースケースに応じて、許可された S3 アクションをカスタマイズする必要があります。例えば、ユーザーがオブジェクトタグを持つオブジェクトをコピーする必要がある場合は、s3:GetObjectTagging のアクセス許可も付与する必要があります。エラーが発生した場合は、管理者ユーザーとして次の手順を実行してください。

2.    ソースアカウントで、コピー先バケットへのオブジェクトのコピーに使用する IAM ID にカスタマー管理ポリシーをアタッチします

3.    コピー先アカウントで、コピー先バケットの S3 オブジェクトの所有権をバケット所有者が優先されるように設定しますS3 オブジェクトの所有権を設定すると、アクセスコントロールリスト (ACL) が bucket-owner-full-control に設定されている状態でアップロードされた新しいオブジェクトは、バケットのアカウントによって自動的に所有されます。

4.    コピー先アカウントで、コピー先バケットのバケットポリシーを変更し、ソースアカウントにオブジェクトをアップロードするためのアクセス許可を付与します。さらに、バケットポリシーにオブジェクトのアップロードを必要とする条件を含め、ACL を bucket-owner-full-control に設定します。次のようなステートメントが使えます。

注: destination-DOC-EXAMPLE-BUCKET をコピー先バケットの名前に置き換えます。次に、arn:aws:iam::222222222222:user/Jane を、ソースアカウントの IAM ID の Amazon リソースネーム (ARN) に置き換えます。

{
  "Version": "2012-10-17",
  "Id": "Policy1611277539797",
  "Statement": [
    {
      "Sid": "Stmt1611277535086",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:user/Jane"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    },
    {
      "Sid": "Stmt1611277877767",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:user/Jane"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
    }
  ]
}

注: このバケットポリシーの例には、必要な ACL を持つオブジェクトをアップロードするために最低限必要なアクセス許可のみが含まれています。ユースケースに応じて、許可された S3 アクションをカスタマイズする必要があります。例えば、ユーザーがオブジェクトタグを持つオブジェクトをコピーする必要がある場合は、s3:GetObjectTagging のアクセス許可も付与する必要があります。

5.    IAM ポリシーとバケットポリシーを設定した後、ソースアカウントの IAM ID は、オブジェクトをコピー先バケットにアップロードする必要があります。ACL が bucket-owner-full-control に設定されていることを確認します。例えば、ソース IAM ID は、--acl オプションを指定して cp AWS CLI コマンドを実行する必要があります。

aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

S3 オブジェクトの所有権をバケット所有者優先に設定すると、bucket-owner-full-control ACL でアップロードされたオブジェクトは、コピー先バケットのアカウントによって自動的に所有されます。

重要: S3 バケットで AWS Key Management Service (AWS KMS) を有効にしたデフォルトの暗号化がある場合は、AWS KMS キーのアクセス許可も変更する必要があります。手順については、「Amazon S3 バケットにカスタム AWS KMS キーを使用したデフォルトの暗号化があります」を参照してください。ユーザーにバケットからのダウンロードとバケットへのアップロードを許可するにはどうすればよいですか?