Terraform

이eun·2024년 12월 23일

테라폼이란

  • 테라폼은 인프라를 만들고, 변경하고, 기록하는 IaC를 위해 만들어진 도구로써, 문법이 쉬워 비교적 다루기 쉽고 사용자가 많아 참고할 수 있는 예제가 많다.

테라폼의 구성요소

  • provider : 테라폼으로 생성할 인프라의 종류
  • resource : 테라폼으로 실제로 생성할 인프라의 자원
  • state : 테라폼을 통해 생성한 자원의 상태
  • output : 테라폼으로 만든 자원을 변수 형태로 state에 저장하는 것
  • backend : terraform의 상태를 저장할 공간을 지정하는 부분. backend를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능. 가장 대표적으론 AWS S3
  • module : 공통적으로 활용할 수 있는 코드를 문자 그대로 모듈 형태로 정의하는 것을 의미, template와 같음. Terraform 코드를 재사용 가능한 구성으로 패키징하는 방법. 이를 통해 코드의 중복을 줄이고, 관리를 용이하게 하며, Terraform 구성의 가독성과 조직을 개선할 수 있음
  • remote : 다른 경로의 state를 참조하는 것. output 변수를 불러올 때 주로 사용. 인프라의 현재 상태 정보를 원격 데이터 저장소에 저장하는 기능. 이 기능을 사용함으로써 팀원들이 상태 파일을 공유하고 보다 안전하고 일관된 방법으로 인프라 상태를 관리할 수 있음. 보통 '.tfstate'
    에 저장됨

테라폼 명령어

  • init : 테라폼 명령어 사용을 위해 각종 설정을 진행
  • plan : 테라폼으로 작성한 코드가 실제로 어떻게 만들어질지에 대한 예측 결과를 보여줌
  • apply : 테라폼 코드로 실제 인프라를 생성하는 명령어
  • import : 이미 만들어진 자원을 테라폼 state 파일로 옮겨주는 명령어
  • state : 테라폼 state를 다루는 명령어. 하위 명령어로 mv, push와 같은 명령어가 있음
  • destroy: 생성된 자원들 + state 파일 모두 삭제하는 명령어

테라폼의 작동원리

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

여기서 가장 중요한 것은 AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만드는 것

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

1. Terraform init

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

2. Terraform plan

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

3. Terraform apply

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

4. Terraform import

  • AWS인프라에 배포된 리소스를 terraform state로 옮겨주는 작업

  • 이는 local의 .terraform에 해당 리소스의 상태 정보를 저장해주는 역할을 한다. (절대 코드를 생성해 주지 않는다.)

    • Apply전까지는 backend에 저장되지 않는다.
    • Import이후에 plan을 하면 로컬에 해당 코드가 없기 때문에 리소스가 삭제 또는 변경된다는 결과를 보여준다. 이 결과를 바탕으로 코드를 작성할 수 있다.
  • 만약 기존에 인프라를 AWS에 배포한 상태에서 테라폼을 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야 한다. 번거로운 경우에는 처음부터 다시 작업해서 리소스를 올릴 수 있지만, 실제 서비스가 되는 인프라를 내리는 건 위험할 수 있다.

terraform의 강점

  • 테라폼 코드로 만든 리소스에 대해서는 누군가가 콘솔에서 해당 리소스를 삭제해도 변경사항을 알 수 있으므로 plan or apply 적용이 가능하다. 즉, 누군가가 수정을 하거나 잘못 삭제를 해도 내가 원했던 형상 그대로 복구를 할 수 있다는 것을 의미한다. 그렇기 때문에 테라폼으로 리소스를 만들어야 한다.

0개의 댓글