はじめに
前回はTerraformでVPC + EC2(最小構成)を作成しました。
本記事では、Terraformで作成したVPC / Subnet / Internet Gateway / Route Table / Security Group / EC2をAWS CLIを使って1つずつ確認していきます。
前提
- Terraformですでに以下のリソースを作成済み
- VPC
- Public Subnet
- Internet Gateway
- Route Table
- Security Group
- EC2
- AWS CLIが利用できる状態
① Security Groupの確認(Ingress / Egress)
まずは EC2 にアタッチされている Security Group を確認します。
aws ec2 describe-security-groups \
--filters "Name=group-name,Values=public-ec2-sg" \
--query "SecurityGroups[0].{ID:GroupId,Ingress:IpPermissions,Egress:IpPermissionsEgress}" \
--output json
出力結果:
{
"ID": "sg-xxxxxxxxxxx",
"Ingress": [],
"Egress": [
{
"IpProtocol": "-1",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
]
}
]
}
確認ポイント
- Ingress が空
→ SSH(22番)などのインバウンド通信はすべて拒否 - Egress が 0.0.0.0/0
→ EC2から外部への通信は許可
Session Manager を使う構成では、EC2がアウトバウンド通信できれば問題ありません。
② VPCの確認
Terraformで作成した VPC が存在しているかを確認します。
aws ec2 describe-vpcs \
--filters "Name=tag:Name,Values=sample-vpc" \
--query "Vpcs[*].{VPC_ID:VpcId,CIDR:CidrBlock,State:State}" \
--output table
出力結果:
-----------------------------------------------
| DescribeVpcs |
+--------------+------------+-----------------+
| CIDR | State | VPC_ID |
+--------------+------------+-----------------+
| 10.0.0.0/16 | available | vpc-xxxxxxxxxxx |
+--------------+------------+-----------------+
確認ポイント
- CIDR が10.0.0.0/16
- State がavailable
③ Subnetの確認
VPC内の Subnet を確認します。
aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=<VPC_ID>" \
"Name=tag:Name,Values=public-subnet" \
--query "Subnets[*].{Subnet_ID:SubnetId,CIDR:CidrBlock,AZ:AvailabilityZone,MapPublicIP:MapPublicIpOnLaunch}" \
--output table
出力結果:
-------------------------------------------------------------------------------
| DescribeSubnets |
+-----------------+--------------+--------------+-----------------------------+
| AZ | CIDR | MapPublicIP | Subnet_ID |
+-----------------+--------------+--------------+-----------------------------+
| ap-northeast-1a | 10.0.1.0/24 | True | subnet-xxxxxxxxxxx |
+-----------------+--------------+--------------+-----------------------------+
確認ポイント
- Public Subnet (MapPublicIPOnLaunch = True)になっている
- 想定したCIDR / AZで作成されている
④ Internet Gatewayの確認
VPCに IGW がアタッチされているかを確認します。
aws ec2 describe-internet-gateways \
--filters "Name=attachment.vpc-id,Values=<VPC_ID>" \
--query "InternetGateways[*].{IGW_ID:InternetGatewayId,State:Attachments[0].State}" \
--output table
出力結果:
----------------------------------------
| DescribeInternetGateways |
+------------------------+-------------+
| IGW_ID | State |
+------------------------+-------------+
| igw-xxxxxxxxxxx | available |
+------------------------+-------------+
⑤ Route Tableの確認
Route Table にデフォルトルートが設定されているか確認します。
aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=<VPC_ID>" \
--query "RouteTables[*].{RouteTable_ID:RouteTableId,Routes:Routes}" \
--output table
出力結果:
-----------------------------------------------------------------------------------
| DescribeRouteTables |
+---------------------------------------------------------------------------------+
| RouteTable_ID |
+---------------------------------------------------------------------------------+
| rtb-xxxxxxxxxxx |
+---------------------------------------------------------------------------------+
|| Routes ||
|+----------------------+-------------------------+--------------------+---------+|
|| DestinationCidrBlock | GatewayId | Origin | State ||
|+----------------------+-------------------------+--------------------+---------+|
|| 10.0.0.0/16 | local | CreateRouteTable | active ||
|| 0.0.0.0/0 | igw-xxxxxxxxxxx | CreateRoute | active ||
|+----------------------+-------------------------+--------------------+---------+|
| DescribeRouteTables |
+---------------------------------------------------------------------------------+
| RouteTable_ID |
+---------------------------------------------------------------------------------+
| rtb-xxxxxxxxxxx |
+---------------------------------------------------------------------------------+
|| Routes ||
|+---------------------------+---------------+-----------------------+-----------+|
|| DestinationCidrBlock | GatewayId | Origin | State ||
|+---------------------------+---------------+-----------------------+-----------+|
|| 10.0.0.0/16 | local | CreateRouteTable | active ||
|+---------------------------+---------------+-----------------------+-----------+|
Public Subnet用 Route Table
DestinationCidrBlock | GatewayId | Origin | State
---------------------+-------------------------+------------------+-------
10.0.0.0/16 | local | CreateRouteTable | active
0.0.0.0/0 | igw-xxxxxxxxxxx | CreateRoute | active
確認ポイント
- 10.0.0.0/16 → local
- VPC内部通信のための自動ルート
- VPC作成時に必ず存在する
- 変更・削除不可
- 0.0.0.0/0 → Internet Gateway
- インターネット向け通信のデフォルトルート
- このルートがあることで Public Subnet になる
- EC2が外部へ通信可能
Route TableはPublic Subnet用の一つしか作ってい何のに、Route Tableが二つ存在していたので、Terraformの設計ミスや設定漏れかと考えましたが、Route Table が2つ存在しているのは、VPC作成時にAWSが自動でデフォルトRoute Tableを作成する仕様らしいです。
⑥ EC2の確認
最後に EC2 インスタンスを確認します。
aws ec2 describe-instances \
--filters "Name=subnet-id,Values=subnet-xxxxxxxxxxx " \
"Name=tag:Name,Values=sample-ec2" \
"Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[*].{Instance_ID:InstanceId,PrivateIP:PrivateIpAddress,PublicIP:PublicIpAddress}" \
--output table
出力結果:
---------------------------------------------------------
| DescribeInstances |
+---------------------+--------------+------------------+
| Instance_ID | PrivateIP | PublicIP |
+---------------------+--------------+------------------+
| i-xxxxxxxxxxx | 10.0.1.144 | 13.230.241.182 |
+---------------------+--------------+------------------+
確認ポイント
- EC2が起動中(running)
- Public IP / Private IP が付与されている
まとめ
本記事では、Terraformで作成した AWS リソースを AWS CLI を使って1つずつ確認しました。
- Security Group
- Ingress が空で、SSH(22番ポート)が許可されていないこと
- Egress により EC2 からのアウトバウンド通信は可能なこと
- VPC / Subnet
- 想定した CIDR・AZ で作成されていること
- Public Subnet として設定されていること
- Internet Gateway
- VPC に正しくアタッチされていること
- Route Table
- 0.0.0.0/0 → Internet Gateway のデフォルトルートが存在すること
- VPC 作成時に自動で作成される デフォルト Route Table が別に存在すること
- EC2
- 指定した Subnet 上で起動していること
- Public IP / Private IP が正しく割り当てられていること
Terraform でインフラを構築すると、「コードを書いてapply したら終わり」になりがちですが、AWS CLI で実体を確認することで、Terraform の設定と AWS の実リソースの対応関係が明確になりました。
特に Route Table のように「自分では1つしか作っていないのに、なぜ2つあるのか」といった疑問は、AWS の仕様を理解する良いきっかけになりました。
今回は学習目的として、Terraformで作成したリソースを AWS CLI で1つずつ確認しました。
実務では毎回この手順を手動で行うのは大変なので、VPC ID を変数に持たせたシェルスクリプト化や、terraform state / terraform show を併用することで、確認作業をかなり効率化できるので今後はスクリプト化も挑戦してみたいです。
まずは「何が作られているのかを自分の目で確認できる」ことが重要で、
慣れてきたらスクリプト化して楽をする、という流れが現実的だと感じました。