본문 바로가기
Terraform/AWS and 테라폼: Infrastructure as

[AWS and 테라폼: Infrastructure as Code] Terraform 작동 원리와 CLI 실습

by 개발자 영만 2024. 1. 19.

Terraform 기본 개념


다음은 테라폼 활용에 필요한 개념

  • resource : 실제로 생성할 인프라 자원을 의미
    • ex) aws_security_group, aws_lb, aws_instance
  • provider : Terraform으로 정의할 Infrastructure Provider를 의미
  • output : 인프라를 프로비저닝 한 후에 생성된 자원을 output 부분으로 뽑을 수 있다. Output으로 추출한 부분은 이후에 remote state에서 활용할 수 있다.
  • backend : terraform의 상태를 저장할 공간을 지정하는 부분. backend를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능하다. 가장 대표적으로는 AWS S3가 있다.
  • module : 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분. Module을 사용하면 변수만 바꿔서 동일한 리소스를 손쉽게 생성할 수 있다는 장점이 있다.
  • remote state : remote state를 사용하면 VPC, IAM 등과 같은 공용 서비스를 다른 서비스에서 참조할 수 있다. tfstate파일(최신 테라폼 상태정보)이 저장되어 있는 backend 정보를 명시하면, terraform이 해당 backend에서 output 정보들을 가져온다.
     

Terrafrom 작동 원리


테라폼을 잘 활용하기 위해서는 테라폼이 작동하는 원리를 이해하는 것이 중요하다. 테라폼에는 3가지의 형상이 존재한다.

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

이 세 가지 형상의 흐름을 이해하시면 각 테라폼 명령이 어떤 작업을 위한 일인지 쉽게 파악할 수 있다. 여기서 가장 중요한 것은 AWS 실제 인프라Backend에 저장된 상태가 100% 일치하도록 만드는 것. 테라폼을 운영하면서 최대한 이 두가지가 100% 동일하도록 유지하는 것이 중요한데, 테라폼에서는 이를 위해 import, state 등 여러 명령어를 제공한다.

먼저, 인프라 정의는 Local 코드에서 시작한다. 개발자는 로컬에서 테라폼 코드를 정의한 후에 해당 코드를 실제 인프라로 프로비전한다. 이 때 backend를 구성하여 최신 코드를 저장하는데, 흐름은 아래와 같다.
 

Terraform init

  • 지정한 backend에 상태 저장을 위한 .tfstate 파일을 생성합니다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장된다.
  • init 작업을 완료하면, local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성된다.
  • 기존에 다른 개발자가 이미 .tfstate에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init작업을 통해서 local에 sync를 맞출 수 있다.
  • 테라폼은 내부적으로 aws의 API들을 호출하기 때문에 라이브러리가 필요한데 그 라이브러리를 다운로드 받는 것도 init 명령어의 역할 → init 명령어를 사용하면 .terraform 폴더가 생긴다. → .terrarom/plugins/linux_amd64 밑에 라이브러리가 다운로드 된다.
     

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로 옮겨야 한다. 번거로운 경우에는 처음부터 다시 작업해서 리소스를 올릴 수 있지만, 실제 서비스가 되는 인프라를 내리는 건 위험할 수 있다.