1. keys

    No comment

    keys
Changes in body
Source | HTML | Preview
@@ -1,109 +1,113 @@
# Elastic IP をケチりたい
たまにしか起動しないインスタンスに Elastic IP をアタッチするのはもったいない。といって、起動するたびにIPアドレスが変わるとホスト名でアクセスできなくて面倒くさい。
……と思ったので Route 53 でIPアドレスを自動設定してくれるスクリプトを書いた。
+**2019年11月21追記**
+一段と自動化した Lambda を作りました:
+[[AWS]インスタンス起動時にIPアドレスを自動でRoute53に登録する](https://qiita.com/keys/items/43adf968d366e80f0003)
+
## 用意するもの
* 登録したい 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
--//
```
ユーザーデータに直接スクリプトを書くのもあり、なのかも……?