- EC2インスタンスを起動すると内部DNSにAレコードを登録し、停止するとAレコードを削除するinitスクリプトを作成しました。
”ZONE_NAME”だけ書き換えてあとはコピペでいける!はずです!
起動停止スクリプト作成
/etc/init.d/aws_route53_edit
#!/bin/bash
# chkconfig: 2345 99 10
# description: regist A record to aws route53
# Author:
ZONE_NAME="ゾーン名"
HOST_NAME=$(aws ec2 describe-tags --output text --query "Tags[?ResourceId==\`$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\` && Key==\`Name\`].Value")
IP_ADDRESS=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones | grep "Id" | awk '{print $2}' | sed -e 's/\/hostedzone\///' | sed -e 's/\,//' | sed -e 's/\"//g')
LOCK=/var/lock/subsys/aws_route53_edit
case "$1" in
"start" )
ARECORD_JSON="{
\"Changes\" : [
{ \"Action\" : \"UPSERT\",
\"ResourceRecordSet\" : {
\"Name\" : \"${HOST_NAME}.${ZONE_NAME}\",
\"Type\" : \"A\",
\"TTL\" : 60,
\"ResourceRecords\": [
{ \"Value\" : \"${IP_ADDRESS}\" }
]
}
}
]
}"
touch $LOCK
;;
"stop" )
ARECORD_JSON="{
\"Changes\" : [
{ \"Action\" : \"DELETE\",
\"ResourceRecordSet\" : {
\"Name\" : \"${HOST_NAME}.${ZONE_NAME}\",
\"Type\" : \"A\",
\"TTL\" : 60,
\"ResourceRecords\": [
{ \"Value\" : \"${IP_ADDRESS}\" }
]
}
}
]
}"
rm -f $LOCK
;;
*)
echo $"Usage: $0 {start|stop}"
exit 2
;;
esac
自動起動停止登録
sudo chmod 755 /etc/init.d/aws_route53_edit
sudo chkconfig --add aws_route53_edit
sudo chkconfig --list aws_route53_edit
確認
- マネジメントコンソールから落とし上げをして別ウィンドウでRoute53を監視
ハマったところ
-
ロックファイル
/var/lock/subsys/以下にファイルが無いとうまく動かないことがしばらくわからず時間をかけてしまった。ない状態でやると起動時のレコード登録はうまくいくがレコード削除がされなかった -
グローバルIP
インスタンスから直接AWSのAPIを実行するのでグローバルIPが各インスタンスについていないとエラー。というか固まる。。。
私はElasticIPではなく自動割当パブリックIPにしました
その他
- 起動停止時にCloudWatch登録削除なども作成予定なのでスクリプト名やロックファイル名は”aws_サービス名_動作名”などがよさそう