6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ElasticIPを当てずにパブリックIPでドメインを半固定する

Last updated at Posted at 2017-12-24

ElasticIPを当てずにパブリックIPでドメインを半固定する

はじめに

ElasticIPを当てるとお金かかるなぁ~。でもこの環境は起動時に名前当ててアクセスしたいなぁ~。って思っている節約家のための記事

やっていることとしては、インスタンス起動時スクリプトでroute53に自身のPublic IPを登録しにいくだけ。

対象読者はaws-cli少し読めてsystemdが少し分かる人だと良いと思う。
書いたコードまるっと載せてるので、同じ環境でそのままやったらできると思う。

環境

AWSのAmazon Linux 2のt2.nano

ソフトウェア バージョン等
AWS CLI 1.14.8
Amazon Linux2 Amazon Linux 2 LTS Candidate AMI 2017.12.0.20171212.2 x86_64 HVM GP2

動作に必要なパッケージ

  • aws-cli
    • 当然ながらRoute53にリクエストするために必要。Amazon Linux2ならデフォで入ってるはず
    • awsコマンド実行に必要EC2Roleが当たっている or aws configureは既に終わっている前提
  • jq
    • jsonをパースするために利用。

準備するファイル3つ

Hosted Zone IDを確認するためのスクリプト

1回使い切りのファイル。HostedZoneのIDが分かる場合は使わなくてOK。

check_hosted_zone_id.shって名前でも付けて任意の場所に配置しておいてください。

sh check_hosted_zone_id.shで実行するとドメイン名入力を要求するので、Route53に登録しているドメインを入力してください。存在する場合はIDが出ます。

#! /bin/sh
echo "Enter your domain(e.x. uji52.com)"
read DOMAIN
aws route53 list-hosted-zones|jq '.HostedZones[]|select(.Name=="'${DOMAIN}'.")|.Id'

AWS CLIを使ってRoute53に値を登録しにいくスクリプト

このスクリプトを起動時に呼び出してRoute53の値を更新に向かいます

2行目のIDは上のスクリプトで出力されたIDを貼り付けておいてください。

/usr/local/etc/route53/dns_update.shという名前で配置してchmod +xで実行可能にしておいてください。

.oO(もっと良い置き場所ある気がしている)

#! /bin/sh
HOSTED_ZONE_ID="/hostedzone/ZXXXXXX525252"
IP_ADDR=`curl 169.254.169.254/latest/meta-data/public-ipv4 2> /dev/null`
DATE=`date`
sed "s/<%DATE%>/${DATE}/" < /usr/local/etc/route53/route53.json.template | sed "s/<%IP_ADDR%>/${IP_ADDR}/" > /usr/local/etc/route53/route53.json
aws route53 change-resource-record-sets --hosted-zone-id ${HOSTED_ZONE_ID} --change-batch file:///usr/local/etc/route53/route53.json

Route53にリクエストする為のjsonファイルのテンプレート

Route53は古くからのサービス故、CLIでもjsonファイルを送りこまなきゃ設定ができない子なので、送り込むためのjsonファイルをこんな感じで/usr/local/etc/route53/route53.json.templateという名前で配置。

Nameのところに、このインスタンスに付けたい名前を付けておきましょう。
UPSERTなので、なかったら作ってくれるし、あったら更新してくれるよ

{
  "Comment": "<%DATE%>",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "test.uji52.com.",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "<%IP_ADDR%>"
          }
        ]
      }
    }
  ]
}

実際に更新してみる

$ /usr/local/etc/route53/dns_update.sh
{
    "ChangeInfo": {
        "Status": "PENDING", 
        "Comment": "Sun Dec 24 06:45:45 UTC 2017", 
        "SubmittedAt": "2017-12-24T06:45:46.115Z", 
        "Id": "/change/ZXXXXXX525252"
    }
}

上記のようなログが出力されれば更新が完了しているので、実際にAWSマネジメントコンソールから確認してみると変更が確認できます。

自動起動にしてみる

正直systemdに詳しくないので自信は無いけどこんな感じで記述

ファイル名は/etc/systemd/system/route53.service

[Unit]
Description=DNS Update
After=network.target

[Service]
Type=simple
RemainAfterExit=yes
ExecStart=/usr/local/etc/route53/dns_update.sh

[Install]
WantedBy=multi-user.target

設定作ったらデーモンをリロードせあかんらしいから再起動してサービス起動して確認。

$ systemctl daemon-reload
$ systemctl start route53
$ systemctl status route53
● route53.service - DNS Update
   Loaded: loaded (/etc/systemd/system/route53.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sun 2017-12-24 06:10:24 UTC; 4s ago
  Process: 3534 ExecStart=/usr/local/etc/route53/dns_update.sh (code=exited, status=0/SUCCESS)
 Main PID: 3534 (code=exited, status=0/SUCCESS)

Dec 24 06:10:24 xxx systemd[1]: Started DNS Update.
Dec 24 06:10:24 xxx systemd[1]: Starting DNS Update...
Dec 24 06:10:26 xxx dns_update.sh[3534]: {
Dec 24 06:10:26 xxx dns_update.sh[3534]: "ChangeInfo": {
Dec 24 06:10:26 xxx dns_update.sh[3534]: "Status": "PENDING",
Dec 24 06:10:26 xxx dns_update.sh[3534]: "Comment": "Sun Dec 24 06:10:24...,
Dec 24 06:10:26 xxx dns_update.sh[3534]: "SubmittedAt": "2017-12-24T06:1...,
Dec 24 06:10:26 xxx dns_update.sh[3534]: "Id": "/change/ZXXXXXX525252"
Dec 24 06:10:26 xxx dns_update.sh[3534]: }
Dec 24 06:10:26 xxx dns_update.sh[3534]: }
Hint: Some lines were ellipsized, use -l to show in full.

更新ログが良い感じに出てるから、systemdで呼び出しはしっかりできてるっぽい。

ので、自動起動として登録して完了

$ systemctl enable route53

まとめ

すぐできるし作ろうと思うも、めんどくさくて結局やらんかったんです。
まぁ節約意識大事やと思うんで、日曜大工感覚で作成。

ざっくりしたメモとして残しているだけなので、手順に不足等あったらお教えくださいませ。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?