Terraform을 사용하여 AWS에서 Virtual Private Cloud(VPC) 생성


이 페이지에서

  1. 전제 조건
  2. 우리가 할 일\n
  3. 다른 종속 리소스가 있는 VPC를 생성하기 위한 Terraform 구성 파일을 작성합니다.\n
  4. Terraform 구성 파일을 사용하여 VPC 및 기타 종속 리소스 생성\n
  5. Terraform을 사용하여 생성된 VPC 및 기타 종속 리소스 삭제\n
  6. 결론

이 기사에서는 서브넷, 인터넷 게이트웨이, NAT 게이트웨이 및 라우팅 테이블과 함께 VPC를 생성하는 방법을 보여줍니다. 우리는 4개의 서브넷이 있는 1개의 VPC를 만들 것입니다: 2개의 프라이빗 및 2개의 퍼블릭, 2개의 NAT 게이트웨이, 1개의 인터넷 게이트웨이 및 4개의 라우팅 테이블.

계속 진행하기 전에 AWS의 Terraform 및 VPC에 대한 기본적인 이해가 있다고 가정합니다. AWS 콘솔에서 VPC와 VPC 생성에 대해 알아보려면 여기를 클릭하고 Terraform의 기본 사항을 알아보려면 "Terraform이란 무엇이며 AWS EC2 인스턴스에 설치하는 방법"을 검색하면 됩니다.

전제 조건

  1. Terraform에 대한 기본적인 이해\n
  2. 시스템에 Terraform이 설치되어 있습니다.
  3. AWS 계정(계정이 없는 경우 생성).
  4. AWS IAM 사용자의 access_key 및 secret_key. (AWS에서 access_key 및 secret_key를 사용하여 IAM 사용자를 생성하는 방법을 알아보려면 여기를 클릭하십시오.)\n

우리가 할 일

  1. 다른 종속 리소스가 있는 VPC를 생성하기 위한 Terraform 구성 파일을 작성합니다.\n
  2. Terraform 구성 파일을 사용하여 VPC 및 기타 종속 리소스 생성\n
  3. Terraform을 사용하여 생성된 VPC 및 기타 종속 리소스 삭제\n

다른 종속 리소스가 있는 VPC를 생성하기 위한 Terraform 구성 파일을 작성합니다.

terraform 구성 파일을 만들 수 있는 전용 디렉터리를 만듭니다.

다음 명령을 사용하여 디렉토리를 만들고 현재 작업 디렉토리를 변경하십시오.

mkdir terraform
cd terraform/

나는 "vim"을 파일에 쓰는 편집기로 사용하고 있습니다. 원하는 편집기를 사용하고 다음 구성을 복사하여 붙여넣어 variables.tf, terraform.tfvars 및 main.tf를 만들 수 있습니다.

종속 리소스를 사용하여 AWS에 VPC 생성을 담당하는 main.tf를 생성합니다. 이 main.tf는 variables.tf 및 terraform.tfvars에서 변수 값을 읽습니다.

vim main.tf
provider "aws" {
      region     = "${var.region}"
      access_key = "${var.access_key}"
      secret_key = "${var.secret_key}"
}


# VPC resources: This will create 1 VPC with 4 Subnets, 1 Internet Gateway, 4 Route Tables. 

resource "aws_vpc" "default" {
  cidr_block           = var.cidr_block
  enable_dns_support   = true
  enable_dns_hostnames = true
}

resource "aws_internet_gateway" "default" {
  vpc_id = aws_vpc.default.id
}

resource "aws_route_table" "private" {
  count = length(var.private_subnet_cidr_blocks)

  vpc_id = aws_vpc.default.id
}

resource "aws_route" "private" {
  count = length(var.private_subnet_cidr_blocks)

  route_table_id         = aws_route_table.private[count.index].id
  destination_cidr_block = "0.0.0.0/0"
  nat_gateway_id         = aws_nat_gateway.default[count.index].id
}

resource "aws_route_table" "public" {
  vpc_id = aws_vpc.default.id
}

resource "aws_route" "public" {
  route_table_id         = aws_route_table.public.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.default.id
}

resource "aws_subnet" "private" {
  count = length(var.private_subnet_cidr_blocks)

  vpc_id            = aws_vpc.default.id
  cidr_block        = var.private_subnet_cidr_blocks[count.index]
  availability_zone = var.availability_zones[count.index]
}

resource "aws_subnet" "public" {
  count = length(var.public_subnet_cidr_blocks)

  vpc_id                  = aws_vpc.default.id
  cidr_block              = var.public_subnet_cidr_blocks[count.index]
  availability_zone       = var.availability_zones[count.index]
  map_public_ip_on_launch = true
}

resource "aws_route_table_association" "private" {
  count = length(var.private_subnet_cidr_blocks)

  subnet_id      = aws_subnet.private[count.index].id
  route_table_id = aws_route_table.private[count.index].id
}

resource "aws_route_table_association" "public" {
  count = length(var.public_subnet_cidr_blocks)

  subnet_id      = aws_subnet.public[count.index].id
  route_table_id = aws_route_table.public.id
}


# NAT resources: This will create 2 NAT gateways in 2 Public Subnets for 2 different Private Subnets.

resource "aws_eip" "nat" {
  count = length(var.public_subnet_cidr_blocks)

  vpc = true
}

resource "aws_nat_gateway" "default" {
  depends_on = ["aws_internet_gateway.default"]

  count = length(var.public_subnet_cidr_blocks)

  allocation_id = aws_eip.nat[count.index].id
  subnet_id     = aws_subnet.public[count.index].id
}
 

변수의 선언 및 정의가 포함된 variables.tf를 만듭니다.

vim variables.tf
variable "access_key" {
     description = "Access key to AWS console"
     
}
variable "secret_key" {
     description = "Secret key to AWS console"
     
}

variable "region" {
  default     = "eu-west-3"
  type        = string
  description = "Region of the VPC"
}


variable "cidr_block" {
  default     = "10.0.0.0/16"
  type        = string
  description = "CIDR block for the VPC"
}

variable "public_subnet_cidr_blocks" {
  default     = ["10.0.0.0/24", "10.0.2.0/24"]
  type        = list
  description = "List of public subnet CIDR blocks"
}

variable "private_subnet_cidr_blocks" {
  default     = ["10.0.1.0/24", "10.0.3.0/24"]
  type        = list
  description = "List of private subnet CIDR blocks"
}

variable "availability_zones" {
  default     = ["eu-west-3a", "eu-west-3b"]
  type        = list
  description = "List of availability zones"
}
 

위 파일에 정의된 access_key 및 secret_key 변수의 정의를 포함하는 terraform.tfvars를 생성합니다. 이 두 변수의 선언을 terraform.tfvars 파일에 보관했습니다.

IAM 사용자의 키로 다음 키를 변경해야 합니다.

vim terraform.tfvars
access_key = "AKIAQ6GAIA5XIHHM2GJM"
secret_key = "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"

이제 viz, variables.tf, terraform.tfvars 및 main.tf의 3개 파일이 있어야 합니다.

Terraform 구성 파일을 사용하여 VPC 및 기타 종속 리소스 생성

다음 명령어를 실행하기 전에 유효한 access_key 및 secret_key를 구성했는지 확인하세요.

사용할 첫 번째 명령은 terraform init입니다. 이 명령은 구성 내에서 사용되는 공급자에 대한 플러그인을 다운로드하고 설치합니다. 우리의 경우 AWS입니다.

terraform init

두 번째로 사용할 명령은 terraform plan입니다. 이 명령은 인프라에서 발생할 변경 사항을 확인하는 데 사용됩니다.

terraform plan

terraform apply 명령은 main.tf 파일에 언급된 AWS에 리소스를 생성합니다. 리소스를 생성하기 위한 입력을 제공하라는 메시지가 표시됩니다.

terraform apply

위 명령어를 실행하면 출력에서 20개의 새 리소스가 추가되고 0개가 삭제된 것을 확인할 수 있습니다.

AWS VPC 콘솔로 이동하여 서브넷, 라우팅 테이블 NAT 게이트웨이 및 인터넷 게이트웨이와 함께 VPC가 생성되었는지 확인할 수 있습니다.

Terraform을 사용하여 생성된 VPC 및 기타 종속 리소스를 삭제합니다.

main.tf 파일에 언급된 구성을 사용하여 만든 리소스가 더 이상 필요하지 않은 경우 "terraform destroy" 명령을 사용하여 해당 리소스를 모두 삭제할 수 있습니다.

terraform destroy

위 명령어를 실행하면 생성된 리소스 20개가 출력에서 소멸되는 것을 확인할 수 있습니다. VPC 대시보드에서 AWS를 방문하여 동일한 내용을 확인할 수 있습니다.

결론

이 기사에서는 서브넷 4개, 라우팅 테이블 4개, NAT 게이트웨이 2개, 인터넷 게이트웨이 1개가 포함된 VPC를 생성하는 단계를 살펴보았습니다. 또한 생성된 리소스가 어떻게 파괴될 수 있는지도 살펴보았습니다.