Zenn
💭

【入門#4】TerraformでAWS基礎のネットワーク(VPC/サブネット等)を作ろう

に公開
1

今回の目標

AWS環境の基礎。ネットワーク部分をTerraformで構築していきます。
AWSコンソールでVPCを手動作成すると自動的にできちゃうセットがありますが
あれらを今回Terraformで用意していこうと思います!
※セット:VPC/サブネット/ルートテーブル/インターネットゲートウェイ

今回の記事での完成するAWS構成図は下記です。
最終的には別の記事でEC2が動く環境を作っていきます!

前提条件

下記記事の「【入門#3】TerraformでAWS情報と連携させよう」までが完了していること
TerraformでAWS(EC2/ECS)環境を作るまでの目次

実際に手を動かしていきましょう!

1.VPCを作る!

VPCを作っていきましょう。
今回はcask-tokyo-ec2-vpcという名前のVPCを作ります。

network.tfというファイルを新規で作成し、下記を記述します。

resource "aws_vpc" "cask-tokyo-ec2-vpc"{
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  tags = {
    Name = "cask-tokyo-ec2-vpc"
  }
}

以上!!
えっ!!これだけ!?短すぎる、、、

この状態で下記を実行します。

terraform plan

そうすると下記のように、「あんた今回VPC作ろうとしてるね?」と表示されます。
現状のAWSに対して、変化点を表示してくれるようです。
ちなみにplanだけではAWSの環境に影響はありません。あくまでどうなるかのデモみたいなものですね。

$ 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.cask_tokyo_ec2_vpc will be created
  + resource "aws_vpc" "cask_tokyo_ec2_vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "10.0.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_dns_hostnames                 = true
      + enable_dns_support                   = true
      + enable_network_address_usage_metrics = (known after apply)
      + 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" = "cask-tokyo-ec2-vpc"
        }
      + tags_all                             = {
          + "Name" = "cask-tokyo-ec2-vpc"
        }
    }

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

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

planの結果で問題なければ、実際に反映していきます。

terraform apply
>yes

できたのか。。?
おそるおそるAWSを確認すると。。

おっ!!できている!!
すごく簡単ですね!
引き続きサブネット/インターネットゲートウェイも作っていきましょう!!

2.サブネットを作る!

サブネットもVPCと同じ要領で行っていきましょう。
記述するファイルは、VPCと同じくでnetwork.tfです。
ネットワーク関連はnetwork.tfに集めるのがベストプラクティスみたいです。

下記をnetwork.tfに記述していきます。

resource "aws_subnet" "cask_tokyo_ec2_subnet_public1" {
  vpc_id            = aws_vpc.cask_tokyo_ec2_vpc.id # ここはVPC作成時の名前を指定
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"
  map_public_ip_on_launch = true
  tags = {
    Name = "cask-tokyo-ec2-subnet-public1-ap-northeast-1a"
  }
}

resource "aws_subnet" "cask_tokyo_ec2_subnet_public2" {
  vpc_id            = aws_vpc.cask_tokyo_ec2_vpc.id # ここはVPC作成時の名前を指定
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-1c"
  map_public_ip_on_launch = true
  tags = {
    Name = "cask-tokyo-ec2-subnet-public2-ap-northeast-1c"
  }
}

※設定値はよくあるAWSのデフォルト設定です。

これもterraform planを実行し、問題がなければそのままapplyしてみましょう。
実行した結果はAWSで下記のように確認ができるかと思います!

3.インターネットゲートウェイを作る!

こちらも記述するファイルは、VPCと同じくでnetwork.tfです。
下記を記載し、terraform applyを行います。

resource "aws_internet_gateway" "cask_tokyo_ec2_igw" {
  vpc_id = aws_vpc.cask_tokyo_ec2_vpc.id
  tags = {
    Name = "cask_tokyo_ec2_igw"
  }
}

実行結果

ほぇぇ、、

4.ルートテーブルを作る!

ルートテーブルを定義し、VPC内の通信でインターネットゲートウェイへの通信路を作ります。

# ルートテーブルの作成
resource "aws_route_table" "cask_tokyo_ec2_rt" {
  vpc_id            = aws_vpc.cask_tokyo_ec2_vpc.id
  route {
    cidr_block      = "0.0.0.0/0"
    gateway_id      = aws_internet_gateway.cask_tokyo_ec2_igw.id
  }
  tags = {
    Name = "cask_tokyo_ec2_rt"
  }
}

# ルートテーブルとサブネットを紐づける
resource "aws_route_table_association" "cask_tokyo_ec2_rt_association_public1" {
  subnet_id      = aws_subnet.cask_tokyo_ec2_subnet_public1.id
  route_table_id = aws_route_table.cask_tokyo_ec2_rt.id
}

resource "aws_route_table_association" "cask_tokyo_ec2_rt_association_public2" {
  subnet_id      = aws_subnet.cask_tokyo_ec2_subnet_public2.id
  route_table_id = aws_route_table.cask_tokyo_ec2_rt.id
}

ここもいつものごとくterraform applyを行います。

VPCのリソースマップを見るとネットワークの構成ができています!!

これでネットワークは整いました。
いやー簡単ですね。。

まだ簡単なネットワークのみですが、Terraformすごく簡単に作れちゃいますね。
次回のリソース作成も期待。

VPCの名前や各リソースの名前は変数化していきますが、諸々構築が完了した段階で
別の記事に書いていきます!

関連記事

https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

上記でEC2環境構築の続きをTerraformで作っていきますので、この先をTerraformで構築されたいかたは参考にどうぞ!

1

Discussion

ログインするとコメントできます