Terraform 기본

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를 맞출 수 있습니다.

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