1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

terraform aws-vpc作成

Posted at

最初に

terraformを業務で使用することになりました。
そのため勉強したことをまとめています。

terraformでaws-vpc作成

※リソース名等を意味のないものに変更しています。

main.tf

# プロバイダーとプロファイルの指定
provider "aws" {
  shared_credentials_files = ["~/.aws/credentials"]
  region                   = "ap-northeast-1"
  profile                  = "profile-name"
}
# tfstateファイル格納先の指定
# バケットは事前に作成する必要あり。
terraform {
  backend "s3" {
    bucket  = "s3-bucket"
    key     = "tfstateファイル格納先指定"
    encrypt = true
    region  = "ap-northeast-1"
    profile = "profile-name"
  }
}
# aws-vpc作成
resource "aws_vpc" "vpc-name" {
  cidr_block                       = "0.0.0.0/0"
  # VPC内でインスタンスにDNSホスト名を割り当てるか
  enable_dns_hostnames             = true
  # vpc内での名前解決をできるようにするか
  enable_dns_support               = true
  # EC2インスタンスがどのハードウェア上で実行されるか指定
  # default:他のユーザーとハードウェアを共有する
  # dedicated:専用のハードウェア上で実行
  instance_tenancy                 = "default"
  # IPv6 CIDRブロックを自動的に割り当てるか
  assign_generated_ipv6_cidr_block = true

  tags = {
    Name = "vpc-name"
  }
}
# サブネットの作成①
resource "aws_subnet" "subnet-name_1a" {
  vpc_id            = aws_vpc.vpc-name.id
  cidr_block        = "0.0.0.0/0"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "subnet-name_1_1a"
  }
}
# サブネットの作成②
resource "aws_subnet" "subnet-name_1c" {
  vpc_id            = aws_vpc.vpc-name.id
  cidr_block        = "0.0.0.0/0"
  availability_zone = "ap-northeast-1c"

  tags = {
    Name = "subnet-name_1c"
  }
}
# ルートテーブルの作成
resource "aws_route_table" "table-name" {
  vpc_id = aws_vpc.terraform_vpc.id

  tags = {
    Name = "table-name"
  }
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "igw-name" {
  vpc_id = aws_vpc.vpc-name.id

  tags = {
    Name = "igw-name"
  }
}
# サブネットとルートテーブルを関連付け
resource "aws_route_table_association" "table_association" {
  subnet_id      = aws_subnet.subnet-name_1a.id
  route_table_id = aws_route_table.table-name.id
}
# ルートテーブルとインターネットゲートウェイを関連付け
resource "aws_route" "table-name" {
  route_table_id         = aws_route_table.table-name.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.igw-name.id
}

outputs.tf

# 下記はすべて作成したリソースを外部から値を読み取れるように設定しています。
# 例として別フォルダでrds作成用のコードを作成し今回作成したサブネットの値を指定したい場合outputsで読み取りできるようにしないとサブネットを値を取得できません。

output "vpc_id" {
  value = aws_vpc.vpc-name.id
}
output "vpc_cidr" {
  value = aws_vpc.vpc-name.cidr_block
}

output "subnet-name_1a_ids" {
  value = aws_subnet.subnet-name.id
}
output "subnet-name_1a_cidrs" {
  value = aws_subnet.subnet-name_1a.cidr_block
}

output "subnet-name_1c_ids" {
  value = [aws_subnet.subnet-name_1c.id]
}
output "subnet-name_1c_cidrs" {
  value = [aws_subnet.subnet-name_1c.cidr_block]
}

output "igw_id" {
  value = aws_internet_gateway.igw-name.id
}

output "rt_public_ids" {
  value = aws_route_table.table-name.id
}

最後に

上記内容ではサブネット"subnet-name_1a"がパブリックサブネットになりサブネット"subnet-name_1c"がプライベートサブネットになります。
そしてサブネット"subnet-name_1c"は特段どことも明示的にルートテーブルと関連付けしていないためデフォルトのルートテーブルと自動で関連付けされます。
terraformで初めて作成したものになるため色々反省点はありますが、とりあえず動くものはできました。
実際に業務で使用する場合はサブネットの数を増やさないといけない等修正は必要になります。
そしてresourceで宣言するよりmoduleを使用するとコードが短くわかりやすいと思うのでmoduleでも書きたいです。
また次はプレフィックスリストやセキュリティグループについても作成したので書きたいです。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?