J’hopper’s Heaven (ジョッパーズヘブン)

ジョブホッパー・ボブがジョブホッパーでなくなる日を夢見るブログ

AWS S3バケットをRegionをまたいで移行する方法

Fire buckets

おはよう!そして会えないときのためにこんにちは、こんばんは、そして、おやすみなさい。ジョブホッパー・ボブです。

会社で目の青い同僚に、「この前作ったS3バケットのRegion間違えちゃってた。もぅデータ入れちゃった。いますぐなんとかして。あ、名前は変えないで。(´,,•ω•,,`)」って言われました。(´・∀・` )アラマァ
というわけで今回は、AWSのS3バケットをRegionをまたいで移動する方法ですょ!

全体の流れ

AWS CLIで、Region内のS3バケットの同期(全コピー)はできるのですが、Regionをまたぐコピーは直接できないんですよね。あと、バケットの名前はRegionに関係なく一意でなければならないので、ちょっと厄介。なので、一時的にデータを退避させるS3バケットを作ってやっていく感じになります。具体的には、こんな感じでしょうか。

  1. 移行先のRegionに一時バケットを作成して、移行元からデータを全コピー
  2. 移行元のRegionのバケットを削除
  3. 移行先のRegionに本来のバケットを作成(削除したバケットと同じ名前)
  4. 移行先のRegion内で一時バケットから本来のバケットにデータを全コピー
  5. 一時バケットを削除

同じ名前のバケットを登録できるようになるまで(2から3の間)、結構時間がかかる(ちなみにボブの場合は1時間半ぐらい登録できなかった)ので、心とカラダに余裕がある人向けですょ( ³ω³ )

準備

AWS CLIをインストールしてください。もうね、ここにしのごの書くより、AWSさんの素晴らしいドキュメントがありますので、それを見るのがいいと思うの。(´・∀・`)

docs.aws.amazon.com

ぱいそん。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!"