Terraform 모듈로 반복 리소스 선언 줄이기
나는 Terraform(이하 테라폼)으로 cloud의 인프라 리소스를 관리하는 업무를 주로 맡고 있다. 테라폼은 모듈 구조를 지원하는데 활용법이 성숙도에 따라서 많이 달라진다고 느꼈다.
기존에 내가 모듈을 사용하는 방법은 여러 환경에서 환경 변수를 다르게 주입해서 리소스를 만들때 리소스 코드를 줄이기 위함이었다. 하지만 업무를 하다보니 틀은 동일하고 특정한 값만 바뀌는 리소스를 여러 개 생성하야 하는 경우가 많았다. 예를 들어서 서버리스로 서비스를 운영하는 경우 AWS 리소스인 Lambda를 주로 생성하게 된다.
그래서 나는 Lambda가 사용하는 리소스가 공통적으로 사용하는 틀을 모듈을 생성하는 방향을 생각했다.
Terraform 구조
구조 자체는 간단하다.
1. 전체 리소스를 관리하는 main.tf
2. main.tf에서 쓰일 Lambda 리소스 모듈
3. Lambda 리소스 모듈이 사용할 공통 틀 모듈
실제 코드는 Github를 참고 바라며 Lambda를 구성할 때 필요한 모든 코드를 작성하지는 않았고 모듈을 구성할 때 필요한 코드만 작성했다. 구조를 도식화 했을 때는 다음과 같다.
여기서 중요한 점은 틀을 제공하더라도 반드시 바꿀수 있는 여지를 둬야한다는 점이다. 다양한 부분을 변수로 선언하고 default를 줘서 많은 부분을 커버할 수 있게 해야한다. 따라서 Lambda를 생성할 때 필요한 요소들을 식별하고 반드시 변경되는 부분, 변경될 수 있는 부분을 구분하자.
반드시 변경되는 부분: 함수 이름, 이미지 주소
변경될 수 있는 부분: 아키텍처, 패키지 타입, 메모리 사이즈
들이 있을 수 있다. 그러면 예시로 Lambda과 LambdaCommon의 일부분을 보자.
## Lambda Common main.tf
resource "aws_lambda_function" "lambda" {
function_name = var.lambda_name
image_uri = var.image_uri
architectures = var.architectures
package_type = "Image"
memory_size = var.memory_size
role = aws_iam_role.lambda.arn
timeout = var.timeout
environment {
variables = merge(var.variables, local.commons)
}
tracing_config {
mode = "Active"
}
vpc_config {
security_group_ids = []
subnet_ids = []
}
}
LambdaCommon의 일부분이다. 이때 위에서 언급한 함수 이름, 이미지 주소는 반드시 변경되는 부분이기 때문에 default를 주는 의미가 없어진다. 하지만 아키텍처, 패키지 타입, 메모리 사이즈는 동일하게 사용될 수 있으므로 default를 줄 수 있다. 따라서 variables를 아래와 같이 작성할 수 있다.
## Lambda Common variables.tf
variable "lambda_name" {}
variable "image_uri" {}
variable "variables" {}
variable "architectures" {
default = ["x86_64"]
}
variable "memory_size" {
default = 256
}
variable "timeout" {
default = 900
}
variable "retention_days" {
default = 14
}
Lambda Common은 이렇게 작성할 수 있고, Lambda는 이제 변경될 수 있는 부분들을 골라주면 된다.
## Lambda main.tf
module "example_1" {
source = "./common"
lambda_name = "example-1"
variables = []
image_uri = "example-1"
}
module "example_2" {
source = "./common"
# 반드시 변경되는 부분
lambda_name = "example_2"
variables = {
"example-2" = "example-2"
}
image_uri = "example-2"
# 변경될 수 있는 부분
architectures = ["arm64"]
memory_size = 1024
timeout = 20
retention_days = 1
}
이렇게 하면 Lambda를 생성할 때의 기본 틀을 여러 번 작성하지 않을 수 있다. 주의할점은 Lambda Common의 output.tf에 arn,name 같은 것을 적어야지 바깥쪽 모듈에서 사용할 수 있게 된다.
코드의 반복을 줄이려고 고민하다 보니 이러한 모듈 구조를 생각하게 됐다. Terraform을 실제로 사용하는데 아직까지는 장점만 느끼고 있다.
'DevOps' 카테고리의 다른 글
AWS DevOps Engineer Professional (DOP-C02) 준비 (1) | 2023.08.12 |
---|---|
Terraform Associate (003) 자격증 취득 후기 (0) | 2023.06.19 |
Postman 설치와 사용법 (0) | 2022.01.14 |
댓글
이 글 공유하기
다른 글
-
AWS DevOps Engineer Professional (DOP-C02) 준비
AWS DevOps Engineer Professional (DOP-C02) 준비
2023.08.12 -
Terraform Associate (003) 자격증 취득 후기
Terraform Associate (003) 자격증 취득 후기
2023.06.19 -
Postman 설치와 사용법
Postman 설치와 사용법
2022.01.14