1. keys

    Posted

    keys
Changes in title
+[AWS] Route 53 でダイナミックDNS
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,109 @@
+# Elastic IP をケチりたい
+
+たまにしか起動しないインスタンスに Elastic IP をアタッチするのはもったいない。といって、起動するたびにIPアドレスが変わるとホスト名でアクセスできなくて面倒くさい。
+
+……と思ったので Route 53 でIPアドレスを自動設定してくれるスクリプトを書いた。
+
+## 用意するもの
+
+* 登録したい Route 53 のホストゾーンID
+
+## ホスト名
+
+対象のOSでホスト名を設定する。この名前が Route 53 に登録される。ドメイン名がホストゾーンIDと一致していることを確認する。
+
+Amazon Linux 2 では次のような感じでホスト名を設定できる。
+
+```
+hostnamectl set-hostname route53test.example.com
+```
+
+## IAMポリシー
+
+このポリシーをアタッチしたロールを、インスタンスにアタッチする。
+
+```json
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "route53dynamic",
+ "Effect": "Allow",
+ "Action": "route53:ChangeResourceRecordSets",
+ "Resource": "arn:aws:route53:::hostedzone/Z123456789ABCD"
+ }
+ ]
+}
+```
+
+## スクリプト本体
+
+これを `/usr/local/sbin` に置く。
+
+```shell: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 インスタンスを再起動するたびにユーザーデータを実行して自動的にファイルを作成する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/execute-user-data-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
+--//
+```
+
+ユーザーデータに直接スクリプトを書くのもあり、なのかも……?