日次で自動的に cron で再起動して、AMI イメージを取得したい。 再起動が必要だが再起動時はメンテナンス画面を出しておきたい( 深夜メンテナンス時間が取れるサービスに限る ) ALB でメンテナンス画面を出せる機能を用いてサーバ終了、起動時にメンテナンス画面に切り替える
仕組み
- EC2 上で自分自身のイメージを取得するスクリプトを用意する
- EC2 の IAM ロールで AMI 化を実行するのに必要な権限を付与する
- EC2 サーバの crontab にスクリプトを用意する
- 起動終了時に 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 を実行し、
- AMI の取得が開始されること
- 再起動時、ALB のルールのプライオリティが変更され、メンテナンス画面のルールが優先されている事
- EC2 起動後、メンテナンス画面のルールが下がること を確認する。