모듈 안의 프로바이더
모듈 안의 프로바이더 (Providers Within Modules)
재사용 가능한 모듈 안에서 프로바이더를 어떻게 선언하고 다루는지 설명해 드릴게요. configuration_aliases와 호출자의 providers 인자로 프로바이더 구성을 전달할 수 있어요.
출처: 문서
본문
일반적인 규칙으로, 모듈 안에는 프로바이더 **구성(즉, provider 블록)**을 넣지 않는 것이 좋아요. 프로바이더 구성은 호출자(루트 모듈)가 만들고, 모듈은 필요한 프로바이더 버전과 대상 프로바이더의 종류만 선언해요. 이렇게 하면 자식 모듈이 각 호출 위치에 맞는 프로바이더 구성을 상속받을 수 있어요.
프로바이더 요구사항 선언 (Declaring provider requirements)
모듈은 terraform 블록의 required_providers로 필요한 프로바이더의 버전 범위를 선언해요:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
기본 프로바이더 상속 (Inheriting default providers)
자식 모듈이 configuration_aliases를 선언하지 않으면, 자식 모듈의 리소스는 기본적으로 부모로부터 기본 프로바이더 구성을 상속해요. 따라서 자식 모듈은 별도 providers 인자 없이도 호출자와 같은 기본 프로바이더 구성을 사용해요.
프로바이더 별칭 (Provider aliases within modules)
자식 모듈이 같은 프로바이더의 여러 구성을 요구하거나, 호출자가 서로 다른 프로바이더 구성을 전달해야 한다면 모듈이 configuration_aliases로 별칭을 선언해야 해요:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
configuration_aliases = [ aws.alternate ]
}
}
}
모듈 안의 리소스에 provider = aws.alternate처럼 별칭을 지정해요. configuration_aliases를 선언하면 자식 모듈이 그 별칭 프로바이더 구성을 요구한다는 뜻이므로, 호출자가 providers 인자로 이를 채워야 해요.
호출자가 프로바이더 전달 (Passing providers from the caller)
모듈을 호출할 때 providers 메타-인자로 자식 모듈이 사용할 프로바이더 구성을 매핑해요:
provider "aws" {
alias = "useast"
region = "us-east-1"
}
module "example" {
source = "./example"
providers = {
aws = aws # 기본 구성
aws.alternate = aws.useast # 별칭 매핑
}
}
providers 맵의 키는 모듈 안에서 선언한 프로바이더 구성 이름(aws, aws.alternate 등)이고, 값은 호출자(루트)의 프로바이더 구성 참조예요. providers를 지정하면 자식 모듈은 지정된 구성만 사용할 수 있어요.
일반적인 관례 (Best practices)
- 모듈 안에 호스트별 프로바이더 구성(예: 리전 하드코딩)을 넣지 마세요.
- 여러 구성을 요구하는 모듈은
configuration_aliases를 사용해 의도를 문서화해요. - 모듈 문서에 필요한 프로바이더 구성을 명확히 적어요.