😄

TerraformでAWSのVPCとその他もろもろを作ってみる

2024/09/29に公開

TerraformでAWSのVPCとその他もろもろを作ってみる

awsコンソールでVPCを作成するとき、"VPCのみ"と"VPCなど"の2種類のオプションがある。"VPCなど"をクリックすると表示されるデフォルト値をそのままterraformにコードとして落とし込んでいく。セキュリティのことは今回は何も考えずにやっていこうと思う

メモ

  • vscodeの拡張機能を入れておくと便利
  • 今回はmain.tfにまとめて書くが、モジュール分割して環境ごとにコードを書くと便利らしい
  • あらかじめAWS CLIのシークレットを取得しておく

ルートテーブルの記述

aws_route_table

  • 経路情報の格納

aws_route

  • ルートテーブルへ経路情報を追加
  • Internet Gatewayの使用もここで設定する
  • コンソール上ではルートテーブルを選択したページのルートというタブと思われる

aws_route_table_association

  • ルートテーブルとサブネットの関連付け
  • コンソール上ではルートテーブルを選択したページのサブネットの関連付けというタブと思われる

プロバイダーの指定

/**
 * プロバイダーの指定
 */
provider "aws" {
  region = "ap-northeast-1"
}

VPCの作成

/**
 * VPCの作成
 */
resource "aws_vpc" "aws_provider_tutorial_vpc" {
  cidr_block = "10.0.0.0/16"

  // コンソール上のDNSホスト名を有効化
  enable_dns_hostnames = true

  // コンソール上のDNS解決を有効化
  enable_dns_support = true

  tags = {
    Name = "aws_provider_tutorial_vpc1"

    // タグ名 = 値とすることで追加のタグが設定することができる
    // 例) env = dev
  }
}

サブネットの作成

パブリックサブネットの作成

locals {
  subnets = {
    "subnet-1" = {
      availability_zone = "ap-northeast-1a",
      cidr_block        = "10.0.0.0/20",
      tag_name          = "aws_provider_tutorial_public1-1a"
    },
    "subnet-2" = {
      availability_zone = "ap-northeast-1c"
      cidr_block        = "10.0.16.0/20",
      tag_name          = "aws_provider_tutorial_public2-1c"
    }
  }
}
resource "aws_subnet" "public_subnets" {
  for_each = local.subnets

  cidr_block        = each.value.cidr_block
  vpc_id            = aws_vpc.aws_provider_tutorial_vpc.id
  availability_zone = each.value.availability_zone

  tags = {
    Name = each.value.tag_name
  }
}

プライベートサブネットの作成

/**
 * サブネットの作成
 */
resource "aws_subnet" "aws_provider_tutorial_private1-1a" {
  // 作成したVPC内にサブネットを作成する
  vpc_id            = aws_vpc.aws_provider_tutorial_vpc.id

  // サブネットを作成するAZ
  availability_zone = "ap-northeast-1a"

  // IPv4 CIDRブロック
  cidr_block        = "10.0.128.0/20"

  tags = {
    Name = "aws_provider_tutorial_private1-1a"
  }
}
resource "aws_subnet" "aws_provider_tutorial_private2-1c" {
  vpc_id            = aws_vpc.aws_provider_tutorial_vpc.id
  availability_zone = "ap-northeast-1c"
  cidr_block        = "10.0.144.0/20"

  tags = {
    Name = "aws_provider_tutorial_private2-1c"
  }
}

インターネットゲートウェイの作成

resource "aws_internet_gateway" "aws_provider_tutorial_internet_gateway" {
  vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
  tags = {
    Name = "aws_provider_tutorial_internet_gateway"
  }
}

VPCエンドポイントの作成(S3ゲートウェイ)

ルートテーブルの作成

パブリック

resource "aws_route_table" "aws_provider_tutorial_public-rt" {
  vpc_id = aws_vpc.aws_provider_tutorial_vpc.id
  tags = {
    Name = "aws_provider_tutorial_rtb_public-rt"
  }
}

resource "aws_route" "public" {
  destination_cidr_block = "0.0.0.0/0"
  route_table_id = aws_route_table.aws_provider_tutorial_public-rt.id
  gateway_id = aws_internet_gateway.aws_provider_tutorial_internet_gateway.id
}

resource "aws_route_table_association" "aws_provider_tutorial_association-public_rt" {
  for_each = aws_subnet.public_subnets
  subnet_id = each.value.id
  route_table_id = aws_route_table.aws_provider_tutorial_public-rt.id
}

プライベート

resource "aws_route_table" "aws_provider_tutorial_private1a_rtb" {
  vpc_id = aws_vpc.aws_provider_tutorial_vpc.id

  tags = {
    Name = "aws_provider_tutorial_private1a_rtb"
  }
}

resource "aws_route_table" "aws_provider_tutorial_private1c_rtb" {
  vpc_id = aws_vpc.aws_provider_tutorial_vpc.id

  tags = {
    Name = "aws_provider_tutorial_private1c_rtb"
  }
}


resource "aws_route_table_association" "aws_provider_tutorial_private1a_rta" {
  subnet_id = aws_subnet.aws_provider_tutorial_private1-1a.id
  route_table_id = aws_route_table.aws_provider_tutorial_private1a_rtb.id
}

resource "aws_route_table_association" "aws_provider_tutorial_private2c_rta" {
  subnet_id = aws_subnet.aws_provider_tutorial_private2-1c.id
  route_table_id = aws_route_table.aws_provider_tutorial_private1c_rtb.id
}

resource "aws_vpc_endpoint_route_table_association" "private_s3_1a" {
  vpc_endpoint_id = aws_vpc_endpoint.s3_endpoint.id
  route_table_id = aws_route_table.aws_provider_tutorial_private1a_rtb.id
}

resource "aws_vpc_endpoint_route_table_association" "private_s3_1c" {
  vpc_endpoint_id = aws_vpc_endpoint.s3_endpoint.id
  route_table_id = aws_route_table.aws_provider_tutorial_private1c_rtb.id
}

これでデフォルトのVPCなどの作成ができると思います。GUIコンソールを見ながらコードを書くと、そのコードがGUIのどの部分のことかがわかりやすく理解が進みやすいかもしれない

参考

最後に

間違っていることがあればコメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion