LoginSignup
5
2

S3バケットのフルバックアップをシェルで作成する方法

Last updated at Posted at 2024-04-26

はじめに

私は1年以上稼働しているシステムを運用しているエンジニアです。
S3バケットのバックアップをとりたい!でも手順が多くてめんどくさい!ということありますよね。
そこで今回はS3バケットのバックアップを作成するシェルスクリプトを作成したので紹介します。

こんな人に読んでほしい

  • システムを運用している
  • AWSで環境構築をしている
  • S3バケットのバックアップをとりたい
  • シェルスクリプトを使いたい

目次

  • なぜシェルスクリプトを作るのか
  • なぜバケットバックアップなのか
  • シェルスクリプト概要
  • 前提条件
  • シェルスクリプト使用方法
  • まとめ

なぜシェルスクリプトを作るのか

システムの運用をしていると「その時々の本番環境と同様の環境を用意したい」「何かシステムに変更を加える前にバックアップを取りたい」などが発生します。
いくら手順化していても「手動操作によるミス」「順番を飛ばす」などのリスクがあります。
そこで「誰でも」「簡単に」「誤りなく」S3バケットのバックアップを取る方法のひとつとしてシェルスクリプトを作成しました。

なぜバケットバックアップなのか

まず今回バックアップを取得する私の目的は「バケット自体に何か変更を加えてしまった場合に、バケットを丸ごと復元したい」です。
S3バケットのバックアップとしては以下方法があり、それぞれ共通したメリットとデメリットが考えられます。
また、今回は「一時的に」「バケット丸ごと」復元したかったので本手法を採用しました。

  • メリット:継続的にバックアップ可能
  • デメリット:方法によっては長期運用でバックアップが膨大になる可能性がある
手法 概要
バージョニング オブジェクト毎に複数バージョン保持
レプリケーション バケット間でオブジェクトの非同期コピー
バックアップボールト ストレージへ指定リソース(S3など)を指定周期でバックアップ保存

シェルスクリプト概要

このシェルスクリプトでは大きく2つの処理を実行しています。

  • バックアップ用バケットの作成
  • 取得対象バケットからバックアップ用バケットへすべてのファイルをコピー

前提条件

このシェルスクリプトを使用するにあたって、以下環境を用意する必要があります。

  • OS:Linux
  • ツール:AWS CLI
  • configureで認証情報の設定

まだ用意していない方はそれぞれ以下を参考にしてください。

シェルスクリプト使用方法

シェルスクリプトを叩く前に、以下手順を実行してください。

  1. ファイル内のPROFILEへ認証情報設定時のprofileを設定
  2. ファイル内のTARGET_BUCKETへ取得対象のS3バケット名を設定
  3. ファイルへ実行権限の付与
chmod +x s3_backup.sh

上記手順が完了したら、あとは以下コマンドを実行してください。

bash s3_backup.sh
s3_backup.sh
#!/bin/bash

# S3バケットへバックアップを作成するスクリプト
#
# 【使い方】
# (1) スクリプト実行
# bash s3_backup.sh
# (2) バックアップ用バケット名入力
# 20240101_backup.sql
# (3) 作成完了

# profile定義
readonly PROFILE="profile"

# 取得対象S3バケット名定義
readonly TARGET_BUCKET="バケット名"

# 対象バケットのバックアップ用バケット作成
read -p "バックアップ用のバケット名を入力してください: " bucket
echo "バケット作成中・・・"
aws s3 mb "s3://$bucket" --profile $PROFILE

if [ $? -eq 0 ]; then
  echo "バケット作成に成功しました。"
else
  echo "バケット作成に失敗しました。"
  exit
fi

# 対象バケットからバックアップ用バケットへファイルコピー
echo "対象バケットからバックアップ用バケットへファイルコピーします。"
echo "ファイルコピー中(ファイル数が多い場合、この処理には時間がかかります。)・・・"
aws s3 sync "s3://$TARGET_BUCKET" "s3://$bucket" --profile $PROFILE > /dev/null 2>&1

if [ $? -eq 0 ]; then
  echo "ファイルコピーに成功しました。"
else
  echo "ファイルコピーに失敗しました。"
  exit
fi

# 対象バケットとバックアップ用バケットのファイル数一致確認
echo "バケットの中身を確認中・・・"
readonly target_bucket_files=$(aws s3 ls "s3://$TARGET_BUCKET" --profile $PROFILE | wc -l)
readonly backup_bucket_files=$(aws s3 ls "s3://$bucket" --profile $PROFILE | wc -l)

if [ "$target_bucket_files" -eq "$backup_bucket_files" ]; then
  echo "バックアップ用バケットに問題はありませんでした。"
else
  echo "対象バケットとバックアップ用バケットのファイル数が一致しませんでした。"
  echo "手順を確認して再度実行してください。"
fi

今回は各コマンドの詳細については省略します。
aws s3コマンドのオプションについてはAWS Command Line Interfaceバージョン2用ユーザーガイドを参考になさってください。

まとめ

今回はバケット自体の一時的なバックアップを簡単に実行するためにシェルスクリプトを作ってみました。

不要なバケットを削除する、オブジェクトを移動させるなど、みなさんのお好きなようにカスタマイズして何かしらに活用いただければ幸いです。
ここまで読んでくださりありがとうございました!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2