【Route53】EC2 から自身に付与されたパブリックIP を Route53 に設定したい

2021.02.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

テクニカルサポート部の 丸屋 正志(まるちゃん)です。

参考にしたサイト一覧

今回は、Systemd で Route53 に登録しているレコードを更新する機会があったので、手順を展開します。

背景

EC2 インスタンスの動的パブリックIP を Route53 のレコードに登録している中で、 Stop->Start をすると、動的パブリックIP は変わってしまいその後に手動で Route53 のレコードを変更するのが大変だったので、 Systemd を使って自動化しました!

Systemd を使ってあげる事で、インスタンスが起動された際に、自動的にパブリックIP を取得して Route53 のレコードに反映をしてくれます。

やってみる

前提

今回の環境では AWS CLI 2 を使用しています。

  • AMI
    • Amazon Linux 2 AMI (HVM)
  • AWS CLI2
    • aws-cli/2.1.24 Python/3.7.3 Linux/4.14.214-160.339.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
  • Route53 に既に任意のドメインを登録済み
    • パブリックとプライベート問わない

準備

今回は検証用として、 test01.example.me という検証用のプライベートのホストゾーンを用意致します。

シェルスクリプトファイルの準備

手動での変更箇所

  • DOMAIN_NAME="ドメイン名を入力"(example.me)
  • SUB_NAME="サブドメイン名を入力"(test01)
    • 不要な場合はコメントアウト
  • HOSTED_ZONE_ID="ZONE-IDを入力"

各項目に対する解説

項目 内容
Changes 変更内容
Action 変更の種類(UPSERT)
ResourceRecordSet 変更対象レコードの情報
Name レコード名
Type レコードタイプ
TTL レコードに関する情報をキャッシュする時間
ResourceRecords 値/トラフィックのルーティング先
  • ファイル名 : route53.sh
  • ファイル場所 : /home/ec2-user/work/route53.sh
#!/bin/bash
DOMAIN_NAME="example.me"
SUB_NAME="test01"
IP_ADDRESS=`curl -s http://169.254.169.254/latest/meta-data/public-ipv4`

HOSTED_ZONE_ID="ZONE-IDを入力"

BATCH_JSON='{
  "Changes": [
    { "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "'${SUB_NAME}'.'${DOMAIN_NAME}'",
        "Type": "A",
        "TTL" : 300,
        "ResourceRecords": [
          { "Value": "'${IP_ADDRESS}'" }
        ]
      }
    }
  ]
}'

aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID}  --change-batch "${BATCH_JSON}"

Systemd/サービスユニットの準備

  • ファイル名 : route53_set.service
  • ファイル場所 : /etc/systemd/system/route53_set.service
[Unit]
Description= Route53 Set And Timer
After=network-online.target

[Service]
ExecStart= /bin/bash /home/ec2-user/work/route53.sh
WorkingDirectory=/home/ec2-user/work
Type=oneshot
User=ec2-user
Group=ec2-user

[Install]
WantedBy=multi-user.target

Type=oneshot : 一度だけコマンドを実行するタイプのサービスの場合に利用し、コマンドが終了したら起動完了と判定して、サービスも終了したものと認識。

Unit が Service として認識されたか確認

コマンドを実行して表示される事を確認

$ sudo systemctl list-unit-files --type=service | grep route53
route53_set.service                           disabled

デーモンリロードの実行

デーモンリロード(daemon-reload)とは、Unitファイルに加えた変更を読み込むためのものになります。

$ sudo systemctl daemon-reload

起動と自動起動の設定

下記コマンドでサービス起動と自動起動の設定が可能になります。

$ sudo systemctl enable --now route53_set.service

別タブで $ sudo journalctl -f を実行して結果を確認していきましょう。

2月 06 16:28:11 パブリックIP systemd[1]: Starting Route53 Set And Timer...
2月 06 16:28:13 パブリックIP bash[3335]: {
2月 06 16:28:13 パブリックIP bash[3335]: "ChangeInfo": {
2月 06 16:28:13 パブリックIP bash[3335]: "Id": "/change/XXXXXXXXXXXXXXX",
2月 06 16:28:13 パブリックIP bash[3335]: "Status": "PENDING",
2月 06 16:28:13 パブリックIP bash[3335]: "SubmittedAt": "2021-02-06T16:28:12.979000+00:00"
2月 06 16:28:13 パブリックIP bash[3335]: }
2月 06 16:28:13 パブリックIP bash[3335]: }
2月 06 16:28:13 パブリックIP systemd[1]: Started Route53 Set And Timer.

最後に

以上となります。

始めて AWS CLI と Systemd を使って Route53 のレコードの変更を試しましたが、物凄く便利でした。 Systemd は多機能すぎて、全部は覚えれないので今回は、Type=oneshot だけを覚えていってください!!

会社にJOINしてから約1週間が経ちましたが、若干まだ緊張していてますが、既に楽しい。