티스토리 뷰

반응형
  • vpc를 모듈화하여 환경별로 다르게 vpc를 생성할 수 있도록 해보자.
  • 아래의 파일 명, 리소스 명 등은 임의로 변경하여도 완전히 무방하다!

 

1. module 작성하기

  • 먼저 테라폼 디렉토리에 하위 디렉토리를 만들어준다.
    • 해당 디렉토리 명은 이후 모듈에서 사용할 것임!
[terraform] tree
terraform
├── ec2.tf
├── main.tf
├── variables.tf
└── vpc_module
    ├── gateway.tf
    ├── outputs.tf
    ├── route.tf
    ├── variables.tf
    └── vpc.tf
  • vpc_module의 tf 파일들의 내용은 일반적인 작성 방법과 다르지 않다.
  • 다만 cidr 블록 등은 유동적으로 변경할 수 있도록, 다음과 같이 vpc_module/variable.tf와 vpc.tf로 작성한다.
// vpc_module/variable.tf

variable "az_a" {
  type = string
}
variable "az_c" {
  type = string
}

variable "cidr_vpc" {
  type = string
}

variable "cidr_private_a" {
  type = string
  description = "Private Subnet Primary"
}

variable "cidr_private_b" {
  type = string
  description = "Private Subnet Secondary"
}

variable "cidr_public_a" {
  type = string
  description = "Public Subnet"
}
// vpc_module/vpc.tf

resource "aws_vpc" "vpc" {
  cidr_block = var.cidr_vpc
  instance_tenancy = "default"
  tags = {
    Name = "ingnoh-VPC"
  }
}

resource "aws_subnet" "private_subnet_a" {
  cidr_block = var.cidr_private_a
  vpc_id = aws_vpc.vpc.id
  availability_zone = var.az_a

  tags = {
    Name = "ingnoh-Private-Subnet-Primary"
  }
}
  • module 내부에서 만들어진 리소스는 밖에서 접근하기 위해 outputs.tf를 작성해야 한다.
    • 파일 명은 바뀌어도 무방하다. ingnoh.tf던... 다만 vpc_module 디렉토리 내부에 작성해야 한다.
// vpc_module/outputs.tf

output "vpc_id" {
  value = aws_vpc.vpc.id
}

output "private_subnet_a_id" {
  value = aws_subnet.private_subnet_a.id
}

output "private_subnet_b_id" {
  value = aws_subnet.private_subnet_b.id
}

output "public_subnet_a_id" {
  value = aws_subnet.public_subnet_a.id
}

 

2. module 외부에서 사용하기

  • 해당 내용은 main.tf와 terraform/variable.tf를 조합하여 다음과 같이 적용해볼 수 있다.
// terraform/variables.tf

variable "az_a" {
  type = string
  default = "ap-northeast-2a"
}
variable "az_c" {
  type = string
  default = "ap-northeast-2c"
}
variable "cidr_vpc" {
  type = string
}
variable "cidr_private_a" {
  type = string
}
variable "cidr_private_b" {
  type = string
}
variable "cidr_public_a" {
  type = string
}
// terraform/main.tf

module "network" {
  source = "./vpc_module"

  az_a = var.az_a
  az_c = var.az_c
  cidr_vpc = var.cidr_vpc
  cidr_private_a = var.cidr_private_a
  cidr_private_b = var.cidr_private_b
  cidr_public_a = var.cidr_public_a
}
  • source 값은 모듈로 사용할 파일들이 저장된 디렉토리를 명시한다.
    • 여기서 ./vpc_module/vpc.tf 하는 식으로 시도하는 삽질은 하지 말자. vpc_module이라는 디렉토리 이름 자체를 입력해준다.
  • terraform 디렉토리에서 terraform init > plan > apply 과정을 거치되, 이제부터는 cidr 블록을 입력받게 된다.

 

3. 적용 방법

  • ec2 인스턴스에서 vpc_module 내부에 작성된 서브넷을 사용하는 경우, 다음과 같이 작성해볼 수 있다.
terraform/ec2.tf

resource "aws_instance" "ec2" {
  // ... 중략
  subnet_id = module.network.public_subnet_a_id
  
  // ... 후략
}
  • module 키워드로 terraform/main.tf에서 작성한 network 모듈을 불러오고,
    network 모듈 내부의 outputs.tf에 선언해둔 서브넷 id를 가져오는 예시이다.

 

  • 이렇게 작성된 tf 파일들을 terraform apply에 매개변수를 넣어 사용하려면 다음과 같이 적용해볼 수 있다.
    • ${} 내부의 값은 원하는 CIDR 값으로 변경하여 사용한다.
terraform apply -var="cidr_private_a=${cidr_private_a}" -var="cidr_private_b=${cidr_private_b}" \
    -var="cidr_public_a=${cidr_public_a}" -var="cidr_vpc=${cidr_vpc}"
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함