Terraform을 사용하여 AWS에서 Virtual Private Cloud(VPC) 생성
이 페이지에서
- 전제 조건
- 우리가 할 일\n
- 다른 종속 리소스가 있는 VPC를 생성하기 위한 Terraform 구성 파일을 작성합니다.\n
- Terraform 구성 파일을 사용하여 VPC 및 기타 종속 리소스 생성\n
- Terraform을 사용하여 생성된 VPC 및 기타 종속 리소스 삭제\n
- 결론
이 기사에서는 서브넷, 인터넷 게이트웨이, NAT 게이트웨이 및 라우팅 테이블과 함께 VPC를 생성하는 방법을 보여줍니다. 우리는 4개의 서브넷이 있는 1개의 VPC를 만들 것입니다: 2개의 프라이빗 및 2개의 퍼블릭, 2개의 NAT 게이트웨이, 1개의 인터넷 게이트웨이 및 4개의 라우팅 테이블.
계속 진행하기 전에 AWS의 Terraform 및 VPC에 대한 기본적인 이해가 있다고 가정합니다. AWS 콘솔에서 VPC와 VPC 생성에 대해 알아보려면 여기를 클릭하고 Terraform의 기본 사항을 알아보려면 "Terraform이란 무엇이며 AWS EC2 인스턴스에 설치하는 방법"을 검색하면 됩니다.
전제 조건
- Terraform에 대한 기본적인 이해\n
- 시스템에 Terraform이 설치되어 있습니다.
- AWS 계정(계정이 없는 경우 생성).
- AWS IAM 사용자의 access_key 및 secret_key. (AWS에서 access_key 및 secret_key를 사용하여 IAM 사용자를 생성하는 방법을 알아보려면 여기를 클릭하십시오.)\n
우리가 할 일
- 다른 종속 리소스가 있는 VPC를 생성하기 위한 Terraform 구성 파일을 작성합니다.\n
- Terraform 구성 파일을 사용하여 VPC 및 기타 종속 리소스 생성\n
- 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를 생성하는 단계를 살펴보았습니다. 또한 생성된 리소스가 어떻게 파괴될 수 있는지도 살펴보았습니다.