AWS S3バケットをRegionをまたいで移行する方法
おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。
会社で目の青い同僚に、「この前作ったS3バケットのRegion間違えちゃってた。もぅデータ入れちゃった。いますぐなんとかして。あ、名前は変えないで。(´,,•ω•,,`)」って言われました。(´・∀・` )アラマァ
というわけで今回は、AWSのS3バケットをRegionをまたいで移動する方法ですょ!
全体の流れ
AWS CLIで、Region内のS3バケットの同期(全コピー)はできるのですが、Regionをまたぐコピーは直接できないんですよね。あと、バケットの名前はRegionに関係なく一意でなければならないので、ちょっと厄介。なので、一時的にデータを退避させるS3バケットを作ってやっていく感じになります。具体的には、こんな感じでしょうか。
- 移行先のRegionに一時バケットを作成して、移行元からデータを全コピー
- 移行元のRegionのバケットを削除
- 移行先のRegionに本来のバケットを作成(削除したバケットと同じ名前)
- 移行先のRegion内で一時バケットから本来のバケットにデータを全コピー
- 一時バケットを削除
同じ名前のバケットを登録できるようになるまで(2から3の間)、結構時間がかかる(ちなみにボブの場合は1時間半ぐらい登録できなかった)ので、心とカラダに余裕がある人向けですょ( ³ω³ )
準備
AWS CLIをインストールしてください。もうね、ここにしのごの書くより、AWSさんの素晴らしいドキュメントがありますので、それを見るのがいいと思うの。(´・∀・`)
ぱいそん。pipって、ピーアイピーって読むの?それともピップって読むの?エレキバンなの?
さっそく移行
「貴様は長く生きすぎた。」キャー!ケンシロウ様ぁ!!!!間違って作っちゃったS3バケットに罵声をあびせつつ、やっちまいますよ!щ(°Д゜)゛
移行先(us-east-1)のRegionで一時バケットを作成
$ aws s3 mb s3://<backet_name>-tmp --region us-east-1
移行元(us-west-2)から移行先(us-east-1)の一時バケットへデータを全コピー
ローカルPCを経由させる感じで。。
$ aws s3 cp s3://<backet_name>/ . --recursive --region us-west-2 $ aws s3 cp ./* s3://<backet_name>-tmp --recursive --region us-east-1
移行元(us-west-2)バケットの削除
$ aws s3 rb --force s3://<backet_name> --region us-west-2
「お前はもう死んでいる。」はははー!言ってやったぜ!
移行先(us-east-1)で本来のバケットを作成
$ aws s3 mb s3://<backet_name> --region us-east-1
一時バケットから本来のバケットへデータを同期
$ aws s3 sync s3://<backet_name>-tmp s3://<backet_name> --region us-east-1
一時バケットの削除
$ aws s3 rb --force s3://<backet_name>-tmp --region us-east-1
できたー (° ꈊ °)✧˖°オホッ!
まとめ
やってることは大したことないのにだいぶ時間がかかるので、S3バケットのRegionは間違えたくない。。(・Θ・)
おまけ
バケットの削除が完了したら、なるべく早く同じ名前のバケットを登録したい!移行先(us-east-1)で本来のバケットを作成するスクリプトがこちら。
#!/bin/bash RESULT=2 until [ $RESULT -eq 0 ]; do aws s3 mb s3://<backet_name> --region us-east-1 RESULT=$? sleep 10 done echo "Bucket created!"