とある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を使いこなせるようになると非常に便利。
0 件のコメント:
コメントを投稿