Amazon Simple Storage Service (Amazon S3) オブジェクトを AWS アカウント間でコピーし、コピー先のアカウントがコピーしたオブジェクトを所有できるようにしたいと考えています。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、必ず AWS CLI の最新バージョンを使用するようにしてください。
**重要:**Amazon S3 のオブジェクトは、必ずしもアップロード元の AWS アカウントによって所有されるわけではありません。S3 オブジェクトの所有権を変更する際は、[バケット所有者の強制] 設定を使用することがベストプラクティスです。ただしこのオプションでは、すべてのバケットのアクセスコントロールリスト (ACL) と、バケット内のすべてのオブジェクトの ACL が無効になります。
S3 オブジェクトの所有権で [バケット所有者の強制] を使用すると、同じバケット所有者が Amazon S3 バケット内のすべてのオブジェクトを自動的に所有することができます。[バケット所有者の強制] 設定では、Amazon S3 に保存されているデータのアクセス管理が簡素化されます。既存のバケットの場合は ACL を明示的に無効にしない限り、アップロード元の AWS アカウントによって S3 オブジェクトが所有されます。
既存の方法で ACL を使用してオブジェクトを共有している場合は、ACL を使用してオブジェクトにアクセスするプリンシパルを特定してください。詳細については、「ACLを無効にする前提条件」を参照してください。
ACL を無効にできない場合は、バケットポリシーを調整できるようになるまで、以下のステップを実行してオブジェクトの所有権を取得してください。
- ソースアカウントで、AWS Identity and Access Management (IAM) カスタマー管理ポリシーを作成します。このポリシーは、IAM アイデンティティ (ユーザーまたはロール) に適切なアクセス許可を付与します。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 のアクセス許可も付与する必要があります。エラーが発生した場合は、管理者ユーザーとして次の手順を実行してください。
- ソースアカウントで、カスタマー管理ポリシーを IAM アイデンティティにアタッチします。
- 宛先アカウントで、宛先バケットの S3オブジェクトの所有権を [希望するバケット所有者] に設定します。ACL を bucket-owner-full-control に設定してアップロードした新しいオブジェクトは、自動的に宛先バケットのアカウントによって所有されます。
- 宛先アカウントで、宛先のバケットポリシーを変更して、ソースアカウントにオブジェクトをアップロードする権限を付与します。さらに、バケットポリシーにオブジェクトのアップロードを必要とする条件を含め、ACL を bucket-owner-full-control に設定します。次の例のようなステートメントを使用できます。
{
"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"
}
]
}
**注:**destination-DOC-EXAMPLE-BUCKET は、宛先バケットの名前に置き換えます。arn:aws:iam::222222222222:user/Jane は、ソースアカウントの IAM アイデンティティの ARN に置き換えてください。
このバケットポリシーの例には、必要な ACL を持つオブジェクトをアップロードするために最低限必要なアクセス許可のみが含まれています。ユースケースに基づいて、許可される S3 アクションをカスタマイズします。
- ソースアカウントの IAM アイデンティティが宛先バケットにオブジェクトをアップロードできるように、ACL を bucket-owner-full-control に設定します。例えば、ソース IAM アイデンティティは、--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
この例では、コマンドによって object.txt ファイルがコピーされています。フォルダ全体をコピーするには、次のコマンドを実行します。
aws s3 cp directory/ s3://bucketname/directory --recursive --acl bucket-owner-full-control
**重要:**S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) バケットで AWS キー管理サービス (AWS KMS)[ が有効になっているデフォルトの暗号化が有効になっている場合は、AWS KMS キー権限も変更する必要があります。手順については、「私の Amazon S3 バケットには、カスタム AWS KMS キーを使用してデフォルトで暗号化されている」を参照してください。ユーザーがそのバケットでダウンロードやアップロードを行えるようにするにはどうすればいいですか?」を参照してください。
関連情報
バケット所有者がクロスアカウントのバケットのアクセス許可を付与する
他の AWS アカウントによってオブジェクトがアップロードされたときに、Amazon S3 バケットのオブジェクトの所有権を変更するにはどうすればよいですか?
リソースベースのポリシーを使用して他のアカウントの Amazon S3 バケットにアクセス権を委任する