これまでAWS、Dockerなど、様々なサービスを利用してWebサーバーを整備してきました。
今回はそのWebサーバー(コンテナ)を、丸ごとS3へバックアップするシステムを作成しましょう。
万が一に備えてバックアップを取ることは、サービスを維持するためにとても重要です。
しかしバックアップ作業に時間を取られ、コンテンツの作成など本来時間を費やすべき作業がおろそかになるのは避けたいですよね。
そこでAWS CLIとシェルスクリプト、Crontabを組み合わせ、全てのバックアップ作業の完全自動化を目指します。
まず、コンテナをS3へアップロードするスクリプトを作成しましょう。
EC2インスタンスへSSHし、 container-backup.sh という名前でファイルを作成してください。
1 2 3 |
ssh -i ~/.ssh/HOGEHOGE -p xxxxx YOUR_PUBLIC_IP sudo su - touch container-backup.sh |
~
docker ps コマンドを実行し、 NAMES (コンテナの名前)をメモします。
そして次のスクリプトの YOUR_CONTAINER_NAME と YOUR_S3_BUCKET_NAME の箇所を自分の環境に合わせて変更し、 container-backup.sh へコピペします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#/bin/bash container_name="YOUR_CONTAINER_NAME" #あなたの環境に合わせて変更 container_id=`docker ps -aqf name={container_name}` container_detail="my_container" bucket_name="YOUR_S3_BUCKET_NAME" #あなたの環境に合わせて変更 directory_name="container-backup" #check variables echo ${container_id} echo ${container_detail} #docker export docker export ${container_id} > /tmp/${container_detail}.tar #upload docker image to S3-bucket /usr/bin/aws s3 rm s3://hodalab-backup/container-backup/ --recursive --include "${container_detail}-*" /usr/bin/aws s3 cp /tmp/${container_detail}.tar s3://${bucket_name}/${directory_name}/${container_detail}-`date "+%Y%m%d"`.tar |
~
準備ができたら作成したシェルスクリプトを実行しましょう。
1 |
bash container-backup.sh |
スクリプトを実行すると、S3にコンテナがアップロードされます。
このシェルスクリプトでは次の操作が順に行われています。
それぞれ詳しく見ていきましょう。
↓この部分で必要なデータを変数へ格納しています。
1 2 3 4 5 6 |
container_name="YOUR_CONTAINER_NAME" #環境に合わせて変更変更 container_id=`docker ps -aqf name={container_name}` container_detail="my_container" bucket_name="YOUR_S3_BUCKET_NAME" #環境に合わせて変更変更 directory_name="container-backup" |
~
Dockerは docker export コマンドを使うことで、コンテナを丸ごとパッケージングし、tarファイルとして出力することができます。
パッケージングされたコンテナは複製や移動が簡単にできるため、バックアップやデプロイに最適です。
↓この箇所では、変数へ格納したコンテナのIDを引数に取り、/tmp/ディレクトリ配下へ出力しています。
1 |
docker export {container_id} > /tmp/${container_detail}.tar |
最後の2行で、S3バケットの中身を一旦削除した後、コンテナファイルをアップロードしています。
1 2 |
/usr/bin/aws s3 rm s3://hodalab-backup/container-backup/ --recursive --include "{container_detail}-*" /usr/bin/aws s3 cp /tmp/${container_detail}.tar s3://${bucket_name}/${directory_name}/${container_detail}-`date "+%Y%m%d"`.tar |
~
S3にて、無料利用できるストレージ枠は5GBと少なく、無尽蔵に保存するわけにはいきません。
そのため、すでに保存されているコンテナを削除してからアップロードを行なっています。
AWS CLIとシェルスクリプトを組み合わせ、コンテナのバックアップがとても簡単になりました。
しかしバックアップするたびにインスタンスへSSHしてスクリプトを実行する必要があるため、運用としてはあまりイケてないです。
そこで、Crontabを使って完全に自動化しましょう。
CrontabはCronジョブのスケジュールを記述するためのファイルです。
Cronジョブは、特定の指示(コマンド)を計画的に実行するための設定です。
「この日時でこのコマンドを実行しなさい」というジョブをCrontabに記述することで、時が来たら自動でそのジョブを起動してくれます。
Crontabは次のコマンドで作成・編集できます。
1 |
crontab -e |
Crontabはスケジュールを決める5つのフィールドと、実行したいコマンドを指定する1つのフィールドで構成します。
x x x x x command
min hour day month year command
それでは実際にCrontabを設定しましょう。
次のコマンドでcrontabファイルを開いてください。
1 |
crontab -e |
そして次の内容を記述し、保存します。
1 2 |
30 0 1 * * bash ~/container-backup.sh 30 0 15 * * bash ~/container-backup.sh |
~
これで毎月1日と15日の0時30分に、「bash ~/container-backup.sh」コマンドが実行されます。
また、Crontabに記載されているジョブは次のコマンドで確認できます。
1 |
crontab -l |
Cronジョブが実際に起動するか心配であれば、直近の日時に変更して試してみると良いでしょう。
S3へバックアップしたコンテナをあなたのPCにダウンロードし、 docker import コマンドで復元(レストア)してみてください。EC2インスタンスで構築した環境が、そのままあなたのPCで再現できることを確認しましょう。
AWS CLIとシェルスクリプト、そしてCrontabを使い、コンテナを自動でバックアップできるようになりました。
このコンテンツで紹介したシェルスクリプトはコマンドを並べただけのシンプルなプログラムですが、Crontabなどと組み合わせて自動化すると非常に強力です。
次回
>>AWS Route 53を使って独自ドメインのWebページを表示させてみよう
社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?