課題
プライベートサブネットに対し、SSM Agentを インストールしたEC2を配置しました。セッションマネージャー経由で接続を試みたところ、どうも疎通ができません。
解決に向けて
そこで思いあたったのがReachability Analyzerです。 存在自体は知っていたものの使ったことがなかったこともあり、せっかくなので試してみました。
構成
ネットワークはシンプルで、以下のようなよくある構成です。
ここに、Reachability Analyzerを構成します。
Terraformで記述しているので、リソースとしてはaws_ec2_network_insights_path
を作成しました。
EC2からインターネットゲートウェイへの80番ポートの疎通性を確認します。
diff --git a/main.tf b/main.tf index 6d73bc1..a6b3be3 100644 --- a/main.tf +++ b/main.tf @@ -72,3 +72,14 @@ resource "aws_iam_role_policy_attachment" "default" { policy_arn = data.aws_iam_policy.systems_manager.arn } +# 接続性の確認 +resource "aws_ec2_network_insights_path" "gitlab" { + source = aws_instance.gitlab.id + destination = aws_internet_gateway.igw.id + destination_port = 80 + protocol = "tcp" + + tags = { + Name = "GitLab to Internet Gateway" + } +}
これでterraform apply
を実行すると、以下のようなパスが構築されます。
「パスの分析」を行って1分程度待つと、結果が出ます。
ルートテーブル rtb-018aaf4d4d950bb1e には igw-07b97c1fd1312ddf4 への適切なルートがありません。rtb-018aaf4d4d950bb1e を参照してください。
ここで気づきました。パブリックサブネットにルーティングを切っていなかった。
というわけで、インターネットゲートウェイへのルーティングを設定して再度試します。
diff -u network.tf{.orig,} --- network.tf.orig 2022-05-04 21:51:58.000000000 +0900 +++ network.tf 2022-05-04 21:52:21.000000000 +0900 @@ -61,6 +61,27 @@ depends_on = [aws_internet_gateway.igw] } +# Public Subnetに対するルートテーブル +resource "aws_route_table" "public" { + vpc_id = aws_vpc.this.id + + # サブネット内で閉じる通信以外は、全て Internet Gateway へ向ける + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.igw.id + } + + tags = { + Name = "Route Table for Public Subnet" + } +} + + +resource "aws_route_table_association" "public" { + route_table_id = aws_route_table.public.id + subnet_id = aws_subnet.public.id +} + # Private Subnetに対するルートテーブル resource "aws_route_table" "private" { vpc_id = aws_vpc.this.id
そうすると、きちんと疎通に成功しました。
感想
プライベートサブネットに配置するEC2に関する疎通のトラブルシュートは結構面倒なのですが、 それに対するソリューションとしてお手軽で良いです。 (このタイプの原因はケアレスミスに起因するからこそ、手がかりがないと結構時間をロスします)
今後このような構築の場合は、Reachability Analyzerを設定するのを基本としても良いなと感じました。
ちなみにReachability Analyzerの解析には、1回$0.1の費用がかかりますのでご注意ください。