LoginSignup
2
1

More than 1 year has passed since last update.

TerraformでAWSのネットワークまわり(VPC、サブネット、ルートテーブル他)をデプロイする

Last updated at Posted at 2023-01-28

Terraformシリーズ第4弾はネットワークです。

項目はけっこういろいろあってネットワークの主要になるVPC、サブネット、ルートテーブル、DHCPオプションセット、IGW、NATGW、エンドポイント、ピアリングあたりです。イメージしにくいと思うので図にしてみました:pencil2:

ファイル名

※過去のTerraform記事はこちら
第一弾:TerraformでAWSリソースをデプロイしてみる
第二弾:TerraformでAWS環境をデプロイする前に認識しておくべきこと(tfstate.tf / providor.tf / output.tf / ディレクトリ構造)
第三弾:TerraformでAWSのIAMまわりをデプロイする

※以下実際にコードを記述していきますが、 "${local.XXX}" と記述されているものは個人的に外出しした箇所なので、より参考になるかと思いそのまま残しておきました。

VPC

resource "aws_vpc" "vpc01" {
  cidr_block           = "${local.VPCCIDR}"
  enable_dns_support   = true #VPC内でのDNSによる名前解決
  enable_dns_hostnames = true #VPC内インスタンスのDNSホスト名取得

  tags = {
    Name = "${local.環境名}"
  }
}

※作成されたVPCを他のモジュールで利用する場合、以下のように出力させておきます。(outputに関する詳細は第二弾の記事を参考)

output "vpcid" {
  value = "${aws_vpc.vpc01.id}"
}

DHCPオプションセット

resource "aws_vpc_dhcp_options" "dhcp01" {
  domain_name = "${local.DHCPオプションのドメイン名}"
  domain_name_servers = ["${local.DNSサーバ①}","${local.DNSサーバ②}","AmazonProvidedDNS"]
  ntp_servers = ["${local.NTPサーバ①}","${local.NTPサーバ②}"]
  
  #NetBIOSノードタイプ
  netbios_node_type = 2

  tags = {
    Name = "${local.DHCPオプションのドメイン名}"
  }
}

#VPCとの紐付け
resource "aws_vpc_dhcp_options_association" "vpc_vpc01-dhcp-association" {
  vpc_id = aws_vpc.vpc01.id
  dhcp_options_id = aws_vpc_dhcp_options.dhcp01.id
}

・DNSサーバは環境に合わせて適宜変更してください(上記はDNSをキャッシュできるサーバが2台存在する前提で記述しています)
・NetBIOSノードタイプはAWSでは「2」が推奨されています

サブネット

※プラベートサブネットの場合

resource "aws_subnet" "private-1a" {
  vpc_id                  = aws_vpc.vpc01.id
  cidr_block              = "${local.サブネットのCIDR"}
  availability_zone       = "ap-northeast-1a"

  tags = {
    Name = "${local.環境名}"-private-1
  }
}

・private/publicの区別は "aws_subnet" やタグで記述してあげます
・サブネットもVPC同様outputさせる場合は以下です

output "サブネット名" {
  value = "${aws_subnet.private-1a.id}"
}

ゲートウェイ

以下NATゲートウェイまでの利用を前提に記載します。

インターネットゲートウェイ

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.vpc01.id #紐づけるVPC
  tags = {
    Name = "${local.環境名}-igw
  }
}

EIP

resource "aws_eip" "ngw" {
  vpc        = true
  depends_on = [aws_internet_gateway.igw] #紐付けるIGW
}

紐づける先はIGWですが、NATGW用のEIPのため "aws_eip" "ngw" としています。

NATゲートウェイ

resource "aws_nat_gateway" "ngw" {
  allocation_id = aws_eip.ngw.id #紐づけるEIP
  subnet_id     = aws_subnet.public-1a.id #紐づけるパブリックサブネット
  depends_on    = [aws_internet_gateway.igw] #紐付けるIGW
  tags = {
    Name = "${local.環境名}"-ngw
  }
}

ルートテーブル

パブリック用

#ルートテーブル作成
resource "aws_route_table" "rtb-public" {
  vpc_id = aws_vpc.vpc01.id #VPCとの紐付け

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id #IGWとの紐付け
  }

  tags = {
    Name = "${local.環境名}"-public
  }
}

#サブネットとの紐付け
resource "aws_route_table_association" "rtb-public-1a" {
  subnet_id      = aws_subnet.public-1a.id
  route_table_id = aws_route_table.rtb-public.id
}

プライベート用

#ルートテーブル作成
resource "aws_route_table" "rtb-private" {
  vpc_id = aws_vpc.vpc01.id #VPCとの紐付け

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_nat_gateway.ngw.id #NATGWとの紐付け
  }
  
  tags = {
    Name = "${local.環境名}"-private
  }
}

#サブネットとの紐付け
resource "aws_route_table_association" "rtb-private-1a" {
  subnet_id      = aws_subnet.private-1a.id
  route_table_id = aws_route_table.rtb-private.id
}

エンドポイント(S3の場合)

#エンドポイントの作成
resource "aws_vpc_endpoint" "vpces3" {
  vpc_id       = aws_vpc.vpc01.id #VPCとの紐付け
  service_name = "com.amazonaws.ap-northeast-1.s3"
  policy = file("./vpcendpointpolicy.json") #エンドポイントポリシーはjsonで外だしして記述
  tags = {
    Name = "${local.環境名}"-vpce-s3
  }
}

#ルートテーブルとの紐付け
resource "aws_vpc_endpoint_route_table_association" "vpce-01" {
  route_table_id  = aws_route_table.rtb-private.id
  vpc_endpoint_id = aws_vpc_endpoint.vpces3.id
}

VPCピアリング

#ピアリング
resource "aws_vpc_peering_connection" "ピア名" {
  peer_owner_id = "${local.ピア先アカウント}"
  peer_vpc_id   = "${local.ピア先VPC}"
  vpc_id        = aws_vpc.vpc01.id

  tags = {
    Name = "${local.環境名}"-"ピア"
  }
}

#ルートテーブルとの紐付け
resource "aws_route" "ピア名" {
  route_table_id            = aws_route_table.rtb-private.id
  destination_cidr_block    = "${local.ピア先CIDR}"
  vpc_peering_connection_id = aws_vpc_peering_connection.ピア名.id
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1