HashiCorp./terraform
[Terraform] Module 사용하기
인쥭
2021. 4. 14. 10:32
반응형
- 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}"