知っている人には、当然のことかもしれないがterraformでaws環境を作っていてネットワーク周りではまった(中々見つけられなかった)事があったのでメモ。
やりたい事
- public_subnetをterraformで作りたい
VPC RESOURCE達
terraformが提供しているVPC RESOURCEで最低限のネットワーク環境を作成するのに必要なのは下記かと思う。
RESOURCE | 用途 |
---|---|
aws_vpc | VPC作成 |
aws_internet_gateway | インターネットゲートウェイ作成(vpc指定) |
aws_route_table | ルーティングテーブルを作成(vpc指定) |
aws_subnet | サブネット作成(vpc指定) |
ハマったとこ
上記の各々のリソースを作成するといい感じにEC2のインスタンスに紐付けるサブネットが出来る。(5行目で指定するsubnet_id)
1 resource "aws_instance" "fluentd-st" {
2 ami = "ami-374db956"
3 instance_type = "t2.micro"
4 key_name = "xxx_publickey"
5 subnet_id = "${aws_subnet.log-subnet.id}" ###ここで指定する
6 vpc_security_group_ids = ["${aws_security_group.allow_ssh_es.id}","${aws_security_group.allow_forward_log.id}" ]
7 associate_public_ip_address = "true"
8 tags {
9 Name = "st-log"
10 }
11 }
自分の中で勝手に作成したsubnetに対して、route_tableがあたっていると思いこんでいてEC2をpublic_ipつきで起動したのにsshできないぞ、あれなんでだと悩んだ。。
GUIで作っている時は、subnetに対して、publicかprivateかを意識して作っていたんだが、新しいツール使ってたってのもあってその関連付けのところが丸々頭から抜けていたという話。。。
解決策
aws_route_table_associationを使って、subnetに対して、route_tableのマッピングをしてあげる。(35行目からの部分がないと作られたprivate_subnetとして同一vpc内しか通信が出来ない。。)
1 resource "aws_vpc" "xxxvpc" {
2 cidr_block = "10.0.0.0/16"
3 tags {
4 Name = "xxxvpc"
5 }
6 }
7
8 resource "aws_internet_gateway" "main-gw" {
9 vpc_id = "${aws_vpc.xxxvpc.id}"
10 tags {
11 Name = "internet-gw"
12 }
13 }
14
15 resource "aws_route_table" "r" {
16 vpc_id = "${aws_vpc.xxxvpc.id}"
17 route {
18 cidr_block = "0.0.0.0/0"
19 gateway_id = "${aws_internet_gateway.main-gw.id}"
20 }
21
22 tags {
23 Name = "xxx-routing-table"
24 }
25 }
26
27 resource "aws_subnet" "abc-subnet" {
28 vpc_id = "${aws_vpc.xxxvpc.id}"
29 cidr_block = "10.0.1.0/24"
30 tags {
31 Name = "abc-subnet"
32 }
33 }
34
35 resource "aws_route_table_association" "a" {
36 subnet_id = "${aws_subnet.abc-subnet.id}"
37 route_table_id = "${aws_route_table.r.id}"
38 }
新しいツール使うと色々ハマるし忘れるので、ちゃんとメモしとくのが大事。
参照