2년 간 Terraform을 사용하면서 많은 기능, 문법을 사용하고 있습니다.
하지만 단 한 번도 공식문서를 제대로 정독한 적이 없는 것 같습니다.
이번 기회에 Terraform 정주행을 진행하려고 합니다.
개요
처음에는 Terraform Provider에 대해서 학습합니다.
Provider란?
Provider Configuration
Multi Provider Configuration
Provider Requirements란?
Multi Provider Requirement
Provider란?
Terraform Provider는 특정 인프라 서비스와 상호작용을 하는 Terraform Root Module 중 하나입니다.
각 Provider는 해당 서비스의 리소스를 정의하고 Terraform를 관리할 수 있게 도와줍니다.
Provider Configuration
일반적으로 다음과 같이 Provider를 정의할 수 있습니다.
provider "aws" {
profile = "acme-app"
region = "us-central1"
}
Provider에 별도의 alias를 설정하지 않으면, Default Provider로서 작동합니다.
따라서 Resource에 별도의 provider를 명시할 필요가 없습니다.
resource "aws_instance" "foo" {
# provider = aws 불필요!
}
Provider에 alias를 설정해서 Multi Provider Configuration을 할 수 있습니다.
Multi Provider Configuration
다음과 같이 Multi Provider를 정의할 수 있습니다.
provider "aws" {
region = "us-east-1"
}
provider "aws" {
alias = "west"
region = "us-west-2"
}
Provider에 별도의 alias를 설정하면, Multi Provider로서 작동합니다.
이때 Resource에 별도의 provider를 명시하는 것으로 사용이 가능합니다.
resource "aws_instance" "foo" {
provider = aws.west
}
Provider Requirements란?
Terraform은 원격 시스템과 상호 작용하기 위해서 Provider Plugin에 의존합니다.
Terraform Configuration은 필요한 Provider를 선언하는 것으로 Terraform이 이를 설치하고 사용할 수 있도록 만들어줍니다.
Terraform Requirements는 Provider Plugin에 대한 제어를 하기 위해서 사용됩니다.
terraform {
requirement_providers {
mycloud = {
source = "mycorp/mycloud"
version = "~> 1.0"
}
}
}
Terraform Version v0.12에서는 aws = “~> 1.0”와 같이 기록하였습니다.
이때 mycorp/mycloud라는 이름의 뒷 부분인 mycloud를 Provider Local Name이라고 부릅니다. Terraform은 Provider를 구성할 때, 이 Provider Local Name을 사용하게 됩니다.
Multi Provider Requirement
앞서 Multi Provider Configuration에서 만약 같은 Provider Local Name을 2개 이상의 Provider가 있다면 어떻게 해야 할까요? 이 경우 다음과 같이 재정의된 Provider Local Name을 사용할 수 있습니다.
terraform {
requirement_providers {
hashicorp-http = {
source = "hashicorp/http"
version = "~> 2.0"
}
mycorp-http = {
source = "mycorp/http"
version = "~> 1.0"
}
}
}
provider "mycorp-http" {
}
data "http" "example" {
provider = hashicorp-http
}
Provider Versioning
Provider Requirment, Multi Provider Requirement 등에서 봤던 것처럼
Terraform Versioning은 많이 익숙한 ~ > 와 같은 Versioning System을 따르고 있습니다. 자세한 내용은 Terraform Version Constraint를 참고해주세요.