EC2インスタンス起動時にRoute53にIPアドレスを自動設定する

更新日:11月15日




1. はじめに

株式会社ageetでエンジニアをやっているねこたです。社内で技術をオープンに発信していこうという方針となりました。始めはちょっとずつ、浅い内容がメインとはなりますが書きためた自分の備忘録や、今後の調査を掲載出来たらと考えています。


2. 概要

  • AmazonLinux2 の新規起動時にEC2インスタンスに割り当てられたIPアドレスをRoute53を利用し指定したドメインに設定します。Elastic IP Addressを利用する方法もありますが、わずかではありますが、追加のコストがかかる事と、複数のインスタンスを利用する場合に煩雑になるためRoute53を利用する方法を検討しました。

  • systemd の自動起動スクリプトを利用する方法、UserDataを利用する方法等が考えられますが、今回はUserDataを利用します

3. EC2インスタンスに下記のロールを設定


3.1 EC2用 IAM Roleの作成

EC2用インスタンス用Roleを作成します。今回の目的のため、AmazonRoute53AutoNamingRegistrantAccessを付与、EC2用インスタンスにIAMロールとして割り当てます。権限は要件に合わせて絞って下さい。


3.2 ユーザーデータの作成

作成したEC2インスタンスのユーザーデータ(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

LOG_OUT=/var/log/user-data.log

exec 1> >(
  while read -r l; do echo "[$(date +"%Y-%m-%d %H:%M:%S")] $l"; done \
    | tee -a $LOG_OUT
) 2>&1

# 下記は希望のドメイン名とHOSTED_ZONE_IDを設定してください。
DOMAIN="asterisk.example.com"
HOSTED_ZONE_ID="Z*****************"

touch /tmp/init.log
echo "user-data start."

PUBLIC_IP=$(curl --silent http://169.254.169.254/latest/meta-data/public-ipv4)

echo "DOMAIN: ${DOMAIN}"
echo "PUBLIC_IP: ${PUBLIC_IP}"

cat <<EOT > /tmp/dns_recordset.json
{ "Changes": [{"Action":"UPSERT","ResourceRecordSet":{"Name": "${DOMAIN}","Type": "A","TTL":600,"ResourceRecords":[{"Value":"${PUBLIC_IP}"}]}}]}
EOT

echo "Calling aws route53 change-resource-record-sets..."
aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file:///tmp/dns_recordset.json

echo "user-data done."

--//--


3.3 ユーザーデータの解説

インスタンス起動時に期待するスクリプトを毎回起動するためには、ユーザーデータにはmultipartなcloud-initを貼り付け、text/x-shellscriptにスクリプトとして定義します。ユーザーデータを単体のスクリプトとしても設定できますが、その場合はEC2インスタンスを作成した1回のみの実行となります。


動作を起動後に追跡できるように下記ブロックを定義し標準出力をログに出力するようにします

exec 1> >(
  while read -r l; do echo "[$(date +"%Y-%m-%d %H:%M:%S")] $l"; done \
    | tee -a $LOG_OUT
) 2>&1

下記コマンドで自身の外部IPV4アドレスを取得します。

PUBLIC_IP=$(curl --silent http://169.254.169.254/latest/meta-data/public-ipv4)

下記でroute53コマンド用のパラメータファイルを作成します

cat <<EOT > /tmp/dns_recordset.json
{ "Changes": [{"Action":"UPSERT","ResourceRecordSet":{"Name": "${DOMAIN}","Type": "A","TTL":600,"ResourceRecords":[{"Value":"${PUBLIC_IP}"}]}}]}
EOT

下記のawsコマンドにてroute53に反映して完了です!

aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file:///tmp/dns_recordset.json


4. 参考・出典



■ 担当: ねこた

自己紹介: 株式会社ageetで技術関連中心に色々やっています。SIP/VoIP関連や、サーバー・クラウド担当。最近の技術ではサーバーレス関連技術、JavaScript/TypeScript界隈に興味があります。家族は4人と愛犬2匹+お魚(+エビ)。趣味はPC/Apple関連、ゲーム全般、野球観戦、アクアリウム。苦手なモノは生のトマトと固いチーズ。千葉在住。

閲覧数:15回0件のコメント

最新記事

すべて表示

試験の目的 今回の試験の目的は、音声通話というリアルタイムな通信が必要なものはどの程度影響があるのか調べるためのものだ。 通信速度を比較する単位としてbps(bit per second)というものが使われるが、リアルタム通信ではこれがいくら高い数字でも音質が良いとは限らない。 よくあるスピードテストでは、一定時間、例えば10秒間に沢山データパケットを送信し、その合計のデータ量を10秒で割ったも