사용 사례
사용 사례 (Use Cases)
Stacks는 컴포넌트를 정의·구성·재사용한 다음, 그 컴포넌트가 기술하는 인프라를 서로 다른 배포들에서 일관되게 배포하는 방법을 제공해요.
출처: 문서
본문
Stacks는 다음 상황에 이상적이에요.
- 공통 생명주기를 가진 인프라를 관리할 때. 예: HCP Terraform이 여러 서비스를 함께 배포해야 하는 마이크로서비스 아키텍처.
- 서로 다른 환경, 리전, 또는 계정에 걸쳐 일관되고 동기화된 배포를 요구하는 인프라를 반복할 때.
- 서로 다른 환경에서 변하는 인프라를 긴밀하게 오케스트레이션할 때. Stacks는 의존성을 관리하고 테라폼이 리소스를 올바른 순서로 만들 수 있게 보장해줘요.
Stacks는 이런 시나리오에서 인프라를 다루는 복잡성을 줄여줘서, 구성이 체계적이고 유지보수 가능하며 확장 가능하게 유지되도록 도와줘요.
배포 의존성 관리 (Manage deployment dependencies)
Stacks는 복잡한 인프라 배포 내의 의존성을 자동으로 관리할 수 있게 해줘요. 인프라의 컴포넌트 간에 상호 의존성이 있다면, HCP Terraform은 Stack 컴포넌트가 아직 사용 가능하지 않은 속성을 요구하는지 인식하고, 적용할 수 있을 때까지 그 변경 계획을 지연시켜요.
직접 해보기: 배포 의존성을 관리하는 Stacks 예제는 Stacks로 Kubernetes 워크로드 관리 튜토리얼을 참고하세요.
예를 들어 커스텀 리소스를 사용하는 Kubernetes 워크로드를 관리할 때, CRD(Custom Resource Definition) API와 그 API를 사용하는 리소스를 단일 단계로 프로비저닝할 수 없어요. 이런 시나리오에서 HCP Terraform은 먼저 CRD를 배포하고, 그다음 두 번째 plan·apply에서 CRD가 필요한 리소스를 배포해야 해요. 이 구성을 HCP Terraform 워크스페이스로 배포하면 이 워크플로우를 완수하기 위해 여러 워크스페이스를 관리해야 해서 복잡해질 수 있어요.
Stack을 사용하면 HCP Terraform이 컴포넌트 간 의존성을 인식해서, 성공적으로 완료할 수 있을 때까지 컴포넌트의 plan·apply 단계를 자동으로 지연시켜요. Stacks가 지연된 변경(deferred changes)을 계획하는 방법에 대해 더 알아보세요.
여러 환경에 배포 (Deploy to multiple environments)
여러 환경에 걸쳐 인프라를 관리하는 것은 어려울 수 있어요. 특히 각 환경이 일관성을 유지하도록 해야 할 때 특히 그렇죠. 예를 들어 개발, 스테이징, 프로덕션 같은 여러 환경의 인프라를 관리한다면, 각 환경은 격리되어야 하지만 서로의 구성을 반영해야 해요.
Stacks는 단일 구성 안에서 각 환경의 배포를 정의할 수 있게 해줘서, 모든 환경에 걸쳐 균일성을 유지하고 갱신하는 것을 더 쉽게 만들어요.
# deployments.tfdeploy.hcl
deployment "production" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws.jwt
}
}
deployment "development" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws.jwt
}
}
Stacks는 환경 추가·제거도 단순화해요. deployment 블록을 추가하면 동일한 컴포넌트 구성과 인프라 컴포넌트를 사용해 새 환경을 만들 수 있어요.
# deployments.tfdeploy.hcl
deployment "production" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws.jwt
}
}
deployment "development" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws.jwt
}
}
deployment "staging" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws.jwt
}
}
기본적으로 HCP Terraform은 구성을 변경했음을 알아차리고 새 배포에 대한 새 plan을 만들 거예요.
여러 리전에 배포 (Deploy across regions)
글로벌 애플리케이션의 경우 낮은 지연 시간과 높은 가용성을 보장하기 위해 여러 클라우드 리전에 걸쳐 인프라를 배포하는 것이 흔하게 필요해요. Stacks는 통합 구성을 사용해 여러 리전 간 배포를 관리할 수 있게 해줘서, 각 리전을 일관되게 설정하면서도 리전별 사용자 지정을 허용해요.
예를 들어 동일한 환경을 두 리전에 배포하고 싶다면, 배포를 리전별로 설정할 수 있어요.
# deployments.tfdeploy.hcl
identity_token "aws_west" {
audience = ["aws.workload.identity.west"]
}
identity_token "aws_east" {
audience = ["aws.workload.identity.east"]
}
deployment "us_dev_east" {
inputs = {
aws_region = "us-east-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws_east.jwt
}
}
deployment "us_dev_west" {
inputs = {
aws_region = "us-west-1"
instance_count = 2
role_arn = "<YOUR_ROLE_ARN>"
identity_token = identity_token.aws_west.jwt
}
}
Stacks는 provider와 component 블록 모두에서 for_each 메타 인자를 지원해요. for_each 메타 인자를 사용하면 반복 리전에서 인프라 배포를 간소화할 수 있어요. 다음 예제에서 regions 변수는 배포할 리전의 집합을 기대해요.
# variables.tfstack.hcl
# The regions variable is where we specify each region we want to deploy this
# Stack's infrastructure within.
variable "regions" {
type = set(string)
}
variable "identity_token" {
type = string
ephemeral = true
}
variable "role_arn" {
type = string
}
그런 다음 프로바이더 구성을 설정해서 var.regions 변수를 순회하며 각 리전용 프로바이더 버전을 구성하게 할 수 있어요.
# providers.tfcomponent.hcl
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.7.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.5.1"
}
}
provider "aws" "configurations" {
for_each = var.regions
config {
region = each.value
assume_role_with_web_identity {
role_arn = var.role_arn
web_identity_token = var.identity_token
}
}
}
Stack의 각 배포는 regions 변수에 정의한 각 리전에 대해 별도의 AWS 프로바이더 구성을 사용해요. 이는 구성에서 us-east-1 리전의 AWS 프로바이더를 provider.aws.configurations["us-east-1"]로 참조한다는 뜻이에요.
for_each 메타 인자를 사용해 각 리전에서 component의 테라폼 모듈을 배포하면 Stack 컴포넌트를 동적으로 유지할 수 있어요.
# 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
}
}
이 예제의 컴포넌트는 for_each 메타 인자를 사용해 현재 배포의 리전에 자신의 테라폼 모듈을 배포해요. provider.aws.configurations[each.value]로 컴포넌트가 주어진 리전에 올바른 프로바이더를 사용하도록 AWS 프로바이더를 구성하는 것에 주목하세요.
여러 계정에 배포 (Deploy across accounts)
Stacks는 서로 다른 클라우드 프로바이더 계정에 걸쳐 인프라를 관리할 때도 유용해요. 각 계정의 인프라가 일관적이지만 격리되도록 보장해주거든요.
# deployments.tfdeploy.hcl
identity_token "aws_prod" {
audience = ["aws.prod.workload.identity"]
}
identity_token "aws_dev" {
audience = ["aws.dev.workload.identity"]
}
deployment "development" {
inputs = {
aws_region = "us-east-1"
role_arn = "<development AWS account IAM role ARN>"
identity_token = identity_token.aws_dev.jwt
}
}
deployment "production" {
inputs = {
regions = ["us-east-1", "us-west-1"]
role_arn = "<production AWS account IAM role ARN>"
identity_token = identity_token.aws_prod.jwt
}
}
Stacks는 서로 다른 계정에 걸쳐 공유 인프라 컴포넌트를 정의·배포하게 해줘서, 보안과 조직 경계를 준수하면서도 일관성을 유지해요.
더 알아보기 (Learn more)
- Stacks 개요 — Stacks 개념.
- Stack 설계 — Stack 설계 가이드.
- Stack 간 데이터 전달 — 배포 간 데이터 공유.