はじめに
S3間で40TB以上のデータ移行が必要になり、普通にやると約2日かかる。
そこで、tmuxを使用しセッションが切れても実行し続ける環境をEC2インスタンス上で構築しました。
その時の学習をアウトプットできればと思います。
手順
-
前提
- EC2インスタンスにSSM接続ができるように設定する
- EC2を起動するサブネットへS3用のエンドポイントを作成
-
手順
1. 【targetアカウント】EC2用のIAMロールを作成
2. 【sourceアカウント】バケットポリシーを作成
3. 【targetアカウント】EC2インスタンスにtmuxをインストール
4. 【targetアカウント】tmuxで新規シェルを作成し、移行コマンドの実行
今回の構成図
手順1 【targetアカウント】EC2用のIAMロールを作成
1.1 下記カスタマ管理ポリシーを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<sourceのS3バケット名>",
"arn:aws:s3:::<sourceのS3バケット名>/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<targetのS3バケット名>",
"arn:aws:s3:::<targetのS3バケット名>/*"
]
}
]
}
1.2 カスタマー管理ポリシーを、EC2へアタッチするIAMロールへ追加
手順2 【sourceアカウント】バケットポリシーを作成
下記バケットポリシーをsorceアカウント
の対象S3バケットのバケットポリシーに記入します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddCannedAcl",
"Effect": "Allow",
"Principal": {
"AWS": "<EC2へアタッチしたIAMロールのARN>"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectTagging"
],
"Resource": [
"arn:aws:s3:::<targetのS3バケット名>",
"arn:aws:s3:::<targetのS3バケット名>/*"
]
}
]
}
ここまでで、EC2へSSM接続しsorceアカウント
の対象のS3バケットのオブジェクト名など取得できることを確認する。
# 下記コマンドで、オブジェクト名が表示されたら成功
$ aws s3 ls s3://<sourceのS3バケット名>
オブジェクト名が取得できなければ、
・バケットポリシーの内容
・S3用のエンドポンとがあるか
など確認する。
手順3 【targetアカウント】EC2インスタンスにtmuxをインストール
tmuxとは
端末多重化ソフトウェア(ターミナル画面を複数開くことで、同時作業が可能になる)
tmuxを使用する背景:
セッションマネージャーにはセッション維持の制限時間があるが、tmuxで作成したターミナルは明示的にセッションを終了しなければ維持され続ける。
冒頭でも書いたように、今回は40TB以上のデータを移行するので最低でも2日間はセッションを維持しておく必要がある。
# 下記コマンドでインストール
$ sudo yum install -y tmux
手順4 【targetアカウント】tmuxで新規シェルを作成し、移行コマンドの実行
4.1 新規セッションの起動
# 下記コマンドで新規セッションの開始
$ tmux new -s <セッション名>
4.2 起動したセッションで、コマンドを実行
# 下記コマンドでデータ移行
aws s3 sync s3://<sourceバケット名> s3://<targetバケット名>/ --acl bucket-owner-full-control
無事データが移行できていることを確認!
4.3 【番外】tmuxのセッションから抜ける方法
ctrl + b
を押した後に d
を入力