Elastic IP をケチりたい
たまにしか起動しないインスタンスに Elastic IP をアタッチするのはもったいない。といって、起動するたびにIPアドレスが変わるとホスト名でアクセスできなくて面倒くさい。
……と思ったので Route 53 でIPアドレスを自動設定してくれるスクリプトを書いた。
2019年11月21追記
一段と自動化した Lambda を作りました:
[AWS]インスタンス起動時にIPアドレスを自動でRoute53に登録する
用意するもの
- 登録したい Route 53 のホストゾーンID
ホスト名
対象のOSでホスト名を設定する。この名前が Route 53 に登録される。ドメイン名がホストゾーンIDと一致していることを確認する。
Amazon Linux 2 では次のような感じでホスト名を設定できる。
hostnamectl set-hostname route53test.example.com
IAMポリシー
このポリシーをアタッチしたロールを、インスタンスにアタッチする。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "route53dynamic",
"Effect": "Allow",
"Action": "route53:ChangeResourceRecordSets",
"Resource": "arn:aws:route53:::hostedzone/Z123456789ABCD"
}
]
}
スクリプト本体
これを /usr/local/sbin
に置く。
set-dns-record.sh
#!/bin/bash
HOSTZONE_ID=$1
host_addr=`curl -s http://169.254.169.254/latest/meta-data/public-ipv4`
host_name=`hostname`
tmp_file=`mktemp`
cat <<EOS > $tmp_file
{
"Comment": "optional comment about the changes in this change batch request",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "${host_name}.",
"Type": "A",
"TTL": 300,
"ResourceRecords": [
{
"Value": "${host_addr}"
}
]
}
}
]
}
EOS
aws route53 change-resource-record-sets --hosted-zone-id $HOSTZONE_ID --change-batch file://$tmp_file
rm $tmp_file
ユーザーデータ
毎起動時に実行したいので、このあたりを参考にしてユーザーデータを書く。ちょっと面倒くさい。
Amazon EC2 インスタンスを再起動するたびにユーザーデータを実行して自動的にファイルを作成する方法を教えてください。
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/bin/bash
/usr/local/sbin/set-dns-record.sh Z123456789ABCD
--//
ユーザーデータに直接スクリプトを書くのもあり、なのかも……?