Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/09 14:00

 サーバー運用をする上でバックアップは必須項目ですが、アマゾン ウェブ サービス(以下、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を使用します。


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

著者プロフィール

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

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

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5