コンマ

メモ代わりにアウトプットしています。何か不備がありましたら、お気軽にコメント頂けると有り難いです。

【AWS】S3を別AWSアカウントに移管する方法

 TL;DR

S3を別AWSアカウントに移管する方法を記載しています。

関連情報

以下を参考にしました。

aws.amazon.com

dev.classmethod.jp

aws.amazon.com

上記によると

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のバケット名>"
            ]
        }
    ]
}

こんな感じで変えてみます。 f:id:koooosuke:20190423215921p:plain

3.続いて、コピー先のバケットを作成しておきます。(destination-resource)

f:id:koooosuke:20190423220816p:plain

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": "*"
        }
    ]
}

5.以下のAWS CLIのコマンドを実行

$ 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

これでなんとかコピーされました!