SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

AWSのバックアップをAmazon Machine ImageやAmazon S3ではじめよう

  • このエントリーをはてなブックマークに追加

 サーバー運用をする上でバックアップは必須項目ですが、アマゾン ウェブ サービス(以下、AWS)環境下での、Amazon Machine Image、Amazon S3を使ったバックアップ方法をご紹介します。

  • このエントリーをはてなブックマークに追加

Amazon Machine Image、Amazon S3とは

 「Amazon Machine Image(以下、AMI)」は、Amazon EC2上で実行するサーバーのテンプレートです。

 「Amazon S3(以下、S3)」は、シンプルなインターフェイスを持ち高可用性、高速なストレージサービスです。

対象読者

  • AWSに興味のある方
  • サーバー運用を行っている方

必要な環境

  • AWSのアカウント
  • EC2のAmazon Linuxインスタンス

バックアップ設定を行う 1

 バックアップ設定を行いたいAmazon Linuxのインスタンスにログインし、下記設定を行います。

 まずは必要なミドルウェアのインストールと初期設定をします。

ミドルウェアのインストールと初期設定

easy_install pip
pip install awscli --upgrade

 AWSのAPIにアクセスするためのアクセスキーとシークレットキーを設定します。 アクセスキーとシークレットキーについては、AWSのドキュメントを参照してください。

aws configure
-----------------
AWS Access Key ID [None]: {アクセスキー}
AWS Secret Access Key [None]: {シークレットキー}
Default region name [None]: ap-northeast-1
Default output format [None]: text
-----------------

AMIのバックアップスクリプトを作成する

 サーバーを起動した状態でバックアップできるようにします。世代数は3で、タグ名で世代管理しています。インスタンスのタグ名が空の場合は名前を入れて下さい。 このサンプルでは「ami-backup-test」としています。

/path/to/script/ami-backup.sh
#!/bin/sh

Gen=3
InstanceID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
PostfixDate=`date +%Y%m%d%H%M%S`
TagName=`/usr/bin/aws ec2 describe-tags | grep ${InstanceID} | grep Name | awk '{print $5}'`

resultCreate="success"
resultDelete="success"
ImageName="___created_image_name____"

if [ "$TagName" = "" ]; then
  echo "tag name is empty"
  exit 1
fi

createAmi(){
  echo "[`date '+%Y/%m/%d %H:%M:%S'`] create ami"
  ImageName=`/usr/bin/aws ec2 create-image --instance-id ${InstanceID} --name "${TagName}-${PostfixDate}" --description "${TagName} daily backup ${InstanceID} ${PostfixDate}" --no-reboot`
  echo "[`date '+%Y/%m/%d %H:%M:%S'`] $ImageName created"
  if [ $? -eq 0 ]; then
    createTagResponce=`/usr/bin/aws ec2 create-tags --resources ${ImageName} --tags "Key=Name,Value=${TagName}-${PostfixDate}"`
    if [ "$createTagResponce" = "true" ]; then
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] ${TagName}-${PostfixDate} tag created"
    else
      resultCreate="failure"
    fi
  else
    resultCreate="failure"
  fi
}

deleteAmi(){
  deleteImage=$1
  echo "[`date '+%Y/%m/%d %H:%M:%S'`] delete ami $deleteImage"
  tmpResult=1
  if [ "" = "$1" ]; then
    echo "[`date '+%Y/%m/%d %H:%M:%S'`] deleteImage is empty"
  else
    deleteResponce=`/usr/bin/aws ec2 deregister-image --image-id ${deleteImage}`
    if [ "$deleteResponce" = "true" ]; then
      tmpResult=0
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] ${deleteImage} deleted"
    fi
  fi
  if [ $tmpResult -eq 1 ]; then
    resultDelete="failure"
  fi
}

deleteAmis(){
  # for the created image not appear 
  echo -n > /tmp/ami-backup
  /usr/bin/aws ec2 describe-images --filters Name=tag:Name,Values=${TagName}-* --query "Images[*].[Name,ImageId]" > /tmp/ami-backup  
  if [ "$resultCreate" = "success" -a `cat /tmp/ami-backup | grep $ImageName | wc -l` -eq 0 ]; then
    echo "${TagName}-${PostfixDate}  $ImageName" >> /tmp/ami-backup
  fi

  listAmi=`cat /tmp/ami-backup | sort -r | sed -e "1,${Gen}d" | awk '{print $2}'`
  for ami in ${listAmi}
  do
    deleteAmi $ami
  done
}

createAmi
deleteAmis

if [ "$resultCreate" = "success" -a "$resultDelete" = "success" ]; then
  echo "[`date '+%Y/%m/%d %H:%M:%S'`] ami backup success"
else
  echo "[`date '+%Y/%m/%d %H:%M:%S'`] ami backup failure"
fi

 テスト実行します。

chmod +x ami-backup.sh
./ami-backup.sh

 「ami backup success」と表示されれば成功です。

 AWS Management ConsoleからAMIを表示すると、

{インスタンスのタグ名}-{年月日時分秒} 

のAMIが作成中になっているはずです。環境によっては3,4分ぐらい作成されたAMIが表示されないこともあります。

 cronの設定を行います。

crontab
0 4 * * * /path/to/script/ami-backup.sh >> /var/log/ami-backup.log 2>&1

 これでAMIのバックアップは完了です。基本的にはこれでほとんど事足りるのですが、DBデータだけ数時間ごとにバックアップとる必要がある場合や、一部ファイルだけバックアップを別でしておく場合はS3を使用します。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
バックアップ設定を行う 2

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

越川祐次(コシカワユウジ)

株式会社エイムラック所属 グループウェア「Aipo」の開発のほか、サーバー運用、移行、システム開発をおこなっています。kousoku AWSAipo.com

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8146 2014/10/09 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング