AWSのRoute53を利用しても同様のことができますが、こちらだと利用料金がかからないのと、複数のサービスを利用するの仕組みを理解しつつできるのでこちらの方法でアドレス解決しています。
#必要なプロセス
- ドメインを取得
- 動的に割り当てられるEC2のIPアドレスを、DDNSサービスに通知するようにsystemdを利用して設定
- DDNSサービスを利用して、動的に割り当てられるIPとドメイン名を紐づける。
インターネットからドメイン名でアクセスしようとする際に、アドレス解決(ドメイン名とIPアドレスの紐づけ)ができていないと、どこにアクセスしたらいいのか分かりません。
特に動的にIPを割り当てられるEC2では、自動でアドレス解決をしてくれる手段がないと面倒です。
ドメインにアクセスしようとする際の流れは、
- ドメイン名でアクセス。
- Freenomでアドレス解決のできるサーバー(ネームサーバー)を探します。(あらかじめ設定する必要あり)
- ネームサーバーからアクセス元へIPアドレスを返す。(Aレコード)
- アクセスできるようになる。
ドメインを取得
Freenomでドメインを取得。
動的に割り当てられるEC2のIPアドレスを、DDNSサービスに通知するようにsystemdを利用して設定
以下のスクリプトを実行することでMyDNSへ自分のIPアドレスを通知することができる。
(/etc/rc.d/
配下に置いておいてね。)
#!/bin/bash
#ID="mydnsのMasterID"
#PASS="mydnsのPassword"
#wget -o - 'https://$ID:$PASS@www.mydns.jp/login.html'
wget -o - 'https://{mydnsのMaterID}:{mydnsのPASS}@www.mydns.jp/login.html'
(3行コメントアウトにしているのは、なぜかうまくいかない為です。IDとPASSをベタ打ちにすればうまくいきます。)
しかし、起動の度にこれを実行させるのはさすがに手間がかかる。
その為、こちらのスクリプトを起動後に自動で実行してくれるように設定する。
ただ起動後に実行すればいいというわけではなく、インターネットに接続の確認後に上記スクリプトを実行しなければならないので/etc/rc.local
や~/.bashrc
に書いたり、crontab -e
に追記すればいいわけではない。
これの実現方法として、daemon化したプロセスとして実行させる。具体的には、.serviceファイルを作り、適切に配置する。
.serviceファイルの書き方は以下。
[Unit]
Description=Initialize environment variables.
After=network.target
[Service]
Type=oneshot
User=root
Group=root
ExecStart=/etc/rc.d/MyDNSNotification.sh
[Install]
WantedBy=default.target
こちらの.servieファイルを/etc/systemd/system/
配下に置く。
そして、chmod ugo+x
で実行権限を付与しておきます。
ここで、sudo systemctl enable MyDNSNotification
で有効化し、sudo systemctl start MyDNSNotification
でサービススタートすると、MyDNSに通知ができるようになっているはずです。
DDNSサービスを利用して、動的に割り当てられるIPとドメイン名を紐づける。
DDNSサービスは、MyDNSを利用する。
取得したら、MyDNSのネームサーバーをドメイン取得したFreenomにて設定する。
Freenomにて、ServiceからMyDomainsを開く
紐づけたいドメイン名の欄の右にあるManage Domainを開く。
Management Toolsの中のNameserversを開く。
Use Custom Nameserversを選択し、Nameserver名を記入。(画像では、MyDNSのNameserver記入済み)
MyDNSのNameserverの情報は、MyDNSのDOMAIN INFO内のある。
以上の設定全て終了したら、EC2を再起動してMyDNSにログインし、IPアドレスが更新されていることを確認する。
それ以後、ドメイン名でEC2にアクセスできるようになる。