AWS ECS で awsvpc を便利に使う
概要
昨年末、 AWS ECS で コンテナに対して vpc が使えるようになりました。
しかしながら、サービスをみつけるには DNS か LB を使うしかないことは変わらないです。
ECS でサービスが起動されたときに、自動的に Route53 に ローカルIPアドレス を登録してくれればいいのに。
対応
サービス起動時に、Route53 に ローカルIPアドレス を登録する仕掛けを用意しました。
docker events でイベントを監視して、awsvpc なコンテナ起動をトリガに ローカルIPアドレス を調べます。
/sbin/docker_monitor.sh
#!/bin/bash
cluster=$1
zoneid=$2
while :; do
docker events --filter "event=start" | while read event; do
name=`echo $event | sed -r "s:.*container-name=([^,]*).*:\\1:"`
if [ $name = '~internal~ecs~pause' ]; then
arn=`echo $event | sed -r "s:.*task-arn=([^,]*).*:\\1:"`
ipv4=`aws ecs describe-tasks --cluster $cluster --tasks $arn \
--q tasks[0].containers[0].networkInterfaces[0].privateIpv4Address \
--o text`
family=`echo $event | sed -r "s:.*task-definition-family=([^,]*).*:\\1:"`
zone=`aws route53 get-hosted-zone --id $zoneid --q HostedZone.Name --o text`
record=$family.$zone
aws route53 change-resource-record-sets --hosted-zone-id $zoneid --change-batch \
"{\"Changes\":[{\"Action\":\"UPSERT\",\"ResourceRecordSet\":{\"Name\":\"$record\",\"Type\":\"A\",\"TTL\":60,\"ResourceRecords\":[{\"Value\":\"$ipv4\"}]}}]}"
echo $arn
echo $ipv4
echo $family
echo $record
fi
done >> /var/log/docker_monitor.log
sleep 1
done
ホストには、以下の権限が必要です。
ecs:DescribeTasks
route53:GetHostedZone
route53:ChangeResourceRecordSets
使い方としては、こんな感じの upstart を仕込んでおくといいです。
/etc/init/docker_monitor.conf
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec /sbin/docker_monitor.sh <クラスタ名> <ゾーンID>
これで、コンテナを起動すると Route53 に ローカルIPアドレス が自動的に登録されるようになります。