Terraform 연습(1)

Lee Dong Uk·2023년 6월 10일
0

테라폼 홈페이지의 Local Provider, AWS provider를 이용해 실습.

terraform init

터미널에서 terraform init명령어를 실행한다.

명령어를 실행하면 .terraform이라는 폴더와 .terraform.lock.hcl이라는 파일이 생성된다.

.terraform폴더는 main.tf파일에 명시된 프로바이더나 모듈들의 데이터를 다운로드 받아 보관한다.

.terraform.lock.hcl파일은 팀에서 협업을 하거나 CI/CD 파이프라인을 구성할때 필요하다. 해당 워크스페이스에서 사용하는 프로바이더를 확인하고, 버전과 해시를 확인하여 다른 개발자들과 환경을 동일하게 유지하기 위해 사용한다.

로컬 프로바이더 생성


로컬 프로바이더는 주어진 컨텐츠로 로컬 환경에 파일을 생성한다.

main.tf파일을 생성 후 공식 문서 우측 상단에 USE PROVIDER를 클릭해 provider 블록을 복사해준다.

terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "2.4.0"
    }
  }
}

provider "local" {
  # Configuration options
}

여기서 terraform block은 여러 provider를 사용하거나 특정 버전의 terraform을 요구하는 설정에서 유용하다.

terraform block으로 provider에 대한 정보를 지정하지 않으면 terraform은 기본적으로 최신 버전의 provider를 사용한다.
하지만 최신 버전의 provider는 항상 기존 terraform 코드와 호환되는 것은 아니다. provider의 새 버전에서는 종종 기능이 변경되거나 삭제되기도 하며, 이러한 경우 기존의 terraform 코드가 예상대로 작동하지 않을 수 있다.

그리고 terraform block에 require_providers 블록을 사용하면 terraform 코드의 이식성이 향상된다. 즉 다른 사람이나 다른 시스템에서 해당 코드를 실행할 때 동일한 provider 버전을 사용하도록 상제함으로써 일관성을 보장할 수 있다.

Resource


리소스는 프로바이더를 통해 관리할 수 있는 인프라 리소스이다. 데이터를 쓰는 용도로 사용된다.

  1. 로컬 파일 리소스 생성
resource "local_file" "foo" {
  filename = "${path.module}/foo.txt"
  content = "hello world!"
}
# 현재 폴더에 "hello world!"라는 내용을 가진 foo.txt파일을 생성하는 코드이다.

위 코드에서 사용된 ${}는 terrform에서 inter polation 이라는 문법이다.
문자열 내부에 hcl에서 제공하는 변수나 컨텍스트에 접근하여 값을 가져오기 위함이다.

path.module은 해당 파일이 위치한 디렉토리 경로이다.

  1. 변경 사항 확인
    terraform plan 명령어로 내가 작성한 tf파일이 어떤 변경사항을 불러 일으키는지 확인할 수 있다.

Plan: 1 to add, 0 to change, 0 to destroy.

마지막 출력문으로 어떤 리소스가 추가, 변경, 삭제되었는지 확인할 수 있다.

  1. 변경 사항 적용
    terraform apply 명령어로 변경사항을 적용시킬 수 있다.

명령어 실행 후 foo.txt파일과 terraform.tfstate파일이 생성되었다.

terraform.tfstate파일은 테라폼 상태 파일이라고 볼 수 있는데, 현재 리소스의 상태를 기록하고 있다.
terraform.tfstate파일을 통해 main.tf를 수정하고 변경할 때 diff 결과를 명확하게 확인할 수 있다.

Data Source


데이터 소스 리소스를 관리할때 데이터를 참조해야할때 사용한다. 데이터를 읽는 용도로 사용된다.

데이터 소스는 리소스와 다르게 data라는 지시어로 사용된다.

data "local_file" "bar" {
  filename = "${path.module}/bar.txt"
}

위 코드를 작성 후 terraform plan명령어를 실행하면 bar.txt 파일이 없다는 에러가 출력된다.
Data Source는 워크스페이스의 리소스를 사용하기 때문이다.

data "local_file" "foo_value" {
  filename = "${path.module}/foo.txt"
}

올바르게 코드를 작성하고 terraform plan -> terraform apply를 통해 변경사항을 적용시켜 준다. (diff가 없을 것이다)
읽어들인 Data Source는 output 이라는 지시어로 출력할 수 있다.

output "file_foo" {
  value = data.local_file.foo_value
}

tf apply를 해보면, 인프라 상에 변경사항은 없지만, 아래와 같이 Output 섹션에 결과값이 출력된 것을 볼 수 있다.

0개의 댓글