本記事で学べること
本記事は「AWSの環境構築で学ぶトラブルシューティング」シリーズの第1回目となっています。
本シリーズは、実際に手を動かしながらWSの環境構築とその過程でトラブルが起こった場合の対処方法や問題の特定方法などを体系的に学べる内容になっています。また、トラブルシューティングのセクションでは、遭遇した問題の問題の特定方法や解決方法について解説します。
今回は、異なるVPCにいるインスタンス間同士の通信を行える環境を構築します。VPCピアリングを用いて、インターネットを介さない安全な通信を実現する方法を学習します。
AWSは触ったことはあるけど該当のサービスは触ったことがないという方、トラブルシューティングの方法を学習したいという方は、ぜひシリーズを通して学習していきましょう。
「AWSの環境構築で学ぶトラブルシューティング」シリーズはこちら
https://envader.plus/article/260
環境構築のゴール
本記事における、環境構築のゴールを以下の図にまとめました。異なるVPCにいるインスタンス間をプライベートIPアドレスで通信が行えるようにすることがゴールです。
環境構築
まず、以下の図のような環境を2つ構築します。実際には異なる3つのAZに配置していますが、図では省略しています。
VPCの作成
1つ目は以下の設定で作成してください。なお、名前タグは任意の名前で構いません。ここで作成した名前タグに合わせて他の機能の設定も行っていきます。
設定項目 | 入力/選択項目 |
---|---|
作成するリソース | VPCなど |
名前タグの自動生成 | 自動生成にチェック, networking-1 |
IPv4CIDRブロック | 10.0.0.0/16 |
IPv6CIDRブロック | IPv6CIDRブロックなし |
テナンシー | デフォルト |
AZの数 | 3 |
パブリックサブネットの数 | 3 |
プライベートサブネットの数 | 3 |
NATゲートウェイ | なし |
VPCエンドポイント | なし |
DNSオプション | DNSホスト名を有効化, DNS解決を有効化の双方にチェック |
2つ目のVPCは、先ほど作成した1つ目のVPCと以下の2点だけ変更して同様に作成してください。
設定項目 | 入力/選択項目 |
---|---|
名前タグの自動生成 | 自動生成にチェック, networking-2 |
IPv4CIDRブロック | 172.16.0.0/16 |
セキュリティグループの作成
※ここでの設定は、あくまで学習目的用の設定です。本番環境などの設定ではないということをご理解ください。
作成した2つのVPC用のセキュリティグループを作成します。
-
networking-1-vpc用のセキュリティグループ
設定項目 入力/選択項目 セキュリティグループ名 networking-1-sg 説明 networking-1-sg vpc networking-1-vpcを選択 インバウンドルール すべてのトラフィック(タイプ), Anywhere-IPv4(リソースタイプ)を追加 -
networking-2-vpc用のセキュリティグループ
設定項目 入力/選択項目 セキュリティグループ名 networking-2-sg 説明 networking-2-sg vpc networking-2-vpcを選択 インバウンドルール すべてのトラフィック(タイプ), Anywhere-IPv4(リソースタイプ)を追加
キーペアの作成
ローカルからEC2にアクセスするためのSSHキーを作成します。EC2 Instance Connectを使用する場合はこちらのセクションは飛ばして構いません。
-
SSHキーの作成
ローカルで以下のコマンドを実行後、エンターを3回押します。
$ ssh-keygen -t ed25519 -f local-key ... The key's randomart image is: +--[ED25519 256]--+ | =X@@o.+o | | ..*.X=*. | | o +.O+O | | . o.E.++o | | oo.S. . | | o . o | | . o | | ... | | .oo | +----[SHA256]-----+
-
キーペアのインポート
まず、作成した公開鍵の値をクリップボードにコピーします。
$ ls ~/.ssh local-key local-key.pub $ cat ~/.ssh/local-key.pub # 出力された値をコピー
AWSマネージメントコンソールから、キーペアセクションにいき、キーペアをインポートします。
設定項目 入力/選択項目 名前 local-key キーペアファイル id_ed25519.pubの値を貼り付けする
インスタンスを起動
作成した2つのVPC内に設置するインスタンスを作成します。各VPCのパブリックサブネットに1つのインスタンスを作成します。
EC2 Instance Connectを使用する場合はキーペアは無しでインスタンスを作成してください。
-
networking-1-vpcに設置するインスタンス
設定項目 入力/選択項目 名前 networking-1-ec2-public AMI Ubuntu Server 22.04 LTS インスタンスタイプ t2.micro キーペア local-key VPC networking-1-vpc サブネット public1 パブリックIPの自動割り当て 有効化 セキュリティグループ networking-1-sg -
networking-2-vpcに設置するインスタンス
1つ目のインスタンスと異なる箇所だけ表示します。
設定項目 入力/選択項目 名前 networking-2-ec2-public VPC networking-2-vpc セキュリティグループ networking-2-sg
インスタンス情報
作成した環境の情報を以下にまとめました。通信コマンドを実行する際には、インスタンスに紐付いたIPアドレスに対して実行しますので、どこに対して通信しているのか分からなくなった場合に参照してください。
インスタンス名 | 呼称 | パブリックIPアドレス | プライベートIPアドレス |
---|---|---|---|
networking-1-ec2-public | 1-ec2 | 52.69.129.48 | 10.0.10.186 |
networking-2-ec2-public | 2-ec2 | 54.238.78.203 | 172.16.0.85 |
以後の説明では、networking-1-ec2-public
は1-ec2
、networking-2-ec2-public
は2-ec2
と簡略化して呼称します。
ネットワークトラブル
主なネットワークトラブルには以下のようなものが考えられます。
ネットワークトラブル | 行うべきこと |
---|---|
インターネットや特定のネットワークリソース(ウェブサイト、サーバーなど)への接続が正常に行われていない | ネットワーク接続の確認 |
ネットワーク通信に遅延が発生している | ネットワーク遅延の特定 |
ネットワーク通信でパケットロスが発生している | パケットロスの原因分析 |
データパケットのルート(経路)が不明 | ネットワーク経路の確認 |
ネットワークホップでの遅延の特定 | 各ホップでの遅延時間の確認 |
上記の表にあるようなネットワークトラブルのトラブルシューティングには、ping
やtraceroute
を使用します。
-
ping
ping
コマンドは、ホスト同士のネットワークの疎通状況を確認するために使用されます。また、ネットワーク遅延(レイテンシ)やパケットロスも測定します。ping
は、ICMP(Internet Control Message Protocol)エコーリクエストとエコーリプライメッセージを使用して、指定したホストとの接続性をテストします。 -
traceroute(Windowsではtracert)
traceroute
コマンドは、ローカルホストからリモートホストまでのネットワークパスを表示するために使用されます。このコマンドは、パケットが目的地に到達するまでに通過する中間ホスト(ルーターなど)のリストを提供します。これにより、ネットワークの問題がどこで発生しているのかを特定するのに役立ちます。
通信先のパブリックIPに対してpingを実行する
まず初めに、1-ec2
にSSH接続します。インスタンスに接続するためのコマンドはインスタンスの接続 → SSHクライアントの例:という箇所にコマンドが用意されています。ローカルの作成した秘密鍵のあるディレクトリ(~/.ssh
)から実行してください。
ping
でネットワークの接続を確認します。送信元は1-ec2
、送信先は2-ec2
のパブリックIPです。
$ ping 54.238.78.203
ping 54.238.78.203
PING 54.238.78.203 (54.238.78.203) 56(84) bytes of data.
64 bytes from 54.238.78.203: icmp_seq=1 ttl=63 time=0.439 ms
64 bytes from 54.238.78.203: icmp_seq=2 ttl=63 time=0.568 ms
64 bytes from 54.238.78.203: icmp_seq=3 ttl=63 time=0.522 ms
64 bytes from 54.238.78.203: icmp_seq=4 ttl=63 time=0.531 ms
64 bytes from 54.238.78.203: icmp_seq=5 ttl=63 time=0.620 ms
64 bytes from 54.238.78.203: icmp_seq=6 ttl=63 time=0.564 ms
64 bytes from 54.238.78.203: icmp_seq=7 ttl=63 time=0.506 ms
64 bytes from 54.238.78.203: icmp_seq=8 ttl=63 time=0.519 ms
64 bytes from 54.238.78.203: icmp_seq=9 ttl=63 time=0.490 ms
64 bytes from 54.238.78.203: icmp_seq=10 ttl=63 time=0.431 ms
--- 54.238.78.203 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9209ms
rtt min/avg/max/mdev = 0.431/0.519/0.620/0.054 ms
ping
コマンドの結果は、10個のパケットが送信され、すべて正常に受信され、パケットロスは0%です。これは、1-ec2
から2-ec2
のパブリックIP 54.238.78.203
へのネットワーク接続が正常であることを示しています。
通信先のパブリックIPに対してtracerouteを実行する
traceroute
ではネットワークの接続の評価やパケットがインターネットを通じて目的地までどのように移動するかを確認することができます。
通信できることが確認できた通信を、traceroute
で確認します。送信元は1-ec2
、送信先は2-ec2
です。traceroute
は、通信できなかった場合は何も出力されないので、パブリックIPに対してのみ実行します。
$ traceroute 54.238.78.203
traceroute to 54.238.78.203 (54.238.78.203), 64 hops max
1 244.5.0.11 2.206ms 8.130ms 8.384ms
2 54.238.78.203 0.493ms 0.368ms 0.362ms
tracerouteの結果は、目的のIP(54.238.78.203
)まで1ホップ(転送・中継設備の数)で到達し、ホップからの応答時間が比較的短いです。これは、目的IPまでの経路が効率的であり、ネットワークに大きな遅延がないことを示しています。
通信先のプライベートIPに対してpingを実行する
次は、2-ec2
のプライベートIPに対してpingを実行します。
$ ping 172.16.0.85
PING 172.16.0.85 (172.16.0.85) 56(84) bytes of data.
--- 172.16.0.85 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8173ms
ping
コマンドの結果は、9個のパケットが送信されましたが受信されたパケットは0個で、パケットロスが100%です。これは、1-ec2
から2-ec2
のプライベートIP 172.16.0.85
へのネットワーク接続が正常ではないことを示しています。
通信が届かなかった原因は、2つのインスタンスが異なるVPCにいるためです。通信を行いたいインスタンスが異なるVPCにいる場合、通常、プライベートIPで通信することはできません。
VPCピアリングを利用する
VPCピアリングを使用すると、異なるVPCにいるインスタンス間のプライベートIPアドレスでの通信を可能にします。現在の環境にVPCピアリングを導入していきます。
-
VPCピアリングの設定
「ピアリング接続を作成」をクリック
設定項目大枠 設定項目 入力/選択項目 名前 networking-peering ピアリング接続するローカルVPCを選択 VPC ID networking-1-vpc ピアリング接続するもう一方のVPCを選択 自分のアカウント 自分のアカウント ピアリング接続するもう一方のVPCを選択 リージョン このリージョン ピアリング接続するもう一方のVPCを選択 VPC ID networking-2-vpc VPCピアリングは別のAWSアカウントとも接続可能なため、承諾操作が必要です。作成後、アクション → リクエストを承認 を実行してください。
-
ルーティングの設定
1-ec2
から2-ec2
に通信を送る場合、ルートテーブルに設定を追加する必要があります。1-ec2
に紐付けられているサブネット情報からルートテーブルページに行き、以下のルートを追加します。設定項目 入力/選択項目 送信先 172.16.0.0/16 ターゲット ピアリング接続 → networking-peering この設定は、
1-ec2
から2-ec2
が所属するVPC(172.16.0.0/16
)宛の通信はnetworking-peering
というピアリング接続を使用する、という意味です。この設定により、1-ec2
から2-ec2
宛に通信がルーティングされるようになります。
通信先のプライベートIPに対してpingを送る
1-ec2
から2-ec2
のプライベートIPに通信を送る設定を行ったので、再度2-ec2
のプライベートIPに対してpingを実行します。
$ ping 172.16.0.85
PING 172.16.0.85 (172.16.0.85) 56(84) bytes of data.
--- 172.16.0.85 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5116ms
VPCピアリングを適用し、異なるVPC間に存在するインスタンス同士をプライベートIPで通信できるように設定したにも関わらず、1-ec2
から2-ec2
へのpingが失敗しました。
トラブルシューティング
現在、ping
を実行して分かった情報だけだと、以下の図のようにどこで問題が起こったのか分かりません。
まずはどこで問題が起こっているのか特定することが必要です。まずは1-ec2
から2-ec2
への通信が正しく届いているか確認します。この確認にはtcpdump
コマンドが有効です。
tcpdump
は、ネットワークパケットをキャプチャして分析するためのコマンドラインツールです。tcpdump
を使用して、特定のインスタンスが他のインスタンスからの通信を受信しているか確認できます。
別のターミナルないしはブラウザを開き、2-ec2
にSSH接続し、tcpdump
を実行します。
# 2-ec2で実行
$ sudo tcpdump -n icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
実行すると、ネットワークパケットをキャプチャする状態、つまり通信を待ち受ける状態になります。この状態の2-ec2
に対し、1-ec2
からping
を送ります。
# 1-ec2で実行
$ ping 172.16.0.85
ping
実行後、2-ec2
でログが流れ始めます。
$ sudo tcpdump -n icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
01:48:34.948270 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 1, length 64
01:48:34.948295 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 1, length 64
01:48:35.960765 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 2, length 64
01:48:35.960791 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 2, length 64
01:48:36.984817 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 3, length 64
01:48:36.984844 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 3, length 64
01:48:38.008769 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 4, length 64
01:48:38.008808 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 4, length 64
01:48:39.032712 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 5, length 64
01:48:39.032736 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 5, length 64
01:48:40.056771 IP 10.0.10.186 > 172.16.0.85: ICMP echo request, id 6, seq 6, length 64
01:48:40.056795 IP 172.16.0.85 > 10.0.10.186: ICMP echo reply, id 6, seq 6, length 64
12 packets captured
12 packets received by filter
0 packets dropped by kernel
10.0.10.186
は1-ec2
のプライベートIPアドレス、172.16.0.85
は2-ec2
のプライベートIPアドレスです。
tcpdump
の結果から確認できることは、1-ec2
から2-ec2
へ通信が送信され、その通信を応答しており、1-ec2
から2-ec2
への通信は問題ない、ということが確認できました。
トラブルシューティングの結果
ここまでのトラブルシューティングで、以下の図のように問題のある箇所を狭めることができました。
次に問題視するべきは、1-ec2から送られたpingを返してはいるが、そのpingはルートテーブルに適切に返されているのか?という部分です。ルーティングの設定では、1-ec2
から2-ec2
宛の通信の設定は行いましたが、2-ec2
から1-ec2
宛の設定は行っていませんでした。それが原因ではないか?と問題を特定することができます。
では、2-ec2
から1-ec2
宛の通信の設定も適切に行えるように設定します。2-ec2
に紐付けられているサブネット情報からルートテーブルページに行き、以下のルートを追加します。
項目 | 値 |
---|---|
送信先 | 10.0.0.0/16 |
ターゲット | ピアリング接続 → networking-peering |
再度通信先のプライベートIPに対してpingを実行する
2-ec2
に紐付いたルートテーブルを設定したので、1-ec2
から2-ec2
のプライベートIPに対してping
を送ります。
$ ping 172.16.0.85
PING 172.16.0.85 (172.16.0.85) 56(84) bytes of data.
64 bytes from 172.16.0.85: icmp_seq=1 ttl=64 time=0.486 ms
64 bytes from 172.16.0.85: icmp_seq=2 ttl=64 time=0.467 ms
64 bytes from 172.16.0.85: icmp_seq=3 ttl=64 time=0.454 ms
64 bytes from 172.16.0.85: icmp_seq=4 ttl=64 time=0.467 ms
64 bytes from 172.16.0.85: icmp_seq=5 ttl=64 time=0.438 ms
--- 172.16.0.85 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms
rtt min/avg/max/mdev = 0.438/0.462/0.486/0.015 ms
今度は問題なくpingが返ってきており、パケットロスもなく、異なるVPC間でもプライベートIPで通信が行えていることが確認できました。無事、環境構築することができました。
本記事の片付け
VPCピアリングは作成自体は無料ですが、データ転送の際に料金が発生します。不要なコストを削減するために、VPCピアリングを削除する手順について解説します。
-
VPCピアリングの削除
VPCのページからピアリング接続セクションへいきます。
networking-peering
を選択し、アクション → ピアリング接続を削除を選択します。「関連するルートテーブルエントリを削除」を選択し、「削除」と入力し、ピアリング接続を削除します。
まとめ
本記事ではAWSで環境構築を行いながら、通信に関するトラブルシューティングを実践しました。特に、通信の問題が発生した場合の効果的な問題解決のための切り分け方に焦点を当てました。
環境構築に限らず何らかのトラブルが起こった場合はどこに問題が起こったのかを特定することは非常に難易度が高いです。トラブルシューティングのレベルを上げるためには様々な事象に出会い、解決するしかありません。
引き続き本シリーズを学習していただき、トラブルシューティングのレベルを上げていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.07.29
インフラ・クラウドエンジニア必見!AzureとAWSのRBACの違いを徹底解説
クラウドサービスを利用する上で、セキュリティとアクセス管理は非常に重要です。特にAzureとAWSは、それぞれ独自のRBAC(ロールベースアクセス制御)を提供しており、その違いを理解することが求められます。本記事では、初心者インフラ・クラウドエンジニアに向けて、AzureとAWSのRBACの違いを詳しく解説します。
- AWS
- Azure
- サイバーセキュリティ
- インフラエンジニア
2024.06.23
ECSコンテナのAmazon Linux 2からAmazon Linux 2023へのブルーグリーンデプロイメント実践
この記事では、新人のAさんとベテランのBさんが協力してAmazon ECSのEC2起動タイプを使用し、Amazon Linux 2ベースのコンテナイメージからAmazon Linux 2023ベースのコンテナイメージへのブルーグリーンデプロイメントを実現する過程を紹介します。
- AWS
2024.04.17
Terraform活用法: AWS EC2 Auto ScalingGroupを構築してみよう
こちらの記事では、Amazon EC2 Auto Scalingの機能を[Terraform](https://www.terraform.io/)で実装する方法を解説します。
- AWS
- ハンズオン
- Terraform