🧚‍♀️

ゆるりっとIaCをやってみよう #2 VPC

2022/02/21に公開

こんにちわ。
zennの記事も書きたいけど、動画編集もやりたいゲームもしたい、AWSの試験対策もしたい、、、
プライベートの時間がさっぱり足りない系男子です。

さて、前回はTerraformのリソース構成を共有するためのs3 bucketを作成してみました。

https://zenn.dev/yururitto_ryuji/articles/b5bac8b7020ec0

今回はVPCを作ってみます

新しく「networks」というフォルダを作成しました。
ネットワーク関連はここに作っていこうと思います。

フォルダ構成はこんな感じ

terraform
├── common
└── networks

1つ目:networks/terraform.tf

今回から作成するリソースの構成情報をローカルではなく、前回作成したs3に保存していきます。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.2.0"
    }
  }
  backend "s3" {
    bucket = "yururitto-tfstate-backet"
    key = "tfstate-files/dev/vpc.tfstate"
    region = "ap-northeast-1"
  }

  required_version = "~> 1.1.3"
}

backend "s3"

この部分でtfstateの保存先を設定していきます。

bucket : 前回作ったバケット名を指定
key : プレフィックス
region : リージョンの指定

2つ目:networks/provider.tf

common/provider.tfと同じ

3つ目:networks/resource_network.tf

VPCをコンソールから作るとしたらこんな感じですかね。

では早速、コード化していくとします。

公式:AWS_VPC

resource "aws_vpc" "main-vpc" {
  cidr_block = "172.16.0.0/16"
  instance_tenancy = "default"
  tags = {
    Name = "yururitto-infra-vpc"
  }
}

確認してみましょう : terraform plan

今回は作業フォルダが違うので、 terraform init も忘れずに。

$ terraform plan

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_vpc.yururitto-vpc will be created
  + resource "aws_vpc" "main-vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "172.16.0.0/16"
      + default_network_acl_id               = (known after apply)
      + default_route_table_id               = (known after apply)
      + default_security_group_id            = (known after apply)
      + dhcp_options_id                      = (known after apply)
      + enable_classiclink                   = (known after apply)
      + enable_classiclink_dns_support       = (known after apply)
      + enable_dns_hostnames                 = (known after apply)
      + enable_dns_support                   = true
      + id                                   = (known after apply)
      + instance_tenancy                     = "default"
      + ipv6_association_id                  = (known after apply)
      + ipv6_cidr_block                      = (known after apply)
      + ipv6_cidr_block_network_border_group = (known after apply)
      + main_route_table_id                  = (known after apply)
      + owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "yururitto-infra-vpc"
        }
      + tags_all                             = {
          + "Environments" = "dev"
          + "Managed"      = "terraform"
          + "Name"         = "yururitto-infra-vpc"
          + "Service"      = "Yururitto"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

う・・・美しい・・・ハッ!!

今まで手作業でやってた事がコード化されるって本当に素晴らしいですよね。

うーん、もうちょっと楽したいな

まだ小さいリソースなのでハードコーディングでやってますが、今後、修正が出た時に
面倒になってくるな、、、という事でちょっと変数化をしてみたいと思います。

変数に切り出そう:local values

後々の運用で修正が大変になりそうな共通の値などは変数化した方が管理も楽になりますね。
なので、variables.tfを作ってそこに変数を用意しましょう。
公式:local values

locals {
  service_name = "yururitto"
  vpc_cidr = "172.16.0.0/16"
}

locals{ key = "value" } で作っていきます。
これに合わせて、resource_network.tfの方も修正します。

resource "aws_vpc" "main-vpc" {
  cidr_block = "${local.vpc_cidr}"
  instance_tenancy = "default"
  tags = {
    Name = "${local.service_name}-infra-vpc"
  }
}

local.key で変数を呼び出してあげます。

planはどうじゃろ?

  + resource "aws_vpc" "main-vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "172.16.0.0/16"
      + default_network_acl_id               = (known after apply)
      + default_route_table_id               = (known after apply)
      + default_security_group_id            = (known after apply)
      + dhcp_options_id                      = (known after apply)
      + enable_classiclink                   = (known after apply)
      + enable_classiclink_dns_support       = (known after apply)
      + enable_dns_hostnames                 = (known after apply)
      + enable_dns_support                   = true
      + id                                   = (known after apply)
      + instance_tenancy                     = "default"
      + ipv6_association_id                  = (known after apply)
      + ipv6_cidr_block                      = (known after apply)
      + ipv6_cidr_block_network_border_group = (known after apply)
      + main_route_table_id                  = (known after apply)
      + owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "yururitto-infra-vpc"
        }
      + tags_all                             = {
          + "Environments" = "dev"
          + "Managed"      = "terraform"
          + "Name"         = "yururitto-infra-vpc"
          + "Service"      = "Yururitto"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

いい感じじゃないですか(恍惚)

<余談>
下のような事ってできないもんかなと思ってしまいました(ansible脳)
たぶん何かしらやり方はあるんだろうなぁと思いつつ先にいきます。

terraform
├── vars # ←こんな感じの
|   └── develop_vars.tf
├── common
└── networks # この下で実行しても読み込めたら嬉しい

いざ実行!:terraform apply

  Enter a value: yes

aws_vpc.main-vpc: Creating...
aws_vpc.main-vpc: Creation complete after 1s [id=vpc-0e62d30b251ee1aaf]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

無事成功!!

見事、VPCが完成です。

まとめ

今回はvpcの作成とlocal valuesを使用してみました。
ここからsubneetやinternet gatewayを作っていこうと思いますので、
次回もゆるりっとお付き合い頂ければと思います。

ありがとうございました。

Discussion