megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

S3バケットを別アカウントへ移設

ダウンタイムなしにS3のアカウントを移設したかったのですが、巷の情報では1回のみのsyncで済ませており、ちょっと困ったので備忘録。

他との違いとしてはs3:GetObjectTaggingの追加がかなめ。

手順

移設用IAMユーザー

移設先のアカウントで以下のポリシーを持ったユーザーを作成してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::from-bucket",
                "arn:aws:s3:::from-bucket/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::to-bucket",
                "arn:aws:s3:::to-bucket/*"
            ]
        }
    ]
}

configureの登録

後程aws cliで同期を行うので、作成したIAMユーザーのconfigureを登録しておいてください。

$ aws configure --profile s3-sync-profile

移設元バケットポリシー

移設元のバケットポリシーに下記jsonを設定してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/sync-user"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::from-bucket/*",
                "arn:aws:s3:::from-bucket"
            ]
        }
    ]
}

移設実行

$ aws s3 sync s3://from-bucket/ s3://to-bucket/ --profile s3-sync-plofile

s3:GetObjectTagging

これがない場合、2回目のsyncでAn error occurred (AccessDenied) when calling the GetObjectTagging operation: Access Deniedが発生して差分をsync出来ませんでした。
要注意!

備考

aws s3 syncは差分のみコピーしてくれます。
なのでまず最初に実行し、その後サービス側のS3の向き差を変更、再度aws s3 syncを実行すれば影響範囲を最小に移設が可能です。
ただしすごく活発なサービスや、少しの問題が発生することは許されない、ということであれば、しっかりメンテ時間をとりませう。