본문으로 바로가기

terraform의 작동 원리와 기본 실습

category Ops, Infra, etc/🧙 Terraform 2020. 12. 20. 07:45

우선 어떤 provider가 있는지는 아래 공식 홈페이지를 참고하자. 

registry.terraform.io/browse/providers

여기서는 AWS를 사용할 것이다.

 

  1. Local 코드 : 현재 개발자가 작성/수정하고 있는 코드
  2. AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라
  3. Backend에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상

이 세 가지 형상의 흐름을 이해하시면 각 테라폼 명령이 어떤 작업을 위한 일인지 쉽게 파악하실 수 있습니다. 여기서 가장 중요한 것은 AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만드는 것입니다. 

 

테라폼을 통해 인프라를 생성했는데 별도로 콘솔에 들어가서 수작업으로 설정을 바꾼다면, 혹은 여러 명이 협업 중에 다른 state를 사용하고 있을 때(싱크가 어긋낫다고 합니다) 실제 구성된 인프라와 Backend에 저장된 state가 달라지게 되겠죠. 이는 IaC를 통해 인프라를 관리하고자 하는데 큰 악재입니다.

 

 

terraform 기본 실습(s3 생성)

 

 

provider.tf로 생성합니다.

 

terraform init

 

결과로 provider plugins들을 다운로드 받고, .lock 을 생성합니다.

 

이제 시험삼아 S3를 생성해보도록하겠습니다.

 

vim s3.tf

bucket 이름은 소문자(대문자x, 공백x)으로만 이루어져야 하고, aws 서비스 내에 유일한 이름이어야 합니다.

 

 

apply하기 전에 terraform plan을 통해 어떤 결과가 만들어질지 체크해보겠습니다.

 

 

뭐 S3는 잘못 생성해봐야 요금이나 부담면에서 잘못될 일이 없으므로

terraform apply를 통해 실제로 리소스를 생성해보려고 하면...

 

경고문이 뜹니다. 실제 인프라를 이용하기 때문에 민감한 작업이라서 일종의 확인 절차를 밟는 셈입니다. 화면에서 요구한 대로 yes를 입력해 진행해줍시다.

 

네 이렇게 만들어진 것을 확인하실 수 있습니다. 실제로 콘솔에 가보시면 s3가 생성된 것을 확인하실 수 있습니다.

아니면 aws s3 ls 명령어를 통해 조회하실 수 있습니다.

 

 

그리고 backend를 따로 설정하지 않았기 때문에 자동으로 tfstate를 저장하는 곳은 로컬이 되어 저장된 것을 확인하실 수 있습니다.

 

 

 

이제 s3를 삭제하기를 원한다면 단순히 s3.tf 코드를 삭제해주고 apply하면 삭제됩니다.

그러나 tfstate까지 완전 삭제하게 된다면 terraform은 해당 인프라가 존재하는지 자체를 모르게 됩니다.

 

이 경우 terraform import를 통해 기존에 있는 인프라를 terraform에 옮겨올 수 있습니다.

terraform을 적용하기 전 이미 구성된 인프라가 있다면 import하는 것이 좋습니다.

 

그런데 import는 aws 자체를 모두 분석하는 그런 방식으로 작동하지 않습니다.

 

registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket#import

terraform import aws_s3_bucket.bucket bucket-name

 

공식 문서를 보시면 알겠지만, aws s3의 특정 버켓만 import해오는 방식으로 작동합니다.

 

따라서 s3.tf를 삭제하였고, tfstate도 삭제된 상태라면 우선 해당 인프라가 존재하기 위한 코드를 먼저 작성한 후에 import해야 합니다.

 

 

 

요약하자면 다음과 같습니다.

 

Terraform init

  • 지정한 backend에 상태 저장을 위한 .tfstate 파일을 생성합니다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장됩니다.
  • init 작업을 완료하면, local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성됩니다.
  • 기존에 다른 개발자가 이미 .tfstate에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init작업을 통해서 local에 sync를 맞출 수 있습니다.

Terraform plan

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

Terraform apply

  • 실제로 인프라를 배포하기 위한 명령어입니다. apply를 완료하면, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 backend의 .tfstate 파일에 저장됩니다.
  • 해당 결과는 local의 .terraform 파일에도 저장됩니다.

Terraform import

  • AWS 인프라에 배포된 리소스를 terraform state로 옮겨주는 작업입니다.
  • 이는 local의 .terraform에 해당 리소스의 상태 정보를 저장해주는 역할을 합니다. (절대 코드를 생성해주지 않습니다.)
    • Apply 전까지는 backend에 저장되지 않습니다.
    • Import 이후에 plan을 하면 로컬에 해당 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여줍니다. 이 결과를 바탕으로 코드를 작성하실 수 있습니다.

만약 기존에 인프라를 AWS에 배포한 상태에서 테라폼을 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야 합니다. 번거로운 경우에는 처음부터 다시 작업해서 리소스를 올릴 수 있지만, 실제 서비스가 되는 인프라를 내리는 건 위험할 수 있습니다.

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체