🧚‍♀️

ゆるりっとIaCをやってみよう #3 subnet

2022/02/23に公開

こんにちわ。
今日は前回作ったVPCにsubnetやgatewayを作っていこうと・・・・

(このペースで書いていったらAnsibleの記事にはいつになったら書けるんだろう?)

・・・思います!

https://zenn.dev/yururitto_ryuji/articles/991dc353e4abc4

VPCにサブネットを作ってルートテーブルでゲートウェイをつなげる。
これでネットワークの基板が・・・

(もう少し大きい粒度で記事書いた方がいいのかしら。いや、でもテーマ的にはこのくらいで
いいはずだ)

・・・完成ですね!!

今回のゴールは

ただ作るのではちょっと芸がないので、(ちょっとハードル上げすぎじゃ?と思いつつ)

  • 172.16.0.0/16のVPCにパブリックのサブネットを作る
  • サブネットは2つのAZに作成する
  • 1つのAZに2つのサブネットを作ってIP128個ずつ割り当ててみる

という感じで色々な要素を組み込んで作成してみようと思います。
それでは前回VPCを作ったディレクトリで進めます。

terrafoem.tf / provider.tf

変更なし!

resource_network.tf

こんな感じのを4つ作っていきます。
これを手作業でやるのは正直しんどいですよね、、、。

公式:aws_subnet

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