Elastic IP を利用せずに、Amazon EC2と Route 53 のドメイン名を紐付ける

Amazon EC2 には Elastic IPという機能があり、静的なIPアドレスをEC2 に予約することができます。これによって、EC2 を停止中も、グローバルIPアドレスが変わらずに、Route 53 などのドメイン名との紐付けが容易になります。

一方で、EC2の停止中は、Elastic IP アドレスに課金され、わずかながらコストが発生します。

EC2 が起動するごとに、Route 53 との紐付けが自動的に行われれば、Elastic IPの確保は不要となり、ドメイン名でEC2の操作が可能となります。

今回は、Elastic IP を利用せずに、Amazon EC2 とRoute 53 のドメイン名を紐付けしてみました。その作業メモを残しておきます。

仕様

  • 利用したいドメイン名を、Route 53 に設定(ここでは sample.kiminonahaseichi.link とする)
  • EC2 起動時に、動的IPの値をRoute 53 に反映。「sample.kiminonahaseichi.link」というドメイン名でSSH、HTTPへのアクセスができるようにする。

考え方

  • EC2 に紐付けしたいドメイン名を、Route 53 のHosted Zone に設定する
  • EC2 起動時に、自インスタンスに割り当てられた動的IPの値を調べる
  • 割り当てられた動的IPを、Route 53 に送信して、ドメイン名との紐付を行う
  • EC2のIP調査、およびRoute 53 の設定変更権限を持つIAMを作成して、上記2つの作業をEC2起動時に自動実行する

IAMの作成

ドメインを管理するHosted Zone の設定を行います。
Hosted Zone にはそれぞれIDが割り当てられているので、IDを控えておきます。

image9.png

Hosted Zone から、DNSを作成します。ここではsample.kiminonahaseichi.link と設定します。タイプはAレコード。Value はEC2起動時に書き換えられるので、初期設定は適当な値を入力しておきます。(ここでは192.168.0.1と設定)

image1.png

次にIAMを設定します。任意のユーザー名をつけます。(ここではsample_IAM)
APIを通して各種操作を行うため、「プログラムによるアクセス」を選択します。

image5.png

IAMに対してポリシーをアタッチします。今回は、Route 53 更新用に独自のポリシーをアタッチします。「ポリシーの作成」を選びます。

image6.png

ポリシーの作成画面から「独自のポリシーを作成」を選びます。

image2.png

ポリシー名、説明、ポリシードキュメントを設定します。ここでは、ポリシー名を「DSN_Renew」としました。説明には、今回作成するポリシーの内容を記述します。

image3.png

ポリシードキュメントには、以下のJSONファイルを記述します。(ゾーンID)には、最初に控えておいたHosted Zone のIDを記述します。


{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Action": [
               "ec2:DescribeInstances"
           ],
           "Effect": "Allow",
           "Resource": [
               "*"
           ]
       },
       {
           "Action": [
               "route53:ChangeResourceRecordSets",
               "route53:GetHostedZone",
               "route53:ListResourceRecordSets"
           ],
           "Effect": "Allow",
           "Resource": [
               "arn:aws:route53:::hostedzone/(ゾーンID)"
           ]
       },
       {
           "Action": [
               "route53:ListHostedZones"
           ],
           "Effect": "Allow",
           "Resource": [
               "*"
           ]
       },
       {
           "Effect": "Allow",
           "Action": [
               "route53:GetChange"
           ],
           "Resource": "arn:aws:route53:::change/*"
       }
   ]
}

作成が終わったら保存して、IAMの設定に戻ります。フィルタを「ユーザーによる管理」にして、作成したポリシーを選択します。

image6.png

ポリシーの選択が終わったら、アクセスキーIDとシークレットアクセスキーを控えておきます。これでIAMの設定は終了です。

image8.png


EC2 のスクリプト

次に、EC2起動時のスクリプトを作成します。

今回は、 /var/config/aws/ というディレクトリ配下に、まとめて設定を行いました。
「dyndns.tmpl」、「ec2Setup.sh」、「settings.conf」の3つのファイルを作成します。

dyndns.tmpl



{
    "Changes": [
        {
            "Action": "UPSERT",
            "ResourceRecordSet": {
                "Name": "sample.kiminonahaseichi.link.",
                "ResourceRecords": [
                    {
                        "Value": "{%IP%}"
                    }
                ],
                "TTL": 60,
                "Type": "A"
            }
        }
    ]
}


settings.conf


[default]
region = ap-northeast-1
aws_access_key_id = アクセスキーID
aws_secret_access_key = シークレットキー

ec2Setup.sh


#!/bin/sh
# Env
APPPATH=/var/config/aws/
ZONEID="ゾーンID"
HOSTS="/etc/hosts"
export AWS_CONFIG_FILE=/var/config/aws/settings.conf
InstanceID=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id
`
IP=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-ipv4`
HostName=`aws --output text ec2 describe-instances --filters Name=instance-id,Va
lues="${InstanceID}"|grep "TAGS"|grep "Name"|cut -f3`
hostname ${HostName}
# sed -i """/127.0.0.1/c\127.0.0.1 localhost ${HostName}" ${HOSTS}
sed -e "s/{%IP%}/${IP}/g;s/{%HOST%}/${HostName}/g" ${APPPATH}dyndns.tmpl > ${APP
PATH}${HostName}.json
aws route53 change-resource-record-sets --hosted-zone-id ${ZONEID} --change-batc
h file://${APPPATH}${HostName}.json
exit

作成したら、ec2Setup.shに対して実行権限を付与します。

最後に、起動時にec2Setup.shを実行するための設定を行います(upstartの設定)。
/etc/iint/ 配下に、ec2Setup.conf ファイルを作成します。起動時にRoute 53 の設定がうまくかなかった場合、登録を再度こころみるためにrespawnの設定記述します。

ec2Setup.conf


description "AWS EC2: register host record to Route 53"
start on runlevel [2345]
stop on runlevel [!2345]
task
respawn
respawn limit 30 240
exec /var/config/aws/ec2Setup.sh


すべての設定が終わったら、EC2を再起動して、Route 53 の設定が書き換えられていることを確認します。

image7.png


書き換えができていれば、設定がうまく動いています。今後はEC2起動時に、自動的にドメイン名との紐付けが行われます。

参考にした情報

今回の設定は、以下の記事を参考に、一部修正を行いました。

https://blog.rocaz.net/2014/07/1708.html

IAMの独自ポリシー作成が難しい場合、既存のポリシーをIAMに割り当てても良いでしょう。以下の2つのポリシーを使います。

  • AmazonEC2ReadOnlyAccess
  • AmazonRoute53FullAccess

の2つとなります。

うまく実行されない場合、ec2setup.confの実行ログをどこかに保存して、エラーメッセージをみながら解決します。


exec /var/config/aws/ec2Setup.sh >> /var/log/ec2Setup.log 2>&1
  • 2017年08月15日