Search
Duplicate
📒

노트 템플릿 시리즈

수업
Terraform
주제
기본개념
5 more properties
참고

프로바이더

NOTE
테라폼은 terraform 바이너리 파일을 시작으로 로컬 환경이나 배포서버와 같은 원격 환경에서 원하는 대상을 호출하는 방식으로 실행된다.
이때 원하는 대상은 호출하는 방식이 서로 다르지만, 대상의 프로바이더가 제공하는 API를 통해 호출해서 상호작용한다.
각 프로바이더의 API구현은 서로 다르지만, 테라폼 고유 문법으로 수행할 수 있게 구현된다. 각 프로바이더는 테라폼이 관리하는 리소스 유형과 데이터 소스를 사용하도록 연결해준다. 즉 테라폼은 프로바이더 없이는 어떤 종류의 인프라와 서비스도 관리할 수 없다.
각 프로바이더는 테라폼 실행 파일과는 별도로 자체 관리되고 게시된다.
프로바이더 구성
프로바이더 구성에 대한 주요 정보는 공식 레지스트리에 공개되어 있다.
AWS의 경우 AWS 자격증명과 리전 이름을 정의하기도 한다.
로컬이름과 프로바이더 지정
terraform { required_providers { http = { source = "hashicorp/http" } aws-http = { source = "terraform-aws-modules/http" version = "~> 3.0" } } } data "http" "example" { provider = aws-http url = "https://checkpoint-api.hashicorp.com/v1/check/terraform" request_headers = { Accept = "application/json" } }
Bash
복사
테라폼 블록의 required_providers 블록내에 <로컬이름> = { } 으로 여러 개의 프로바이더를 정의할 수 있다.
단일 프로바이더의 다중 정의
provider "aws" { region = "us-west-1" } provider "aws" { alias = "seoul" region = "ap-northeast-2" } resource "aws_instance" "app_server" { provider = aws.seoul ami = "ami-0e1d09d8b7c751816" instance_type = "t2.micro" }
Bash
복사
alias로 프로바이더를 구분
동일한 프로바이더를 사용하지만 다른 조건을 가지는 경우, 사용되는 리소스마다 별도로 선언된 프로바이더를 지정해야 하는 경우가 있다.
ex) AWS 프로바이더를 사용하는데 다른 IAM을 가지는 혹은 리전을 지정해야 하는 경우 (이때는 프로바이더 선언에 alias를 명시하고 메타인수를 사용해 프로바이더 지정이 가능)
프로바이더 요구사항 정의
terraform { required_providers { <프로바이더 별칭 이름> = { source = "<호스트 이름>/<네임스페이스>/<유형>" version = "<버전 제약>" } ... } }
Bash
복사
요구되는 사항은 테라폼 블록의 required_provides 블록에 여러개를 정의할 수 있다.
호스트 주소 : 프로바이더를 배포하는 주소
네임스페이스 : 지정된 레지스트리 내에서 구분하는 네임스페이스
유형 : 프로바이더에서 관리되는 플랫폼이나 서비스 이름
프로바이더 설치
테라폼을 실행하기 전 terraform init 명령을 통해 정의된 프로바이더를 다운로드, 복사, 캐시에서 읽어오게 된다.
항상 지정된 구성에 대해 동일한 프로바이더를 설치하도록 하려면 테라폼 구성에 사용되는 프로바이더에 대해 명시적으로 테라폼 블록에 정의하거나 .terraform.lock.hcl 잠금 파일을 코드 저장소에 공유하는 방안이 요구도니다.
프로바이더 간 전환 여부
클라우드 대상으로 테라폼을 사용할 때, 다른 클라우드 프로바이더로 전환이 가능한가?
불가능하다.
테라폼은 인프라에 대한 단일 프로비저닝 도구로 사용되지만, 대상이 되는 환경은 서로 다른 API로 구현된 프로바이더가 제공된다.

프로바이더 에코시스템

NOTE
테라폼의 에코시스템은 사용자가 사용하는 방식과 구조에 테라폼을 적용할 수 있도록 설계된다.
에코시스템을 위한 테라폼 통합은 워크플로-인프라 파트너로 나뉜다.
워크플로 : 테라폼 실행 및 테라폼 클라우드와 연계하여 동작, Gitlab, Bitbucket, Devops가 해당
인프라 : 사용자가 테라폼으로 대상 플랫폼의 API로 상호작용 가능한 리소스를 관리하게 해준다.

State

NOTE
테라폼은 Stateful(상태가 있는) 애플리케이션이다. 프로비저닝 결과에 따른 State(상턔)를 저장하고 프로비저닝한 모든 내용을 저장된 상태로 추적한다.
로컬 실행 환경에서는 terraform.tfstate 파일에 JSON형태로 저장되고, 팀이나 조직에서의 공동 관리를 위해서는 원격 저장소에 공유하는 방식을 활용한다.

모듈

NOTE
테라폼으로 인프라와 서비스를 관리하면 시간이 지날수록 구성이 복잡해지고 관리하는 리소스가 늘어나게 된다. 테라폼의 구성 파일과 디렉터리 구성에는 제약이 없기 때문에 단일 파일 구조상에서 지속적으로 업데이트할 수 있지만, 다음과 같은 문제가 발생한다.
테라폼 구성에서 원하는 항목을 수정하는 것이 어려워짐
리소스들간의 연관 관계가 복잡해질수록 변경 작업의 영향도를 분석하기 위한 노력이 늘어남
개발/스테이징/프로덕션 환경으로 구분된 경우 비슷한 형태의 구성이 반복되어 업무 효율이 줄어듦
새로운 프로젝트를 구성하는 경우 기존 구성에서 취해야 할 리소스 구성과 종속성 파악이 어려움
모듈은 루트 모듈과 자식 모듈로 구분된다.
루트 모듈
자식 모듈
모듈은 테라폼의 구성 집합이며, 대상의 규모가 커지고 복잡해져 생긴 문제를 보완하고 관리 작업을 수월하게 하기 위한 방안으로 활용된다.
관리성
캡슐화
재사용성
일관성과 표준화
모듈 작성 기본 원칙
모듈은 대부분 프로그래밍 언어에서 쓰이는 라이브러리나 패키지와 역할이 비슷하다. 모듈 작성 방식은 사용자마다 다를 수 있지만, 다음과 같은 기본 작성 원칙을 제안한다.
디렉토리: terraform-<프로바이더 이름>-<모듈 이름>
각각의 모듈은 독립적으로 관리해라
공개된 테라폼 레지스트리의 모듈을 참고하기를 제안한다.
resource "random_pet" "name" { keepers = { ami_id = timestamp() } } resource "random_password" "random_password" { length = var.isDB ? 16 : 10 special = var.isDB ? true : false override_special = "!#$*?" } output "id" { value = random_pet.name.id } output "pw" { value = nonsensitive(random_password.random_password.result) } variable "isDB" { type = bool default = false description = "패스워드 대상의 DB여부" }
Bash
복사
module "mypw1" { source = "./modules/random-pwgen" } module "mypw2" { source = "./modules/random-pwgen" isDB = true } output "mypw1" { value = module.mypw1 } output "mypw2" { value = module.mypw2 }
Bash
복사
provider "aws" { region = "us-west-1" } provider "aws" { alias = "seoul" region = "ap-northeast-2" } module "ec2_califonia" { source = "./modules/aws-ec2" } module "ec2_seoul" { source = "./modules/aws-ec2" providers = { aws = aws.seoul } instance_type ="m5.large" } output "module_output_california" { value = module.ec2_califonia.private_ip } output "module_output_seoul" { value = module.ec2_seoul.private_ip }
Bash
복사

모듈 소스 관리

NOTE
Module 블록에 정의된 소스 구성으로 모듈의 코드 위치를 정의한다.
terraform init을 수행할 때 지정된 모듈을 다운로드해 사용한다.
로컬 디렉토리 경로
테라폼 레지스트리
깃허브
비트버킷
S3, GCS …
로컬 디렉토리 경로
로컬에서 경로를 지정할때는 테라폼 레지스트리와 구분하기 위해 디렉터리 지정을 잘해주어야 한다.
테라폼 레지스트리
테라폼 모듈 레지스트리는 테라폼의 프로토콜을 이용해 사용하는 방식이다.
공개된 테라폼 모듈을 사용하거나 테라폼 클라우드에서 제공하는 비공개 모듈을 사용할 때 설정하는 방식이다.
# 호스트 이름 / 네임스페이스 / 이름 / 프로바이더 # 공개된 레지스트리 module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "3.14.2" } # 개별 구축된 사설 레지스트리 module "ecs_instance" { source = "app.terraform.io/aliababa/ecs-instance/alicloud" version = ">= 2.9.0" }
Bash
복사