ゆるりっとIaCをやってみよう #3 subnet
こんにちわ。
今日は前回作ったVPCにsubnetやgatewayを作っていこうと・・・・
(このペースで書いていったらAnsibleの記事にはいつになったら書けるんだろう?)
・・・思います!
VPCにサブネットを作ってルートテーブルでゲートウェイをつなげる。
これでネットワークの基板が・・・
(もう少し大きい粒度で記事書いた方がいいのかしら。いや、でもテーマ的にはこのくらいで
いいはずだ)
・・・完成ですね!!
今回のゴールは
ただ作るのではちょっと芸がないので、(ちょっとハードル上げすぎじゃ?と思いつつ)
- 172.16.0.0/16のVPCにパブリックのサブネットを作る
- サブネットは2つのAZに作成する
- 1つのAZに2つのサブネットを作ってIP128個ずつ割り当ててみる
という感じで色々な要素を組み込んで作成してみようと思います。
それでは前回VPCを作ったディレクトリで進めます。
terrafoem.tf / provider.tf
変更なし!
resource_network.tf
こんな感じのを4つ作っていきます。
これを手作業でやるのは正直しんどいですよね、、、。
resource "aws_subnet" "public1" {
vpc_id = aws_vpc.main-vpc.id
cidr_block = "172.16.1.0/25"
availability_zone = "ap-northeast-1"
tags = {
Name = "yururitto-public-1a-primary"
}
}
resource "aws_subnet" "public2" {
vpc_id = aws_vpc.main-vpc.id
cidr_block = "172.16.1.128/25"
availability_zone = "ap-northeast-1"
tags = {
Name = "yururitto-public-1a-secondary"
}
}
resource "aws_subnet" "public3" {
vpc_id = aws_vp
}
サブネットの〜かぁずだけ♪ 行がふえーるよ♪(白目
へただなぁ、、あるとくん、へたっぴさ。
コピペすればいい....そういうのが実にダメ....!せっかくterraformでスカッとしようって時に....その妥協は傷ましすぎる........!
もうちょっとスマートに:local_variables.tf
(しれっとファイル名を変更しています)
茶番を少し挟みましたが、真面目な話、これはせっかくコード化しているのにこれじゃあ
使い回すのも修正するのも手間がかかりすぎますね。
という事でまずはサブネットの情報を変数に切り出してみます。
locals {
public_subnets = {
public-1a-primary = {
name = "public-1a-primary",
cidr = "172.16.1.0/25",
az = "ap-northeast-1a"
},
public-1a-secondary = {
name = "public-1a-secondary",
cidr = "172.16.1.128/25",
az = "ap-northeast-1a"
},
public-1c-primary = {
name = "public-1c-primary",
cidr = "172.16.2.0/25",
az = "ap-northeast-1c"
},
public-1c-secondary = {
name = "public-1c-secondary",
cidr = "172.16.2.128/25",
az = "ap-northeast-1c"
}
}
}
key=valueのmap型でデータを用意します。
resource_network.tf 再び!
前述の変数を使ってsubnetを作っていきます。
resource "aws_subnet" "public-subnets" {
for_each = local.public_subnets
vpc_id = aws_vpc.main-vpc.id
cidr_block = each.value.cidr
availability_zone = each.value.az
tags = {
Name = "${local.service_name}-${each.value.name}"
}
}
スッキリですね。「あ〜!コード化してるな!」って感じですよね(どういう感じ?
for_each = local.public_subnets
ここでvariables.tfにある public_subnets
をループさせますよーと宣言
vpc_id = aws_vpc.tof-vpc.id
ここで前回作成したVPCのidを取得しています。
完成したリソースの情報は リソースタイプ.任意のローカル名.要素
で取得できます。
cidr_block = each.value.cidr
ループさせたいものは each.value.key
で繰り返し処理されるようになります。
それでは試してみましょう terraform plan -> apply
$ terraform plan
aws_vpc.main-vpc: Refreshing state... [id=vpc-0e62d30b251ee1aaf]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_subnet.public-subnets["public-1a-primary"] will be created
+ resource "aws_subnet" "public-subnets" {
+ arn = (known after apply)
+ assign_ipv6_address_on_creation = false
+ availability_zone = "ap-northeast-1a"
+ availability_zone_id = (known after apply)
+ cidr_block = "172.16.1.0/25"
+ enable_dns64 = false
+ enable_resource_name_dns_a_record_on_launch = false
+ enable_resource_name_dns_aaaa_record_on_launch = false
+ id = (known after apply)
+ ipv6_cidr_block_association_id = (known after apply)
+ ipv6_native = false
+ map_public_ip_on_launch = false
+ owner_id = (known after apply)
+ private_dns_hostname_type_on_launch = (known after apply)
+ tags = {
+ "Name" = "yururitto-public-1a-primary"
}
+ tags_all = {
+ "Environments" = "dev"
+ "Managed" = "terraform"
+ "Name" = "yururitto-public-1a-primary"
+ "Service" = "Yururitto"
}
+ vpc_id = "vpc-0e62d30b251ee1aaf"
}
(中略)
# aws_subnet.public-subnets["public-1c-secondary"] will be created
+ resource "aws_subnet" "public-subnets" {
+ arn = (known after apply)
+ assign_ipv6_address_on_creation = false
+ availability_zone = "ap-northeast-1c"
+ availability_zone_id = (known after apply)
+ cidr_block = "172.16.2.128/25"
+ enable_dns64 = false
+ enable_resource_name_dns_a_record_on_launch = false
+ enable_resource_name_dns_aaaa_record_on_launch = false
+ id = (known after apply)
+ ipv6_cidr_block_association_id = (known after apply)
+ ipv6_native = false
+ map_public_ip_on_launch = false
+ owner_id = (known after apply)
+ private_dns_hostname_type_on_launch = (known after apply)
+ tags = {
+ "Name" = "yururitto-public-1c-secondary"
}
+ tags_all = {
+ "Environments" = "dev"
+ "Managed" = "terraform"
+ "Name" = "yururitto-public-1c-secondary"
+ "Service" = "Yururitto"
}
+ vpc_id = "vpc-0e62d30b251ee1aaf"
}
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
ちゃんとvariablesの値をループして作ってくれていますね。
おつかれさまでした!
今回はvariavlesとfor_eachのループを組み込んでsubnetを作っていきました。
次回はインターネットゲートウェイとルートテーブルを作ってネットワークをつなげて
いきたいと思います。
Discussion