Terraform 이란?
- 하시코프사에서 공개한 IaC 도구
- 블록에서 작성된 타겟 리소스에 대한 api 를 테라폼 프로바이더가 호출
- 실행(apply) 하면 생성되는 tfstate 파일을 기준으로 상태를 비교하여 선언된 형태에 맞춤
HCL 이란?
- HashiCorp configuration language
- 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구
- 테라폼에서 HCL이 코드의 영역을 담당
- 인프라가 코드로 표현되고, 이 코드는 곧 인프라이기 때문에 선언적 특성을 갖게 되고 튜링 완전한 Turing-complete 언어적 특성을 가짐
- 일반적인 프로그래밍 언어의 조건문 처리 같은 동작 가능
- 자동화와 더불어, 쉽게 버저닝해 히스토리를 관리하고 함께 작업 할 수 있는 기반을 제공
- syntax docs
https://developer.hashicorp.com/terraform/language/syntax/configuration
IaC 란?
- 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝 하는 것
- 프로비저닝 도구로써는 hcl로 작성되는 테라폼 외의 yaml, json 으로 작성되는 cloudformation 도 있음
- iac 에 속하지만 구성관리 도구로 분류되는 것에는 레드햇에서 제공하는 절차지향적인 ansible이 대표적
terraform init : init을 위해 필요한 provider.tf 예시와 블럭 설명
provider
- 리소스 유형을 구현하는 플러그인
- 사용자를 대신하여 일반적으로 퍼블릭 클라우드 공급자의 서비스를 인증하고 연결하는 데 필요한 모든 코드가 포함
- 사용 중인 클라우드 플랫폼 및 서비스에 대한 공급자를 찾아 구성에 추가한 다음 해당 리소스를 사용하여 인프라를 프로비저닝
- aws, azure 등 퍼블릭 클라우드 서비스부터 SaaS 서비스 까지 다양하게 제공되고 있음
- 특수한 경우 리소스마다 다른 프로바이더 사용하도록 설정 가능
- 동일 프로바이더를 가지고 다른 조건을 사용할 수 있음
terraform
- tfstate 파일을 저장 관리하는 곳을 정의
- cloud : terraform cloud를 사용하여 remote로 관리
- backend : local / s3 / consul 등을 사용 가능. default 는 local
- 해당 블럭이 있는 곳을 수정했다면 terraform init 을 다시 해 줘야 반영됨
version
- 시맨틱 버전 관리 방식 따름
- ~> : 지정된 버전에서 가장 자리수가 낮은 구성요소만 증가하는 것을 허용
- >= : 지정된 버전 이상의 모든 버전 허용
provider "aws" {
profile = "사용하는 aws profile"
region = "옵션"
default_tags {
tags = {
"service" = "example"
}
}
}
# alias 를 사용하여 단일 프로바이더의 다중 설정 가능
# resource block 에서 provider = aws.seoul 을 추가하는 방식으로 사용 가능
provider "aws" {
alias = "seoul"
region = "ap-northeast-2"
}
terraform {
required_providers {
aws = {
# 4.39.0 버전을 포함해서 4.39.x 다른 것만 허용
version = "~> 4.39.0"
}
}
cloud {
organization = "terraform cloud를 사용하는 경우 작성"
workspaces {
name = "terraform cloud 사용 시 작업하는 workspace를 명시"
}
}
backend "local" { # state를 보관하는 위치를 지정
path = "relative/path/to/terraform.tfstate"
}
}
다른 프로바이더 사용해보기
- 아래 공식 문서 링크에 따라가면 나오는 예제를 그대로 복붙하면 됨
https://registry.terraform.io/providers/hashicorp/aws/latest
https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http
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"
}
}
'Infra & DevOps > Terraform' 카테고리의 다른 글
[Terraform] EKS IaC (0) | 2024.04.24 |
---|---|
[Terraform] 테라폼 동작방식 (0) | 2022.04.15 |