프로바이더 선언하기
프로바이더 선언하기 (Declare providers)
테라폼은 클라우드 프로바이더, SaaS 프로바이더, 그리고 다른 API와 상호작용하기 위해 프로바이더(provider)라는 플러그인에 의존해요.
출처: 문서
본문
전통적인 테라폼 구성처럼, 테라폼 컴포넌트 구성은 테라폼이 설치하고 사용할 수 있도록 어떤 프로바이더가 필요한지 최상위 레벨에서 선언해요.
컴포넌트 구성의 프로바이더는 일반 테라폼 구성과 다음과 같은 점에서 달라요.
component블록이 소싱하는 모듈은 자체 프로바이더를 선언할 수 없어요. 대신 각component블록은 프로바이더의 최상위 맵을 받아요.config블록을 사용해 프로바이더에 인자를 전달해야 해요.- 프로바이더의 별칭 이름(alias)은 자신의 블록 헤더에서 정의해요.
- 컴포넌트 구성의 프로바이더는
for_each메타 인자를 지원해요.
프로바이더를 정의한 뒤에는 테라폼 Stacks를 사용해 프로바이더를 설치하고 프로바이더 잠금 파일(lock file)을 만든 다음에 Stack을 배포할 수 있어요.
Stack에서 프로바이더 사용하기 (Use a provider in a Stack)
Stack의 provider 블록을 최상위 .tfcomponent.hcl 파일에 정의해요. 다음 예제는 AWS 프로바이더를 정의하고, 사용할 aws 프로바이더 버전을 지정하며, 프로바이더를 구성하고, 그 프로바이더 구성에 this라는 별칭 이름을 부여해요.
# providers.tfcomponent.hcl
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.7.0"
}
}
provider "aws" "this" {
config {
region = var.region
assume_role_with_web_identity {
role_arn = var.role_arn
web_identity_token = var.identity_token
}
default_tags {
tags = var.default_tags
}
}
}
프로바이더를 정의할 때는 테라폼이 어떤 프로바이더 버전을 다운로드할지 알 수 있도록 그 프로바이더를 required_providers 블록에도 추가해야 해요.
Stacks의 required_providers 블록에 대한 자세한 내용은 required_providers 블록 레퍼런스를 참고하세요. Stacks의 provider 블록에 대한 자세한 내용은 provider 블록 레퍼런스를 참고하세요.
클라우드 프로바이더를 정의할 때는 인프라를 만들 수 있도록 그 프로바이더를 인증해야 하는 경우가 많아요. 자세한 내용과 예시는 Stack 인증을 참고하세요.
프로바이더를 정의하고 구성한 뒤에는 그 구성을 Stack의 component 블록에 전달할 수 있어요. component 블록은 프로바이더 이름을 컴포넌트의 모듈이 의존하는 프로바이더에 매핑한 것을 받아요.
Stack의 프로바이더를 정의한 뒤에는 각 component 블록에 필요한 프로바이더를 전달해요. 다음 예제에서 s3 컴포넌트 블록은 앞서 정의한 aws 프로바이더와 aws.this 프로바이더 구성을 사용하도록 구성돼요.
# components.tfcomponent.hcl
component "s3" {
source = "./s3"
inputs = {
aws_region = var.aws_region
}
providers = {
aws = provider.aws.this
}
}
프로바이더를 구성한 뒤에는 테라폼 CLI를 사용해 프로바이더 잠금 파일을 생성할 수 있어요.
$ terraform stacks init
프로바이더 버전을 갱신하고 그 변경 사항을 로컬의 Stack에 적용하려면 terraform stacks init -upgrade 명령을 다시 실행해서 프로바이더 잠금 파일을 갱신해요.
동적 프로바이더 구성 (Dynamic provider configurations)
전통적인 테라폼 프로바이더와 달리, Stack 프로바이더는 for_each 메타 인자를 지원해요. for_each 메타 인자를 사용하면 입력에 기반해 프로바이더 구성을 동적으로 만들 수 있으며, 다중 리전 배포에 유용해요.
다음 예제에서 aws 프로바이더는 for_each 메타 인자를 사용해 각 리전마다 별도의 프로바이더 구성을 만들아요.
# providers.tfcomponent.hcl
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.7.0"
}
}
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 프로바이더 구성을 사용할 수 있게 해줘요.
컴포넌트 구성에서 for_each 블록을 사용해 여러 AWS 프로바이더로 구성을 정의할 수도 있어요. 다음 예제에서 s3 컴포넌트 블록은 var.regions 변수를 순회하며 각 리전마다 그 리전에 고유한 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 기능에 대한 프로바이더 지원 (Provider support for Stack features)
대부분의 프로바이더는 사용하는 버전이 Stack의 기능에 영향을 주지 않아요. 그러나 특정 프로바이더와 버전만 지연된 변경(deferred changes)을 지원해요. 예를 들어 지연된 변경을 활용하려면 Kubernetes 프로바이더 버전 2.32.0 이상을 사용해야 해요.
다양한 Stack 기능을 지원하는 버전에 대한 더 많은 정보는 Terraform 레지스트리에서 프로바이더를 확인하세요.
프로바이더 잠금 파일 (Provider lock file)
Stack은 프로바이더 잠금 파일 없이는 실행할 수 없어요. 프로바이더를 정의한 뒤에는 테라폼 CLI를 사용해 .terraform.lock.hcl 잠금 파일을 생성해요. terraform stacks init 명령이 .terraform.lock.hcl 파일을 만들고 갱신해요.
$ terraform stacks init
terraform stacks init 명령은 구성의 required_providers 블록을 사용해 나열된 프로바이더를 다운로드하고 프로바이더 잠금 해시를 계산해요. Stack의 프로바이더를 갱신했다면 terraform stacks init -upgrade 명령을 실행해서 로컬의 Stack 잠금 파일을 갱신해요. 자세한 내용은 terraform stacks 명령을 참고하세요.
다음 단계
프로바이더를 선언한 뒤에는 나머지 컴포넌트 구성 정의를 마치거나, 테라폼이 Stack을 어떻게 배포할지 정의할 수 있어요.