本記事で学べること
本記事は「AWSの環境構築で学ぶトラブルシューティング」シリーズの第3回目となっています。
本シリーズは、実際に手を動かしながらWSの環境構築とその過程でトラブルが起こった場合の対処方法や問題の特定方法などを体系的に学べる内容になっています。また、トラブルシューティングのセクションでは、遭遇した問題の問題の特定方法や解決方法について解説します。
今回は、Route53を使用し、特定のインスタンスにドメインでアクセスできるようにする環境を構築します。AWSのプライベートネットワークを介した安全な通信を利用する方法を学習します。
「AWSの環境構築で学ぶトラブルシューティング」シリーズはこちら
https://envader.plus/article/259
https://envader.plus/article/260
環境構築のゴール
本記事における、環境構築のゴールを以下の図にまとめました。Webサーバーにドメインでアクセスできるようにすることがゴールです。
環境構築
現時点の環境は、以下の図のようになっており、こちらに追加する形で環境を構築します。
現時点までの環境構築に関しては、Part 1の以下の記事をご参照ください。
https://envader.plus/article/259
使用する環境の情報
以後の説明で出てくる環境の情報を以下にまとめました。
インスタンス名 | 呼称 | パブリックIPアドレス |
---|---|---|
networking-1-ec2-public | 1-ec2 | 52.68.48.29 |
networking-2-ec2-public | 2-ec2 | 18.182.65.169 |
以後の説明では、networking-1-ec2-public
は1-ec2
、networking-2-ec2-public
は2-ec2
と簡略化して呼称します。
nginxのインストール
パブリックサブネットに配置したインスタンス(2-ec2
)をWebサーバーとして構築します。Webサーバーのソフトウェアはnginxを使用します。
-
nginxのインストール
2-ec2
にSSH接続し、以下のコマンドを実行します。$ sudo apt update $ sudo apt install nginx -y
インストール後はインストールが問題なく行えているか確認しましょう。
http://18.182.65.169
(2-ec2
のパブリックIP)にアクセスし、nginxのデフォルトのページが表示されればインストール完了です。
Route 53
今回はRoute 53を使用し、2-ec2
にドメインでアクセスできるようにします。
Route53は、AWSのDNSのサービスです。Route53では、インターネットで通用するパブリックなDNSの管理や、VPC内だけで通用するプライベートなDNSの管理ができます。
パブリックなDNSの設定をする場合はドメインの購入が必要ですので、今回はVPC内だけで通用するプライベートなDNSを使用します。
-
ホストゾーンの設定
ホストゾーンとは、ドメイン名の問い合わせに対して、どういう回答をするのかという設定をまとめたものです。
マネージメントコンソールで「Route 53」と検索し、ホストゾーンのセクションからホストゾーンの作成をクリックします。
設定項目大枠 設定項目 入力/選択項目 ホストゾーン設定 ドメイン名 networking-1-vpc.domain ホストゾーン設定 タイプ プライベートホストゾーン ホストゾーンに関連付けるVPC リージョン 東京 ホストゾーンに関連付けるVPC VPC ID networking-1-vpc 作成が完了すると、
networking-1-vpc.domain
というホストゾーンが作成されます。このホストゾーンはnetworking-1-vpc
内で通用するDNSのホストゾーンです。
2-ec2にドメインで通信できるかの確認
2-ec2
に対し、ドメインでアクセスできるようになったかどうかを確認します。プライベートホストゾーンで設定したので、ブラウザからはアクセスできません。そのため、1-ec2
にSSH接続し、curl
コマンドを実行します。
curl
コマンドは、様々な通信プロトコルでデータの送受信を行うことができます。また、-v
オプションを付けて実行すると、HTTPレスポンスの情報も取得することができます。
$ curl -v http://networking-1-vpc.domain
* Could not resolve host: networking-1-vpc.domain
* Closing connection 0
curl: (6) Could not resolve host: networking-1-vpc.domain
Could not resolve host: networking-1-vpc.domain
というエラーが起こりました。
トラブルシューティング
Could not resolve host: networking-1-vpc.domain
というエラーは、networking-1-vpc.domain
というホストの名前解決できなかったというエラーです。現状では以下の図のように、全ての名前解決が失敗している可能性があります。
そのため、接続元の1-ec2が名前解決がどこまでできるか、ということを調べていきます。
名前解決ができるかを調べるコマンド
DNSサーバーからの情報を取得することで名前解決のテストを行えるコマンドを以下の表にまとめました。
コマンド | 説明 |
---|---|
dig <hostname> | DNSルックアップのためのコマンドで、nslookupよりも詳細な情報を提供します。DNSのトラブルシューティングに適しています。 |
nslookup <hostname> | ドメイン名に対するIPアドレスをDNSサーバーに問い合わせます。DNSの問題を診断する際に有用です。 |
host <hostname> | DNSルックアップを行い、ホスト名に対するIPアドレスやその他のDNSレコードを取得します。出力が比較的シンプルです。 |
今回は詳細な情報を得られるdig
を実行して名前解決のテストを行います。
-
networking-1-vpc.domain
にdig
を実行する1-ec2
にSSH接続している状態で以下のコマンドを実行します。$ dig networking-1-vpc.domain ; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> networking-1-vpc.domain ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5582 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;networking-1-vpc.domain. IN A ;; AUTHORITY SECTION: networking-1-vpc.domain. 300 IN SOA ns-1536.awsdns-00.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sat Nov 04 08:39:15 UTC 2023 ;; MSG SIZE rcvd: 139
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
の行に注目してください。ANSWER
が0と返されています。これは、名前解決ができていないことを意味します。試しにGoogleのドメインが名前解決できるか確認します。
$ dig google.com ; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> google.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26675 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 163 IN A 142.250.196.142 ;; Query time: 4 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) ;; WHEN: Sat Nov 04 08:41:47 UTC 2023 ;; MSG SIZE rcvd: 55
ANSWER
が1と返され、google.comのドメインのIPアドレスが返されており、名前解決ができていることが確認できます。その他、example.comなどのメジャーなドメインの名前解決を試してみてください。
トラブルシューティングの結果
ここまでのトラブルシューティングで、以下の図のように問題のある箇所を狭めることができました。
つまり、名前解決自体は行えるが、networking-1-vpc.domain
というホストだけが名前解決できないことが確認できました。
Route 53の設定を確認する
マネージメントコンソールでRoute 53 → ホストゾーンセクションのページへ移動します。ホストゾーン名networking-1-vpc.domain
の設定を確認します。
まず、ホストゾーンの詳細から、関連付けられたVPCのVPCIDが、networking-1-vpc
であることを確認します。
次に、レコードの確認をします。現時点で登録されているレコードが以下になります。
-
レコードとは
レコードとは、ドメイン名システム(DNS)の基本的な要素であり、インターネット上のあらゆるドメインに対して、そのドメインが何を指し示すのか、どのようにアクセスすれば良いのかを定義しています。今回触れるレコードに絞り、そのレコードのタイプを以下にまとめました。
レコードタイプ 説明 SOA ドメインの権威情報を提供し、ネームサーバーの主要情報、ドメインの連絡先メールアドレス、データのリフレッシュレートなどを含みます。 NS そのドメインのネームサーバー情報を指定します。 A ドメイン名をIPv4アドレスに変換します。 ここで重要なのがAレコードです。今回行いたいことは、
2-ec2
にドメインでアクセスできるようにすることです。ここまでの演習ではホストゾーンを作成しましたが、2-ec2
のIPアドレスをドメインと紐づける作業をしていませんでした。例えるならば、ホストゾーンはアドレス帳です。アドレス帳だけ作成しても意味はありません。アドレス帳に名前と電話番号の情報を合わせて登録する必要があります。
-
レコードの追加
作成したホストゾーンにレコードを追加します。レコードの追加とは、IPアドレスとドメインを紐付ける作業です。レコードの作成をクリックします。
設定項目 入力/選択項目 レコード名 2-ec2-public 値 18.182.65.169(2-ec2のパブリックIP) 作成が完了するとAレコードとして登録されます。Aレコードは、ドメインとIPアドレス(正確にはIPv4のIPアドレス)の名前解決に使用されるレコードです。
※作成したレコードの反映には時間がかかる場合があります
名前解決の確認
作成したAレコードの2-ec2-public.networking-1-vpc.domain
ができるか確認します。1-ec2
にSSH接続し、以下のコマンドを実行します。
$ dig 2-ec2-public.networking-1-vpc.domain
; <<>> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu <<>> 2-ec2-public.networking-1-vpc.domain
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60742
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;2-ec2-public.networking-1-vpc.domain. IN A
;; ANSWER SECTION:
2-ec2-public.networking-1-vpc.domain. 300 IN A 18.182.65.169
;; Query time: 3 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Nov 05 10:50:43 UTC 2023
;; MSG SIZE rcvd: 81
dig
の結果、ANSWERが1と返されています。ANSWERセクションでは.2-ec2-public.networking-1-vpc.domain
のIPアドレスは18.182.65.169
となっており、正しく名前解決できているのか確認できました。
2-ec2にドメインで通信できるかの確認
2-ec2
にドメインで通信できるか、curl
コマンドを使用して確認します。
$ curl -v http://2-ec2-public.networking-1-vpc.domain
* Trying 13.231.5.227:80...
* Connected to 2-ec2-public.networking-1-vpc.domain (18.182.65.169) port 80 (#0)
> GET / HTTP/1.1
> Host: 2-ec2-public.networking-1-vpc.domain
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.18.0 (Ubuntu)
< Date: Sun, 05 Nov 2023 11:00:48 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Sat, 04 Nov 2023 06:32:28 GMT
< Connection: keep-alive
< ETag: "6545e57c-264"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 2-ec2-public.networking-1-vpc.domain left intact
curl
の結果、HTTPレスポンスで200 OK
とnginxのデフォルトページのhtmlが返されました。問題なく2-ec2
にドメインで通信できていることが確認できました。
本記事の片付け
Route 53の料金ですが、ホストゾーン、レコードともに重量課金ですが、ホストゾーンに関して、AWS公式には以下のように載っています。
作成後 12 時間以内に削除されたホストゾーンについては無料となっています
不要な料金の発生を防ぐためにも、使用予定がなければ放置せずにレコードと合わせて削除することをおすすめします。Route 53で作成したホストゾーン、レコードの削除手順は以下を参考にしてください。
-
レコードの削除
手動で作成したレコードは手動で削除する必要があります。レコード名
2-ec2-public.networking-1-vpc.domain
を選択し、「レコードを削除」を選択します。 -
ホストゾーンの削除
「ゾーンを削除する」を選択し、削除するホストゾーンを確認し、「削除」と入力し、削除します。
まとめ
今回はRoute 53の環境構築をしながらDNSに関して触れました。
トラブルシューティングの基本はエラーログを良く読むことです。エラーログにエラー内容が書いてあります。エラーがなぜ起こったのか、どうしたら良いのかはやはり知識や経験が必要になってきます。そのため、AWSのサービスを触れる際にはそのサービスが提供する基礎概念を理解することが重要です。
引き続き本シリーズを学習していただき、トラブルシューティングのレベルを上げていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.08.01
【IaC】Terraformで定義したinput変数への値の渡し方について解説
Terraformの変数にはinput、local、outputの3つの種類があります。今回はこの3つの変数のうちの一つ、input変数への値の渡し方について解説していきます。
- インフラエンジニア
- AWS
2023.07.25
クラウド系エンジニア初学者が目指すべきAWSアソシエイト3冠
アソシエイトレベルは、基礎レベルをクリアした中級者的な立ち位置であり、難易度も中程度と少しだけ高く設定されています。3つある資格を全て取得すれば、見事「3冠」と名乗ってもよいでしょう。
- AWS
2023.08.30
Terraformの組み込み関数とは?elementやlookupなどの基本構文と使用例を学ぶ
こちらの記事では、Terraformの組み込み関数についての基本的な構文と使用例について解説します。
- インフラエンジニア
- AWS