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」としています。
#!/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の設定を行います。
0 4 * * * /path/to/script/ami-backup.sh >> /var/log/ami-backup.log 2>&1
これでAMIのバックアップは完了です。基本的にはこれでほとんど事足りるのですが、DBデータだけ数時間ごとにバックアップとる必要がある場合や、一部ファイルだけバックアップを別でしておく場合はS3を使用します。


