Infra & DevOps/Terraform

[Terraform] 테라폼 기초 설명 & init 코드 구성 요소

용감한 개복치 2024. 4. 25. 06:19

 

Terraform 이란?

- 하시코프사에서 공개한 IaC 도구

- 블록에서 작성된 타겟 리소스에 대한 api 를 테라폼 프로바이더가 호출

- 실행(apply) 하면 생성되는 tfstate 파일을 기준으로 상태를 비교하여 선언된 형태에 맞춤

출처 : 스터디 자료

 

HCL 이란?

- HashiCorp configuration language 

- 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구

- 테라폼에서 HCL이 코드의 영역을 담당

- 인프라가 코드로 표현되고, 이 코드는 곧 인프라이기 때문에 선언적 특성을 갖게 되고 튜링 완전한 Turing-complete 언어적 특성을 가짐

- 일반적인 프로그래밍 언어의 조건문 처리 같은 동작 가능

- 자동화와 더불어, 쉽게 버저닝해 히스토리를 관리하고 함께 작업 할 수 있는 기반을 제공

- syntax docs

https://developer.hashicorp.com/terraform/language/syntax/configuration

 

Syntax - Configuration Language | Terraform | HashiCorp Developer

Key constructs of the native Terraform language syntax, including identifiers, arguments, blocks, and comments.

developer.hashicorp.com

 

IaC 란?

- 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝 하는 것

- 프로비저닝 도구로써는 hcl로 작성되는 테라폼 외의 yaml, json 으로 작성되는 cloudformation 도 있음

- iac 에 속하지만 구성관리 도구로 분류되는 것에는 레드햇에서 제공하는 절차지향적인 ansible이 대표적

출처 : https://medium.com/cloudnativeinfra/when-to-use-which-infrastructure-as-code-tool-665af289fbde

 

terraform init : init을 위해 필요한 provider.tf 예시와 블럭 설명

provider

출처 : https://malwareanalysis.tistory.com/619

  • 리소스 유형을 구현하는 플러그인
  • 사용자를 대신하여 일반적으로 퍼블릭 클라우드 공급자의 서비스를 인증하고 연결하는 데 필요한 모든 코드가 포함
  • 사용 중인 클라우드 플랫폼 및 서비스에 대한 공급자를 찾아 구성에 추가한 다음 해당 리소스를 사용하여 인프라를 프로비저닝
  • 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

 

Terraform Registry

 

registry.terraform.io

https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http

 

Terraform Registry

 

registry.terraform.io

 

 

Terraform Registry

 

registry.terraform.io

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