簡単な EC2 インスタンスのバックアップ機構を作る

日次で自動的に cron で再起動して、AMI イメージを取得したい。 再起動が必要だが再起動時はメンテナンス画面を出しておきたい( 深夜メンテナンス時間が取れるサービスに限る ) ALB でメンテナンス画面を出せる機能を用いてサーバ終了、起動時にメンテナンス画面に切り替える

仕組み

  1. EC2 上で自分自身のイメージを取得するスクリプトを用意する
  2. EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する
  3. EC2 サーバの crontab にスクリプトを用意する
  4. 起動終了時に ALB のルールのプライオリティを変更する処理を組み込む

EC2 上で自分自身のイメージを取得するスクリプトを用意する

/usr/local/bin/ami_backup.bash に下記のスクリプトを設置した。

#!/bin/bash

id=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
/usr/bin/aws ec2 create-image --region ap-northeast-1 --instance-id $id --name "wordpress-www-update-$id-$(date +%Y%m%d%H%M)" --reboot

wordpress-www-update の部分はシステムによって変えた方が良いと思う。 あるいは$id にインスタンス名が入るので、それを持ってユニークとするか( ただし検索が面倒 )

EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する

下記のロールを持つように IAM を作成、EC2 サーバーに付与

  • elasticloadbalancing はロードバランサーのルールのプライオリティの上下に使う
  • ec2 は AMI の作成に使う
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:SetRulePriorities"
                "ec2:ExportImage",
                "ec2:DescribeImages",
                "ec2:DeleteTags",
                "ec2:EnableImageDeprecation",
                "ec2:CreateTags",
                "ec2:RegisterImage",
                "ec2:CreateImage",
                "ec2:ModifyImageAttribute",
                "ec2:CreateStoreImageTask",
                "ec2:DisableImageDeprecation"
            ],
            "Resource": "*"
        }
    ]
}

EC2 サーバの crontab にスクリプトを用意する

AM 03:01 に実施

1 3 * * * /usr/local/bin/ami_backup.bash

起動終了時に ALB のルールのプライオリティを変更する処理を組み込む

メンテナンス用の ALB のルールを作成する。 つまり一つの ALB 上に

  • 通常時のルール
  • メンテナンス時のルール の 2 つが存在するようにする。

ルールは優先順位で評価されマッチすれば抜ける。

AMI 作成時、EC2 は再起動する。 rc6 にメンテナンス画面に切り替える処理をいれ、 rc3 にメンテナンス画面から復帰するように処理を入れる。

メンテナンス用の ALB のルールを作成

参考 ALB を利用して固定ページを表示してみよう 今回のアイデアの元になったサイト。参考にしつつ固定ページを作成。

現在のルールの確認
aws elbv2 \
  describe-rules \
  --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:111111:listener/app/hoge/hogege/hogegege
プライオリティの操作

Priority=60 でプライオリティを変更する

aws elbv2 set-rule-priorities \
  --region ap-northeast-1 \
  --rule-priorities \
  RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:111111111111:listener-rule/app/share/hoge/hogege/hogegege,Priority=60

aws elbv2 set-rule-priorities
–profile smart-kids
–region ap-northeast-1
–rule-priorities
RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:557047673318:listener-rule/app/share/6e8258778f78ced5/53d2fe7281ca9190/7d2de630e10b333e,Priority=30

init スクリプト

/etc/init.d 配下に下記スクリプトを設置し、実行権限を付与した上で、rc3(デフォルトランレベル)と rc6(再起動)に登録する。 ALB のルールの ARN に依存している書き方をしているので、設置する際に ARN に応じて書き換える必要が有る。

#! /bin/bash
#
# for maintenance
#
# chkconfig: 2345 85 15
# description: Activates/Deactivates ALB rule

# このスクリプトは『メンテナンス用のALBのルールのARN』が
#       RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:111111111111:listener-rule/app/share/hoge/hogege/hogegege,Priority=80
# であることに依存している。ARNが変わったら変更すること。
# また、何かの理由で、メンテナンスでない、通常の振り分けルールのARNが変わった場合は
# プライオリティを変更する必要がある。

# Source function library.
. /etc/init.d/functions

case "$1" in
start)

    sleep 40
    aws elbv2 set-rule-priorities \
          --region ap-northeast-1 \
          --rule-priorities \
          RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:111111111111:listener-rule/app/share/hoge/hogege/hogegege,Priority=80
    logger "maintenance end"
    touch /var/lock/subsys/maintenance

    ;;
stop)

    aws elbv2 set-rule-priorities \
          --region ap-northeast-1 \
          --rule-priorities \
          RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:111111111111:listener-rule/app/share/hoge/hogege/hogegege,Priority=60
    logger "maintenance start"
    rm -f /var/lock/subsys/maintenance

    ;;
*)
    echo $"Usage: $0 {start|stop}"
    exit 2
esac

exit $rc

chmod 755 /etc/init.d/maintenance chkconfig –add maintenance

で有効にする。

aws-cli インストール

yum -y install awscli

動作確認

/usr/local/bin/ami_backup.bash を実行し、

  1. AMI の取得が開始されること
  2. 再起動時、ALB のルールのプライオリティが変更され、メンテナンス画面のルールが優先されている事
  3. EC2 起動後、メンテナンス画面のルールが下がること を確認する。
User
CloudFront
ALB
EC2
RDS