EC2を起動したときにRoute53に登録されているAレコードを更新する
既にいろんなとこでやってる人がいる小ネタっす。
EC2で開発環境を作成していて、IPアドレスで接続するのが面倒くさいのでRoute53にIPアドレスを登録した。
まぁそれはそれで便利にはなったもののIP変わる都度、手動でRoute53にIPを設定するのも煩わしいので、EC2インスタンスの電源が入る都度、自動でRoute53を更新する様にした。
◆コマンド
# スクリプトのディレクトリを作成 mkdir init # ここからEOF_SCRIPTまでがroute53.shの内容になります
# バッククォート (`) は `\` でエスケープしてください。 # `$` は自動で展開されるのでエスケープ不要です。 cat << 'EOF_SCRIPT' > init/route53.sh #!/bin/bash set -euxo pipefail DOMAIN_NAME="yourdomain.com" SUB_NAME="yoursubname" HOSTED_ZONE_ID="YOUR_HOSTED_ZONE_ID" # IMDSv2 (Instance Metadata Service Version 2) のトークンを取得 TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # トークンが取得できたか確認 if [ -z "$TOKEN" ]; then echo "エラー: IMDSv2トークンを取得できませんでした。インスタンスのIMDS設定を確認してください。" >&2 exit 1 fi # 取得したトークンを使用してパブリックIPアドレスを取得 # X-aws-ec2-metadata-token ヘッダーにトークンを含める必要があります IP_ADDRESS=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/public-ipv4) # IPアドレスが取得できたか再確認 if [ -z "$IP_ADDRESS" ]; then echo "エラー: インスタンスのメタデータからパブリックIPアドレスを取得できませんでした。" >&2 exit 1 fi # レコードの完全修飾ドメイン名を作成 FULL_DOMAIN_NAME="${SUB_NAME}.${DOMAIN_NAME}" echo "更新対象ドメイン: ${FULL_DOMAIN_NAME}" echo "割り当てられたIP: ${IP_ADDRESS}" echo "ホストゾーンID: ${HOSTED_ZONE_ID}" # Route53レコードセット変更のためのJSONファイルを作成 cat << EOF > /tmp/route53_changes.json { "Comment": "EC2起動時に ${FULL_DOMAIN_NAME} のAレコードを ${IP_ADDRESS} に更新", "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "${FULL_DOMAIN_NAME}", "Type": "A", "TTL": 60, "ResourceRecords": [ { "Value": "${IP_ADDRESS}" } ] } } ] } EOF # AWS CLIを使用してRoute53レコードセットを更新 aws route53 change-resource-record-sets \ --hosted-zone-id "${HOSTED_ZONE_ID}" \ --change-batch file:///tmp/route53_changes.json echo "Route53のAレコード (${FULL_DOMAIN_NAME}) が ${IP_ADDRESS} に正常に更新されました。" EOF_SCRIPT # スクリプトに実行権限を付与 chmod +x init/route53.sh # Ubuntuユーザーのホームディレクトリを取得 HOME_DIR_PATH=$(getent passwd ubuntu | cut -d: -f6) TARGET_USER="ubuntu" TARGET_GROUP="ubuntu" # systemdサービスファイルを生成 sudo sh -c 'cat << EOF_SERVICE > /etc/systemd/system/route53_set.service [Unit] Description=Route53 Set And Timer After=network-online.target [Service] ExecStart=/bin/bash '"${HOME_DIR_PATH}"'/init/route53.sh WorkingDirectory='"${HOME_DIR_PATH}"'/init Type=oneshot User='"${TARGET_USER}"' Group='"${TARGET_GROUP}"' [Install] WantedBy=multi-user.target EOF_SERVICE' # systemd設定を再読み込み sudo systemctl daemon-reload # 起動時にサービスが自動で実行されるように有効化し、即座にサービスを起動 sudo systemctl enable --now route53_set.service
ほとんど以下のサイトのパクリっす。
https://dev.classmethod.jp/articles/route53-record-ip-change-by-aws-cli/
https://qiita.com/L_A_P_119611/items/a9054c5184d750ccba59
EC2起動するだけで、よくなったのでだいぶ快適に使えるようになりました。
ユーザスクリプトで組み込めばうまく動くものなんですかね。。。
そしたらだいぶ楽になるかな
コメント