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を使用します。