AWS Datasyncを使ってクロスアカウントでのS3バケットコピー

2023/06/04

AWS

t f B! P L

とあるAWSアカウント上のS3バケットのオブジェクトを

別のAWSアカウントのS3バケットへコピーする必要が出てきたら?


AWS Datasyncを使えば簡単にできます。

しかもスケジュール実行で差分コピーもできるので、データ移行が超簡単。


AWS CLIでオブジェクトを一旦ダウンロードして、移行先S3へアップロードとかする必要も無し。

詳しい手順はAWSのサイトに載っているけど、クラメソさんのほうが分かりやすいw

https://repost.aws/ja/knowledge-center/datasync-transfer-cross-account-s3

https://dev.classmethod.jp/articles/aws-datasync-cross-account-s3-location-data-transfer/


イメージはこんな感じ。

移行先のアカウントでほとんど作業する。



というわけで、実際にやってみました。


①(アカウントA)移行元S3バケットの用意

移行元バケットおよびオブジェクトの用意。バケットの設定はデフォルトでOK。

あとでバケットポリシーを設定する。

今回は「account-a-sourcebucket」という名前のバケットにしますた。


②(アカウントB)移行先S3バケットの用意

移行元バケットの用意。バケットの設定はデフォルトでOK。

バケット名は「account-b-destbucket」という名前に。


③(アカウントB)DataSync用IAMロール、ポリシーを作成

アカウントBでIAMロールを2種類作成。同様にポリシーも作成が必要。

  • datasync-config-role(Datasync設定で使用)
  • datasync-transfer-role(Datasyncロケーション作成時に使用)

IAMコンソール → ポリシー → ポリシーを作成

それぞれポリシーのコードは以下。

ポリシー名:datasync-config-policy(datasync-config-roleに相当するポリシー)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::account-b-destbucket(送信先バケット)"
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::account-b-destbucket(送信先バケット)/*"
        }
    ]
}

同様に2つ目のポリシーも作成。

ポリシー名:datasync-transfer-policy(datasync-transfer-roleに相当するポリシー)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::account-a-sourcebucket(送信元バケット)"
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::account-a-sourcebucket(送信元バケット)/*"
        }
    ]
}

2つのポリシーを作ったら、IAMロールの作成。

IAMコンソール → ロール → ロールを作成

信頼されたエンティティタイプでは「カスタム信頼ポリシー」で以下をコピペすると、先ほど作ったポリシーを選ぶことができる。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "datasync.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

こんな感じでIAMロールを作成。


同様に「datasync-transfer-role」も作成。


2つのIAMロールおよびポリシーが作成できたらOK。


④(アカウントB)S3ロケーション作成時のPrincipal情報を確認

アカウントBにログインしている状態で、AWS CLIやCloudshellから以下のコマンドを実行する。

aws sts get-caller-identity


出力された"Arn"をメモしておく。


⑤(アカウントA)S3バケットポリシー設定

S3バケット → アクセス許可 → バケットポリシー編集より以下のコードを追加。

アカウントBで作成した③のIAMロールや④のPrincipal情報等をS3バケットポリシーに追記する。


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::送信先アカウント:role/datasync-config-role",
                    "arn:aws:iam::送信先アカウント:role/datasync-transfer-role"
                ]
            },
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": "arn:aws:s3:::account-a-sourcebucket(送信元バケット)"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::送信先アカウント:role/datasync-config-role",
                    "arn:aws:iam::送信先アカウント:role/datasync-transfer-role"
                ]
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:PutObjectTagging",
                "s3:GetObjectTagging",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::account-a-sourcebucket(送信元バケット)/*"
        },
        {
            "Sid": "DataSyncCreateS3Location",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:sts::送信先アカウント:user/ユーザー名"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::account-a-sourcebucket(送信元バケット)"
        }
    ]
}

⑥(アカウントB) 送信元ロケーション作成

DataSyncの送信元S3ロケーションを作成する。

ただし、GUIコンソールからでは作成できないので、AWS CLIで作成する。

aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::account-a-sourcebucket(送信元バケット) --s3-storage-class STANDARD --s3-config BucketAccessRoleArn="arn:aws:iam::送信先アカウント:role/datasync-transfer-role" --region ap-northeast-1

すると以下のような結果が返ってくる。

{
    "LocationArn": "arn:aws:datasync:ap-northeast-1:送信先アカウント:location/loc-XXXXXXXXXXXXX"
}

アカウントBのDataSyncのロケーションにも表示されている。


⑦(アカウントB) 送信先ロケーション作成

DataSyncの送信先S3ロケーションを作成する。

こちらはGUIコンソールで作成可能。

DataSycn → ロケーション → ロケーションを作成する


ロケーションタイプ:S3

S3バケット:account-b-destbucket(送信先バケット)

IAMロール:datasync-config-role

他はデフォルトでOK。


送信先ロケーションが作成された。


⑧(アカウントB) DataSyncタスク作成、実行

これで最後。DataSyncの同期タスクを作成。

DataSycn → タスク → タスクを作成する


送信元のロケーションを設定。


送信先のロケーションを設定。


タスク名:適当

タスク実行設定:デフォルト


データ転送設定:「削除されたファイルを保持する」のチェックを外す

スケジュール:任意


タスクのログ記録:CloudWatch Logグループを自動生成


作成されたタスクを試しに手動実行してみる。

開始 → デフォルトから開始する


しばらく待つと、タスクの履歴に実行結果が表示される。

ステータスが「成功」と表示されればOK。


送信先S3バケットにも同じオブジェクトがあるはず。


あとはDataSyncのタスクでスケジュール実行を設定すれば

定期的に差分コピーが行われるようになる。


設定自体はややこしいかもしれないが、内容を理解すれば簡単

ポイントはDataSyncで作成したロールやアカウント情報を送信元のS3バケットポリシーに登録すればいいってことかな。

同じようにすれば、送信元のDataSyncを設定してクロスアカウントでコピーということもできるんじゃないかと。


DataSyncの課金は設定を行った側(今回であればアカウントB)に課金されるので

どちらでDataSyncを実行するかは状況次第。

当たり前だけど同じAWS同士なのでコピー速度も超高速。

内容さえ理解して、一度設定すればあとは勝手にコピーしてくれるので

定期的にS3オブジェクトのコピーを行いたい時とかはDataSyncはすごく楽。

また、S3からEFSなどの別タイプのストレージにもコピーができるので

DataSyncを使いこなせるようになると非常に便利。

検索

Blog Archive

Popular Posts

About Me

自分の写真
性別:男
年齢:ついに40over
趣味:Snowboard、パソコン、iPhone、子育て

仕事:ユー子の社内SEとしてサーバ、NW等のインフラ全般をやってます

日々生活していく中で思ったことなどをつらつらと書いていきます。

どうぞよろしく!

ブログランキング

ブログランキング・にほんブログ村へ

QooQ