공부하면서/Terraform

[T1012] 3주차 - 테라폼 기본 사용 3/3 (프로바이더 구성)

omelette master 2023. 7. 22. 23:41
해당 내용은 T1012 스터디에 나온 내용과 '테라폼으로 시작하는 IaC' 책을 기준으로 정리 했습니다

프로바이더란?

프로바이더가 제공하는 API를 호출해 상호작용을 한다.
여기서 테라폼이 대상과의 상호작용을 할 수 있도록 하는 것이 '프로바이더'

aws를 예로 들면

우리는 aws-cli를 사용하거나 aws-sdk등을 사용하여 aws 서비스를 조작할수 있는데

이때 awscli 같은, aws-sdk 같이 terraform 에서 특정 대상과의 중간다리 해주는 역할이 프로바이더 라고 생각한다

  • 악분의 블로그에 테라폼 동작원리에 대한 설명이 쉽게 정리되어 있다
 

테라폼으로 EKS만들기 프로젝트 3-2편 - 테라폼 동작원리

이 글은 테라폼이 어떻게 동작하는지 설명합니다. 3편에서 실행했던 hello world예제를 참고합니다. ▶ 테라폼 동작원리 유투브 영상: https://youtu.be/47FJVP437nk 1. 동작원리 테라폼은 코드를 읽어 코드

malwareanalysis.tistory.com

지원하는 terraform 프로바이더

 

Terraform Registry

 

registry.terraform.io

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

ap-southeast-1 싱가포르 리전
ap-northeast-2 서울 리전

프로바이더 요구사항 정의

테라폼 실행 시 요구되는 프로바이더 요구사항은 terraform 블록의 required_providers 블록에 여러 개를 정의할 수 있다. source에는 프로바이더 다운로드 경로를 지정하고 version은 버전 제약을 명시한다.
  • 프로바이더는 기능이나 조건이 시간이 지남에 따라 변경될 수 있다. 이 같은 변경에 특정 버전을 명시하거나 버전 호환성을 정의할 때, version에 명시할 수 있다. 이 값이 생략되는 경우 terraform init을 하는 당시의 가장 최신 버전으로 선택된다. 버전 상세 내용은 3.3장 버전 설정 확인
# 프로바이더 요구사항 정의 블록
terraform {
  required_providers {
    <프로바이더 로컬 이름> = {
      source = [<호스트 주소>/]<네임스페이스>/<유형>
      version = <버전 제약>
    }
    ...
  }
}

호스트 주소: 프로바이더를 배포하는 주소로서 기본값은 registry.terraform.io
네임스페이스: 지정된 레지스트리 내에서 구분하는 네임스페이스로, 공개된 레지스트리 및 Terraform Cloud의 비공개 레지스트리의 프로바이더를 게시하는 조직을 의미
유형: 프로바이더에서 관리되는 플랫폼이나 서비스 이름으로 일반적으로 접두사와 일치하나 일부 예외가 있을 수 있음