구성 정의하기
구성 정의하기 (Define configuration)
컴포넌트 구성 파일에서 어떤 인프라 컴포넌트가 Stack의 일부인지 선언해요.
출처: 문서
본문
컴포넌트 구성 파일은 반복 배포할 수 있는 생명주기를 공유하는 여러 컴포넌트를 정의해요. 이는 환경 전반의 일관성을 보장하고 대규모 프로비저닝의 복잡성을 줄여줘요.
배경 (Background)
Stack을 구성하는 인프라를 컴포넌트 구성 파일에서 선언해요. 컴포넌트 구성 파일은 테라폼의 전통적인 루트 모듈을 대체하며, Stack이 배포하는 것의 청사진 역할을 해요.
컴포넌트 구성 파일은 <NAME>.tfcomponent.hcl 파일 타입을 사용하며, Stack의 생명주기를 공유하는 모든 것을 정의해요. 컴포넌트 구성을 작성한 뒤에는 HCP Terraform이 Stack의 인프라를 어떻게 배포할지 정하는 배포 구성을 작성할 수 있어요.
테라폼 구성 파일과 마찬가지로, HCP Terraform은 Stack의 루트 디렉터리에 있는 컴포넌트 구성과 배포 구성 파일의 모든 블록을 의존성 순서대로 처리해요. 전통적인 테라폼 구성처럼 컴포넌트 구성을 여러 파일로 나눠 구성할 수 있어요.
요구사항 (Requirements)
Stacks CLI 플러그인에 접근하고 terraform stacks CLI 명령을 실행하려면 테라폼 v1.13.x 이상을 사용하세요.
베타 릴리스 동안 Stacks는 별도의 Terraform Stacks CLI가 있었지만, 더 이상 현재 기능을 지원하지 않아요.
버전 파일 만들기 (Create a version file)
Stack의 루트 디렉터리에 .terraform-version 파일을 추가해서 Stack에 필요한 테라폼 버전을 지정하는 것으로 시작해요. 예를 들어 다음 파일은 테라폼 v1.13.0을 지정해요.
# .terraform-version
1.13.0
컴포넌트 구성 정의하기 (Define your component configuration)
구성 파일 작성 전에 Stack을 설계하는 것을 권장해요.
Stack의 모든 구성 파일은 .tfcomponent.hcl 파일 타입을 사용해야 해요. 전통적인 테라폼 구성처럼 컴포넌트 구성을 여러 파일로 나눠 구성할 수 있어요. 예를 들어 variables.tfcomponent.hcl, providers.tfcomponent.hcl을 가질 수 있고, components.tfcomponent.hcl 같은 component 블록용 루트 레벨 파일을 하나 만드는 것을 권장해요.
component 블록은 Stack을 구성하는 조각들을 정의해요. Stack에 포함하려는 각 최상위 모듈마다 component 블록을 추가해요. 각 컴포넌트에 대해 소스 모듈, 입력, 프로바이더를 지정해요.
# components.tfcomponent.hcl
component "cluster" {
source = "./eks"
inputs = {
aws_region = var.aws_region
cluster_name_prefix = var.prefix
instance_type = "t2.medium"
}
providers = {
aws = provider.aws.this
random = provider.random.this
tls = provider.tls.this
cloudinit = provider.cloudinit.this
}
}
최상위 모듈을 확립한 뒤에는 추가 component 블록 없이도 자식 모듈을 사용할 수 있어요.
component 블록은 여러 인스턴스에 걸쳐 컴포넌트를 복제해야 한다면 for_each 메타 인자를 지원해요. 예를 들어 다음 구성은 for_each를 사용해 주어진 환경의 여러 AWS 리전에 모듈을 프로비저닝해요.
# components.tfcomponent.hcl
component "s3" {
for_each = var.regions
source = "./s3"
inputs = {
region = each.value
}
providers = {
aws = provider.aws.configurations[each.value]
random = provider.random.this
}
}
컴포넌트 구성 파일에서 Stack의 컴포넌트를 구성하기 위해 다음 블록들을 정의할 수 있어요.
component블록 — Stack을 구성하는 개별 모듈들을 소싱해요. 각 컴포넌트는 입력 변수를 받고 Stack 레벨에서 선언한 프로바이더를 받아요.required_providers블록 — 테라폼이 설치하고 사용할 수 있도록 컴포넌트 구성이 요구하는 프로바이더를 선언해요.provider블록 — 프로바이더를 구성하고 그 구성을 컴포넌트에 전달해요.removed블록 — 리소스의 적절한 정리를 보장하면서 Stack에서 제거하려는 컴포넌트를 정의해요.variable블록 — 배포가 서로 다른 값으로 설정할 수 있는 입력 변수를 정의해요.output블록 — HCP Terraform UI에 노출하고 배포가 사용할 수 있게 할 값을 정의해요.locals블록 — 컴포넌트 구성 안에서 참조할 수 있는 로컬 값을 정의해요.
Stack에서는 프로바이더 인증이 다르게 동작해요. Stacks에서 프로바이더 선언에 대한 자세한 내용은 프로바이더 선언을 참고하세요.
컴포넌트 구성을 작성한 뒤에는 테라폼 CLI를 사용해 로컬에서 구성을 검증할 수 있어요.
지원되는 테라폼 함수
컴포넌트 구성은 테라폼 함수의 부분집합을 지원해요. Stacks 컴포넌트가 지원하는 함수 목록은 내장 함수(Built-in Functions)를 참고하세요. Stacks 컴포넌트가 참조하는 테라폼 모듈은 모든 테라폼 함수를 지원해요.
구성 검증하기 (Validate your configuration)
컴포넌트 구성을 마치면 terraform stacks CLI 명령으로 구성을 검증하고 필요한 프로바이더 잠금 파일을 생성할 수 있어요.
$ terraform stacks init
$ terraform stacks validate
또한 terraform fmt 명령으로 구성 파일을 다시 포맷해 일관된 스타일을 유지할 수 있어요.
$ terraform stacks fmt
다음 단계
아직 Stack의 프로바이더를 정의하지 않았다면 프로바이더 선언으로 진행해요. 프로바이더가 제대로 설정되도록 Stack 인증 방법도 배울 수 있어요.
컴포넌트 구성을 완료한 뒤의 다음 단계는 Stack의 인프라를 어떻게 배포할지 지정하는 배포 구성 정의예요.
더 알아보기 (Learn more)
- Stack 설계 — 구성 작성 전 설계.
- 프로바이더 선언 — Stacks에서 프로바이더 선언.
- Stack 컴포넌트와 리소스 관리 — 컴포넌트 추가·제거.