Terraform 작동 원리와 CLI 실습

Chori·2024년 10월 20일
0
post-thumbnail

처음 시작하는 Infrastructure as Code: AWS & 테라폼을 수강하며 정리한 내용입니다.


Terraform 기본 개념

  • Resource: 실제로 생성할 인프라 자원
  • Provider: Terraform 코드로 만들 infrastructure
  • Output: Terraform 결과물을 variable로 state 파일에 저장하는 것
  • Backend: state 파일을 저장하는 공간
  • Bodule: 일종의 함수, 여러 Terraform 코드를 한 곳으로 모아서 정의한 것
  • Remote state: state가 다른 코드에서 variable를 가져오기 위해 참조

Terraform 작동 원리

  • Terraform에는 3가지의 형상이 존재
    • Local 코드: 로컬에서 작성한 코드
    • AWS 실제 인프라: 코드를 통해 만들어져서 실제로 AWS에 배포되어 있는 인프라
    • Backend에 저장된 상태: 가장 최근에 배포한 Terraform 코드 형상, Backend에 저장되는 .tfstate 파일
  • 가장 중요한 것은 AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만드는 것

Terraform의 흐름

  • 인프라 정의는 Local 코드에서 시작, 개발자는 로컬에서 Terraform 코드를 정의한 후에 해당 코드를 실제 인프라로 프로비전하는데 이때 Backend를 구성하여 최신 코드를 저장

terraform init

  • Terraform working 디렉토리 초기화
  • 지정한 Backend에 상태 저장을 위한 .tfstate 파일을 생성하여 여기에는 가장 마지막에 적용한 Terraform 내역이 저장됨
  • init 작업을 완료하면 local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성됨
  • 기존에 다른 개발자가 이미 .tfstate에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init 작업을 통해서 local에 sync를 맞출 수 있음
  • AWS의 API 호출을 위한 라이브러리도 다운로드

terraform plan

  • 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여줌
  • plan을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 때는 에러가 발생할 수 있음
  • plan 명령어는 어떠한 형상에도 변화를 주지 않음

terraform apply

  • 실제로 인프라를 빌드하거나 변경하여 배포하는 명령어
  • apply를 완료하면, AWS에 인프라가 생성되고 작업 결과가 Backend의 .tfstate 파일에 저장됨
  • 해당 결과는 local의 .terraform 파일에도 저장됨

terraform import

  • AWS 인프라에 배포된 리소스를 Terraform state로 옮기는 작업
  • 로컬의 .terraform에 해당 리소스의 상태 정보를 저장하는 역할
  • 기존 인프라를 AWS에 배포한 상태에서 Terraform에 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야 함
  • apply 전까지는 Backend에 저장되지 않음
  • import 이후에 plan을 하면 로컬에 해당 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여줌
  • import가 코드를 만들어주지는 않고 이 결과를 바탕으로 코드를 직접 작성할 수 있음

실습

Provider 생성

  • 아무 코드가 없는 상태에서 terraform init을 하면 어떠한 변화도 없음

  • provider.tf 파일 생성
vim provider.tf
  • provider.tf 파일에서 리전을 서울로 지정
provider "aws" {
  region = "ap-northeast-2"
}
  • 아래 명령어로 초기화를 진행하여 Provider를 다운로드
terraform init

  • .terraform 디렉토리가 생김

Resource 생성

  • S3를 만들기 위해서 s3.tf 파일 생성
vim s3.tf
  • AWS의 S3 버킷을 생성할 것이며 Resource의 이름은 test
  • bucket 인자는 필수이며 S3 버킷의 이름을 지정
  • AWS S3 버킷 이름은 글로벌하게 고유해야 함
resource "aws_s3_bucket" "test" {
  bucket = "terraform-practice-chori"
}
  • 다음 명령어로 어떤 인프라가 만들어질지 알 수 있음
terraform plan

인프라 배포

  • 다음 명령어로 인프라 배포
terraform apply
  • Enter a valueyes를 입력해야 실행됨

  • AWS S3 버킷이 성공적으로 생성됨

  • tfstate 파일도 생성됨
  • Backend를 지정하지 않아서 로컬이 Backend가 됨

  • AWS CLI로 생성된 S3를 확인

  • AWS 콘솔에서 확인

import로 리소스 가져오기

  • AWS 콘솔에서 생성한 리소스를 terraform import 명령어로 가져올 수 있음
  • s3.tf 파일 삭제
rm -f s3.tf
  • state 파일에는 남아있지만 코드가 삭제됐기 때문에 terraform plan 명령어를 입력하면 리소스가 삭제된다고 나옴

  • state 파일인 terraform.tfstate.terraform 디렉토리까지 삭제하면 init도 안 된 상태로 돌아감
rm -f s3.tf
rm -rf .terraform
  • 다시 terraform init

  • 그리고 terraform plan
  • 실제로는 아직 AWS에 S3가 있지만 S3에 대한 코드를 분실(삭제)했기 때문에 Terraform 입장에서는 아무것도 만들어지지 않은 상태

  • import를 사용하기 위한 명령어는 다음과 같음
  • 이전에 S3 리소스를 만들 때 사용한 리소스 이름(test)과 버킷 이름(terraform-practice-chori) 사용
terraform import aws_s3_bucket.test terraform-practice-chori
  • 코드가 없어서 import할 수 없다는 에러 발생

  • s3.tf 파일을 다시 작성
resource "aws_s3_bucket" "test" {
  bucket = "terraform-practice-chori"
}
  • 파일 작성 후 terraform plan 명령어 사용하면 새로운 리소스를 만든다는 결과가 표시됨
  • terraform plan은 실제 리소스가 있는지 없는지 검사하지 않음

  • terraform plan 명령어를 사용하면 이미 있는 리소스여서 에러 발생

  • 이럴 때 다시 import를 하면 성공적으로 리소스를 가져옴
terraform import aws_s3_bucket.test terraform-practice-chori

  • terraform plan 명령어를 입력하여 변경 사항이 있는지 확인
  • 바뀐 부분이 있으면 terraform apply하여 실제 인프라와 Backend에 저장된 상태를 일치시키는 것이 중요
  • 아래 명령어로는 실제 생성된 인프라를 볼 수 있음
terraform state list

profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글