provider 블록 참조

provider 블록 참조 (Provider Block Reference)

provider 블록을 사용해 Terraform 플러그인, 즉 프로바이더를 선언하고 구성할 수 있어요. 프로바이더는 Terraform이 프로바이더 정의 리소스와 데이터 소스를 사용해 실제 인프라스트럭처를 관리할 수 있게 해줘요.

출처: 문서

본문

provider 블록을 사용해 프로바이더라고 불리는 Terraform 플러그인을 선언하고 구성하세요. 프로바이더는 Terraform이 프로바이더 정의 리소스와 데이터 소스로 실제 인프라스트럭처를 관리할 수 있게 해줘요.

직접 해보기: Perform CRUD Operations with Providers 튜토리얼을 시도해보세요.

배경

provider 블록은 Terraform이 클라우드 프로바이더, SaaS 프로바이더 및 기타 API와 상호작용할 수 있게 해주는 플러그인인 명명된 프로바이더를 구성해요.

HashiCorp의 공개 Terraform 레지스트리는 Terraform 자체와 별도로 프로바이더를 배포하며, 각 프로바이더는 자체 릴리스 주기, 문서, 버전을 가져요. HCP Terraform을 사용한다면 프라이빗 레지스트리를 사용해 조직 내에서 프로바이더를 공유할 수 있어요.

누구나 Terraform 프로바이더를 개발해 로컬로 사용하거나 Terraform 공개 레지스트리나 HCP Terraform 프라이빗 레지스트리에 게시할 수 있어요. 프로바이더 작성에 대해 더 알아보려면 플러그인 프레임워크 (Plugin framework)를 참조하세요.

Terraform 구성의 루트 모듈에 프로바이더 구성을 정의하세요. 자식 모듈은 부모 모듈에서 프로바이더 구성을 받으므로, 자식 모듈에 provider 블록을 정의하는 것은 강력히 권장하지 않아요. 구성에서 프로바이더를 선언하는 방법을 배우려면 프로바이더 요구 사항 (Provider requirements)을 참조하세요.

구성 모델

provider 블록은 다음 인자를 지원해요:

전체 구성

사용 가능한 모든 인자는 다음 provider 블록에 정의되어 있어요. aliasversion 인자는 선택 사항이며, 같은 블록에서 둘 다 사용할 수는 없어요.

provider "" {

  alias   = ""
  version = ""  # Deprecated
}

사양

provider 블록은 다음 구성을 지원해요.

provider ""

구성하려는 프로바이더의 이름을 인라인 인자로 지정해야 해요. 자세한 내용은 로컬 이름 (Local names)을 참조하세요.

provider 블록에서 다음 인자를 지정할 수 있어요:

| | 인자 | 설명 | 유형 | 필수? | | 프로바이더별 인자 | 프로바이더 개발자가 정의한 구성 인자 | 다양한 유형 | 프로바이더마다 다름 | | alias | 특정 프로바이더 구성에 대한 고유 식별자로, 동일한 프로바이더에 여러 구성을 사용할 수 있게 함 | 문자열 | 선택 | | version | 프로바이더에 대한 버전 제약. 이 인자는 사용 중지됨 | 문자열 | 선택 |

프로바이더별 인자

provider 블록의 본문에는 프로바이더 자체가 정의하는 구성 인자가 포함돼요.

provider "" {

}

프로바이더 문서는 기대하는 구성 인자를 나열해요. Terraform 레지스트리에 배포된 프로바이더의 경우, 각 프로바이더 페이지에서 버전별 문서를 볼 수 있어요.

provider 블록을 명시적으로 정의하지 않으면 Terraform은 해당 프로바이더에 대해 빈 기본 구성을 가정하고 생성해요. 그러나 프로바이더에 필수 인자가 있으면 Terraform은 필수 값 없이는 프로바이더를 만들 수 없으므로 오류를 발생시켜요.

표현식 (expressions)을 사용해 프로바이더 인자를 구성할 수 있지만, Terraform이 구성을 적용하기 전에 아는 값만 참조할 수 있어요. 입력 변수와 구성에 직접 지정한 인자는 참조할 수 있지만, google.web.public_ip 같은 계산된 리소스 속성은 참조할 수 없어요.

많은 프로바이더가 셸 환경 변수나 구성 값에 대한 다른 대체 소스를 지원해서, 버전 관리된 Terraform 구성에서 자격 증명을 빼내는 데 도움이 돼요. 각 인자가 지원하는 할당 방법에 대해 알아보려면 프로바이더 문서를 참조하세요.

요약

alias

선택적으로 alias 인자를 사용해 동일한 프로바이더에 대해 여러 구성을 정의할 수 있어요. 여러 프로바이더 별칭을 정의하면 개별 리소스, 데이터 소스 또는 모듈에 사용할 프로바이더 구성을 지정할 수 있어요.

주어진 프로바이더에 대해 여러 구성을 만들려면 동일한 프로바이더 이름으로 여러 provider 블록을 포함한 다음, 각 추가 프로바이더 구성에 alias 인자를 추가해 고유 식별자를 부여하세요.

provider "exampleName" {
  region = "us-east-1"
}

provider "exampleName" {
  alias  = "west"
  region = "us-west-1"
}

프로바이더 별칭을 참조하려면 다음 블록의 provider 인자에서 .을 사용하세요:

프로바이더에 대해 여러 별칭이 있으면 alias 인자가 없는 provider 블록이 해당 프로바이더의 기본 구성이 돼요. provider 메타-인자를 지정하지 않는 리소스, 데이터 소스, 모듈은 리소스 유형 이름과 일치하는 기본 프로바이더 구성을 사용해요.

요약

version

프로바이더 구성의 version 인자는 사용 중지되었으며, Terraform이 향후 버전에서 제거할 거예요. 대신 terraform 블록의 required_providers 블록에서 프로바이더 버전 제약을 선언하세요.

요약

  • 데이터 유형: 문자열
  • 기본값: 없음
  • 사용 중지됨

예시

다음 예시들은 provider 블록의 일반적인 사용 사례를 보여줘요.

기본 프로바이더 구성

다음 예시는 특정 프로젝트와 리전으로 google 프로바이더를 구성해요. terraform 블록의 required_providers 블록에서 사용하려는 프로바이더 버전, 프로바이더를 가져올 소스, 프로바이더의 로컬 이름을 정의해요:

terraform.tf

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 4.0"
    }
  }
}

구성의 루트 모듈에서 provider 블록으로 프로바이더를 구성할 수 있어요.

main.tf

provider "google" {
  project = "acme-app"
  region  = "us-central1"
}

여러 프로바이더 구성

다음 예시에서 AWS 프로바이더에 대한 두 구성이 서로 다른 리전을 지원해요. 기본 구성은 us-east-1을 대상으로 하고 별칭 구성은 us-west-2를 대상으로 해요:

main.tf

provider "aws" {
  region = "us-east-1"
}

provider "aws" {
  alias  = "west"
  region = "us-west-2"
}

aws_로 시작하는 리소스는 provider 인자를 제공하지 않는 한 기본 aws 프로바이더 구성을 사용해요.

대체 프로바이더 구성 선택

provider 메타-인자를 . 참조로 설정하면 리소스, 데이터 소스 또는 모듈이 대체 프로바이더 구성을 사용하도록 할 수 있어요.

다음 예시에서 aws_instance.foo 리소스는 aws.west 프로바이더 구성을 사용하고, aws_instance.bar는 기본 aws 프로바이더 구성을 사용해요:

provider "aws" {
  region = "us-east-1"
}

provider "aws" {
  alias  = "west"
  region = "us-west-2"
}

resource "aws_instance" "foo" {
  provider = aws.west
  # …
}

resource "aws_instance" "bar" {
   # …
}

기본 구성이 없는 프로바이더

구성에 프로바이더에 대한 여러 별칭이 있으면 alias 인자가 없는 provider 블록이 해당 프로바이더의 기본 구성이 돼요. 구성의 모든 provider 블록이 별칭을 사용하면 Terraform은 해당 프로바이더에 대한 암시적(implied) 빈 기본 구성을 만들어요. provider 메타-인자를 지정하지 않는 리소스는 빈 기본 구성을 사용해요.

다음 예시에서 두 AWS 프로바이더 구성 모두 별칭을 사용하지만, aws_s3_bucketprovider 인자를 지정하지 않아요:

provider "aws" {
  alias  = "east"
  region = "us-east-1"
}

provider "aws" {
  alias  = "west"
  region = "us-west-2"
}

resource "aws_s3_bucket" "default_provider" {
  bucket = "uses-implied-empty-config"
}

리소스가 provider 인자를 지정하지 않으므로 Terraform은 aws_s3_bucket 리소스에 대해 암시적 빈 기본 구성을 사용해요. 프로바이더가 특정 인자를 요구하면 리소스가 기본 구성을 사용하려고 할 때 기본이 제대로 구성되지 않았기 때문에 Terraform이 오류를 반환해요.

자식 모듈에 프로바이더 구성 전달

루트 모듈에서 프로바이더를 정의하면 Terraform은 모든 모듈이 동일한 구성을 사용하도록 해당 프로바이더 구성을 자식 모듈에 암시적으로 전달해요.

다음 예시에서 루트 모듈은 AWS 프로바이더 구성을 정의하고 Terraform은 해당 구성을 자식 모듈에 암시적으로 전달해요:

main.tf

provider "aws" {
  region = "us-west-2"
}

module "vpc" {
  source = "./modules/vpc"
}

자식 모듈은 루트 모듈에서 전달된 프로바이더 구성을 사용해요:

modules/vpc/main.tf

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "Main VPC"
  }
}

aws_vpc 리소스는 루트 모듈과 동일한 AWS 프로바이더 구성을 상속하고, Terraform은 us-west-2 리전에 aws_vpc 리소스를 만들어요.

자식 모듈은 프로바이더 소스나 버전 요구 사항을 상속하지 않으므로 자식 모듈 안에서 명시적으로 정의해야 해요. 모듈에서 프로바이더 상속에 대해 더 알아보세요.

자식 모듈에서 대체 프로바이더 구성 사용

자식 모듈에서 별칭 프로바이더 구성을 사용하려면 자식 모듈이 required_providers 블록의 configuration_aliases 인자로 별칭을 선언해야 해요.

다음 예시에서 루트 모듈은 aws.west 별칭을 web-server 자식 모듈에 전달해요:

main.tf

provider "aws" {
  region = "us-east-1"
}

provider "aws" {
  alias  = "west"
  region = "us-west-2"
}

module "web-server" {
  source = "./modules/web-server"
  providers = {
    aws.west = aws.west
  }
}

다음 configuration_aliases 인자는 자식 모듈이 aws.west로 참조할 수 있는 프로바이더 구성을 받을 것으로 기대한다고 선언해요. 이 선언이 없으면 모듈이 리소스에서 aws.west를 참조하려고 할 때 Terraform이 오류를 발생시켜요.

modules/web-server/main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
      configuration_aliases = [aws.west]
    }
  }
}

data "aws_ami" "amazon_linux" {
  provider = aws.west

  #...
}

모듈에는 프로바이더에 대한 특별한 요구 사항이 있어요. 자세한 내용은 모듈 내 프로바이더 (Providers within modules)를 참조하세요.

표현식이 있는 프로바이더 구성

다음 예시에서 프로바이더 구성은 입력 변수와 로컬 값을 사용해 인자를 설정해요:

variable "aws_region" {
  description = "The AWS region to deploy resources in"
  type        = string
  default     = "us-west-2"
}

locals {
  common_tags = {
    Environment = "production"
    Project     = "web-app"
  }
}

provider "aws" {
  region = var.aws_region

  default_tags {
    tags = local.common_tags
  }
}

인자가 없는 프로바이더 구성

다음 예시에서 provider 블록은 random 프로바이더에 대한 빈 구성을 정의해요. Terraform은 provider 블록으로 명시적으로 구성하지 않는 프로바이더에 대해서도 빈 기본 구성을 가정해요:

provider "random" { }

프로바이더별 인자를 구성할 필요가 없다면 이 블록을 완전히 생략할 수 있어요.

더 알아보기 (Learn more)