この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
テクニカルサポート部の 丸屋 正志(まるちゃん)です。
参考にしたサイト一覧
- AWS CLI Command Reference CLIchange-resource-record-sets
- AWS CLI で Route53 のホストゾーンのレコードを操作してみた
- AWSで構築した環境にありがちなシェルスクリプトたち まとめ
今回は、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週間が経ちましたが、若干まだ緊張していてますが、既に楽しい。