해당 내용은 T1012 스터디에 나온 내용과 '테라폼으로 시작하는 IaC' 책을 기준으로 정리 했습니다
프로바이더란?
프로바이더가 제공하는 API를 호출해 상호작용을 한다.
여기서 테라폼이 대상과의 상호작용을 할 수 있도록 하는 것이 '프로바이더'
aws를 예로 들면
우리는 aws-cli를 사용하거나 aws-sdk등을 사용하여 aws 서비스를 조작할수 있는데
이때 awscli 같은, aws-sdk 같이 terraform 에서 특정 대상과의 중간다리 해주는 역할이 프로바이더 라고 생각한다
- 악분의 블로그에 테라폼 동작원리에 대한 설명이 쉽게 정리되어 있다
지원하는 terraform 프로바이더
4.1 프로바이더 구성
공식(Official) 프로바이더
- 하시코프가 소유 및 관리
- hashicorp/~ 으로 시작하는 네임스페이스를 가짐
ex) hashicorp/terraform-provider-aws
hashicorp/terraform-provider-kubernetes
파트너(Partner) 프로바이더
- 하시코프사 외의 기술 파트너가 소유하고 관리
- 프로바이더 제공자에 대한 검증이 되어있고 하시코프 기술파트너임을 의미한다
- 게시한 조직의 이름 으로 네임스페이스를 가진다 (Docker registry 같다)
ex) oracle/terraform-provider-oci
mongodb/mongodbatlas
커뮤니티(Community) 프로바이더
- 커뮤니티 프로바이더는 개별 관리자와 그룹에서 terraform의 레지스트리에 게시하고 관리
- 개인 및 조직 계정 이름으로 네임스페이스를 표기한다
ex) kkyoung/easy
아카이브(Archived) 프로바이더
- 더이상 유지보수 되지 않는 이전 프로바이더
프로바이더 식별 정보
- 지정하는 프로바이더의 요구사항을 정의
레지스트리의 Overview 항목 오른쪽에 있는 [USE PROVIDER] 클릭해 현재 버전의 정의 방법을 확인
로컬 이름과 프로바이더 지정
terraform 블록의 required_providers 블록 내에 <로컬 이름> = {} 으로 여러개의 프로바이더를 정의할수 있다
- 이때 로컬이름은 테라폼 모듈 내에서 고유해야 하며
- 로컬 이름과 리소스 접두사는 독립적으로 선언 되어야 하고
- 각 프로바이더의 소스 경로가 지정되면 프로바이더의 고유 접두사가 제공된다
만약 동일한 접두사를 사용하는 프로바이더가 선언되는 경우 로컬 이름을 달리해 관련 리소스에서 어떤 프로바이더를 사용하는 지 명시적으로 지정할수 있다
# 예를 들어 다음의 main.tf에서처럼 동일한 http 이름을 사용하는 다수의 프로바이더가 있는 경우
# 각 프로바이더에 고유한 이름을 부여하고 리소스와 데이터 소스에 어떤 프로바이더를 사용할지
# provider 인수에 명시한다. 단, 동일한 source에 대해 다수의 정의는 불가능한다.
terraform {
required_providers {
architech-http = {
source = "architect-team/http"
version = "~> 3.0"
}
http = {
source = "hashicorp/http"
}
aws-http = {
source = "terraform-aws-modules/http"
}
}
}
data "http" "example" {
provider = aws-http
url = "https://checkpoint-api.hashicorp.com/v1/check/terraform"
request_headers = {
Accept = "application/json"
}
}
단일 프로바이더의 다중 정의
- 동일한 프로바이더를 사용하지만 다른 조건을 갖는 경우, 사용되는 리소스마다 별도로 선언된 프로바이더를 지정해야 하는 경우가 있다.
- AWS 프로바이더를 사용하는데 서로 다른 권한의 IAM을 갖는 Access ID 또는 대상 리전을 지정해야 하는 경우
프로바이더 선언에서 alias를 명시하고 사용하는 리소스와 데이터 소스에서는 provider 메타인수를 사용해 특정 프로바이더를 지정할 수 있다. - provider 메타인수에 지정되지 않은 경우 alias가 없는 프로바이더가 기본 프로바이더로 동작한다.
# 실습환경 구성
mkdir 4.1 && cd 4.1
# 예제는 리전을 다르게 구성한 AWS 프로바이더를 aws_instance에 지정하는 방법
# main.tf 생성
provider "aws" {
region = "ap-southeast-1"
}
provider "aws" {
alias = "seoul"
region = "ap-northeast-2"
}
resource "aws_instance" "app_server1" {
ami = "ami-06b79cf2aee0d5c92"
instance_type = "t2.micro"
}
resource "aws_instance" "app_server2" {
provider = aws.seoul # 이부분!
ami = "ami-0ea4d4b8dc1e46212"
instance_type = "t2.micro"
}
# 초기화 및 실행
terraform init && terraform plan
terraform apply -auto-approve
# 확인
terraform state list
echo "aws_instance.app_server1.public_ip" | terraform console
echo "aws_instance.app_server2.public_ip" | terraform console
aws ec2 describe-instances --filters Name=instance-state-name,Values=running --output table
aws ec2 describe-instances --filters Name=instance-state-name,Values=running --output table --region ap-southeast-1
# 삭제
terraform destroy -auto-approve
프로바이더 요구사항 정의
테라폼 실행 시 요구되는 프로바이더 요구사항은 terraform 블록의 required_providers 블록에 여러 개를 정의할 수 있다. source에는 프로바이더 다운로드 경로를 지정하고 version은 버전 제약을 명시한다.
- 프로바이더는 기능이나 조건이 시간이 지남에 따라 변경될 수 있다. 이 같은 변경에 특정 버전을 명시하거나 버전 호환성을 정의할 때, version에 명시할 수 있다. 이 값이 생략되는 경우 terraform init을 하는 당시의 가장 최신 버전으로 선택된다. 버전 상세 내용은 3.3장 버전 설정 확인
# 프로바이더 요구사항 정의 블록
terraform {
required_providers {
<프로바이더 로컬 이름> = {
source = [<호스트 주소>/]<네임스페이스>/<유형>
version = <버전 제약>
}
...
}
}
호스트 주소: 프로바이더를 배포하는 주소로서 기본값은 registry.terraform.io
네임스페이스: 지정된 레지스트리 내에서 구분하는 네임스페이스로, 공개된 레지스트리 및 Terraform Cloud의 비공개 레지스트리의 프로바이더를 게시하는 조직을 의미
유형: 프로바이더에서 관리되는 플랫폼이나 서비스 이름으로 일반적으로 접두사와 일치하나 일부 예외가 있을 수 있음
'공부하면서 > Terraform' 카테고리의 다른 글
[T1012] 4주차 - State & 모듈 (Module) (0) | 2023.07.27 |
---|---|
[T1012] 4주차 - State & 모듈 (State) (0) | 2023.07.27 |
[T1012] 3주차 - 테라폼 기본 사용 3/3 (terraform_data, moved, 환경변수) (0) | 2023.07.22 |
[T1012] 3주차 - 테라폼 기본 사용 3/3 (조건문,함수,프로비저너) (0) | 2023.07.21 |
[T1012] 2주차 - 테라폼 기본 사용 2/3 (반복문 + 실습) (0) | 2023.07.15 |