providers 메타-인자
providers 메타-인자 (providers reference)
module 블록의 providers 메타-인자로 자식 모듈이 사용할 프로바이더 구성을 지정하는 방법을 설명해 드릴게요. 여러 리전 등에서 프로바이더 구성을 선택적으로 공유할 때 유용해요.
출처: 문서
본문
기본적으로 자식 모듈은 부모 모듈의 기본 프로바이더 구성을 상속해요. module 블록에서 providers 인자를 사용해 대체 프로바이더 구성을 지정할 수 있어요. providers 인자는 Terraform이 참조된 프로바이더 구성을 사용해 모듈 리소스를 만들도록 지시해요.
사용법 (Usage)
module 블록에서 선택적 providers 메타-인자를 추가해 부모 모듈의 어떤 프로바이더 구성이 자식 모듈 안에서 사용 가능한지 지정할 수 있어요.
providers 값은 맵이며, 키는 자식 모듈 안에서 사용되는 프로바이더 구성 이름이고 값은 부모 모듈의 프로바이더 구성 이름이에요. 키와 값은 프로바이더 구성에 대한 인용되지 않은 참조예요. 기본 구성의 경우 참조는 프로바이더의 로컬 이름이고, 대체 구성의 경우 참조는 alias 형식을 사용해요.
자식 모듈 안에서 Terraform은 리소스 유형의 이름에 기반해 기본값을 선택하거나, 리소스가 provider 인자로 대체 구성을 지정해요. 모듈이 호출될 때 providers 맵을 받으면 모듈 안에서 사용되는 프로바이더 구성 이름은 부모 모듈의 지정된 구성을 참조하도록 효과적으로 재매핑돼요.
다음 예시에서 Terraform은 명시적 프로바이더 인스턴스가 선택되지 않은 루트 모듈의 AWS 리소스에 기본 aws 구성을 사용하지만, 예시 자식 모듈은 usw2 별칭의 대체 구성을 사용해요. 결과적으로 모듈이 정의하는 모든 AWS 리소스는 us-west-2 리전을 사용해요.
provider "aws" {
region = "us-west-1"
}
provider "aws" {
alias = "usw2"
region = "us-west-2"
}
module "example" {
source = "./example"
providers = {
aws = aws.usw2
}
}
기본 동작 (Default behavior)
자식 모듈이 configuration_aliases를 선언하지 않으면 providers 인자는 선택적이에요. 인자를 생략하면 자식 모듈은 부모 모듈의 모든 기본 프로바이더 구성을 상속해요. 기본 프로바이더 구성은 alias 인자가 없는 구성이에요. providers 인자를 지정하면 기본 동작이 취소되므로, 자식 모듈은 지정한 프로바이더 구성에만 접근할 수 있어요.
providers를 지정해야 하는 경우 (When to specify providers)
다음 조건 중 하나가 적용될 때 providers 인자를 추가해요:
- 자식 모듈에 서로 다른 기본 프로바이더 구성을 사용할 때.
- 같은 프로바이더의 여러 구성을 요구하는 모듈을 구성할 때.
기본 프로바이더 구성 변경 (Change default provider configurations)
대부분의 재사용 가능한 모듈은 기본 프로바이더 구성만 사용하며, providers를 생략하면 호출자로부터 자동 상속할 수 있어요. 하지만 같은 프로바이더의 여러 구성을 사용하는 Terraform 구성에서는 일부 자식 모듈은 기본 프로바이더 구성을, 다른 모듈은 대체 구성을 사용하길 원할 수 있어요.
흔한 사용 사례는 하나의 구성을 사용해 같은 클라우드 프로바이더의 여러 다른 리전의 리소스를 관리하는 것이에요. providers 인자를 사용하면 자식 모듈을 편집할 필요 없이 이를 수용할 수 있어요. 자식 모듈 안의 코드는 항상 기본 프로바이더 구성을 참조하지만, 그 기본의 실제 구성은 각 인스턴스마다 다를 수 있어요.
모듈 개발자를 위한 정보 (Information for module developers)
재사용 가능한 자식 모듈 안에서 프로바이더를 다루는 더 자세한 내용과 지침은 모듈 안의 프로바이더를 참고해요.
지원되는 구성 (Supported constructs)
providers를 다음 Terraform 구성 블록에서 사용할 수 있어요: module 블록. 다음 스택 구성 블록에서도 사용할 수 있어요: component 블록, removed 블록.
예시 사용 사례 (Example use cases)
대체 프로바이더 구성이 있는 모듈 (Modules with alternate provider configurations)
드문 경우지만 단일 재사용 모듈이 같은 프로바이더의 여러 구성을 요구할 수 있어요. 예를 들어 네트워크 간 연결을 구성하는 모듈은 source 및 destination 프로바이더 구성 둘 다 필요할 가능성이 높아요.
다음 예시에서 tunnel 모듈은 자체 프로바이더 구성을 지원하는 리소스를 포함해요. 결과적으로 각 리소스 별칭은 루트 모듈에 선언된 서로 다른 프로바이더 구성에 매핑돼요:
provider "aws" {
alias = "usw1"
region = "us-west-1"
}
provider "aws" {
alias = "usw2"
region = "us-west-2"
}
module "tunnel" {
source = "./tunnel"
providers = {
aws.src = aws.usw1
aws.dst = aws.usw2
}
}
provider "azurerm" {
alias = "az1"
features {}
}
provider "azurerm" {
alias = "az2"
features {}
}
module "tunnel" {
source = "./tunnel"
providers = {
azurerm.src = azurerm.az1
azurerm.dst = azurerm.az2
}
}
기본이 아닌 프로바이더 구성은 자동으로 상속되지 않으므로, 이런 방식으로 작동하는 모든 모듈은 항상 providers 인자를 요구해요. 모듈 문서는 필요한 모든 프로바이더 구성 이름을 지정해야 해요.