【AWS】S3を別AWSアカウントに移管する方法
TL;DR
S3を別AWSアカウントに移管する方法を記載しています。
関連情報
以下を参考にしました。
上記によると
AWS アカウント間で Amazon S3 リソースを移管することはできません。その代わり、1 つのアカウントから別のアカウントに Amazon S3 オブジェクトをコピーし、コピーされたオブジェクトの所有権を移管先アカウントに付与することができます。
とのことなので、S3オブジェクトをコピーして、別アカウントに同期するイメージでできそうです。
やってみます。
1.まず、コピー先のAWSアカウントID番号を取得しておきます。
※マイアカウント>アカウントIDとかに書いてあるやつです。
2.コピー元アカウントから、コピー先アカウントがオブジェクトを取得できるように以下のポリシーをコピー元のバケットにアタッチします。
※<コピー先のAWSアカウントID番号>と<コピー元のS3のバケット名>の部分は修正しますmm
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": {"AWS": "<コピー先のAWSアカウントID番号>"}, "Action": ["s3:ListBucket","s3:GetObject"], "Resource": [ "arn:aws:s3:::<コピー元のS3のバケット名>/*", "arn:aws:s3:::<コピー元のS3のバケット名>" ] } ] }
こんな感じで変えてみます。
3.続いて、コピー先のバケットを作成しておきます。(destination-resource)
4.次にコピー先アカウントのユーザーを作成して、以下を参考にポリシーをアタッチします。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::<コピー元のS3のバケット名>", "arn:aws:s3:::<コピー元のS3のバケット名>/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::<コピー先のS3のバケット名>", "arn:aws:s3:::<コピー先のS3のバケット名>/*" ] } ] }
自分の場合、こんな感じになっています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::original-resource", "arn:aws:s3:::/original-resource/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::destination-resource", "arn:aws:s3:::destination-resource/*" ] } ] }
で、なぜかアクセス拒否されてしまうので、一旦ポリシーをフルアクセスにに変更しました。(解決したら修正します。)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }
$ aws s3 sync s3://original-resource s3://destination-resource copy: s3://original-resource/terraform.json to s3://destination-resource/terraform.json copy: s3://original-resource/test/iOS の画像.jpg to s3://destination-resource/test/iOS の画像.jpg
これでなんとかコピーされました!