terraform state upload

scvit·2024년 4월 17일

1. 개요

https://developer.hashicorp.com/terraform/cloud-docs/api-docs/state-versions#create-a-state-version

로컬 환경에서 Open Source Terraform을 이용해 인프라 배포를 진행하다보면 여러가지 이점이 있는 Terraform Cloud(TFC)나 Terraform Enterprise(TFE) 환경을 이용하고 싶을 때가 있다.

이 경우 로컬 환경에서 작업하던 코드들을 TFC나 TFE 환경으로 이관하여 작업을 이어가야 하는데 해당 환경에는 로컬 환경에서 작업한 코드의 state 파일이 없기 때문에 state 파일 또한 TFC 혹은 TFE 환경으로 이관하는 작업이 필요하다.

2. 사전 준비

[TFE 환경에서 작성]

2.1. Terraform Token 발행

로컬 환경의 state 파일을 TFE로 이관하기 위해서는 우선 Terraform Token을 발행해야 한다.

  1. 좌측 상단 프로필 이미지를 클릭한 뒤 User Settings 항목을 선택한다.

image-20240405104324595

  1. 좌측 사이드바의 Tokens 항목을 선택한 뒤 Create an API token 버튼을 클릭한다.

image-20240405104612080

  1. Token의 설명과 만료 기간을 선택한 뒤 Generate token 버튼을 클릭한다.

image-20240405104722932

  1. Token 생성 시에 한번만 Token 값을 출력해주므로 주의가 필요하다.

image-20240405104844797

2.2. Workspace 생성

로컬 환경의 state 파일을 다룰 수 있는 TFE Workspace를 새로 생성해야 한다.

  1. TFE에 연동된 VCS에 새로운 Repository를 생성한다.

image-20240405105729480

  1. 로컬 환경에서 작업된 코드를 생성한 Repository에 PUSH 한다.
git init
git branch -M main
git add *
git commit -m 'first commit'
git remote add origin https://github.ddimtech.click/ddim/state-upload.git
git push origin main
  • git push 진행 시 terraform.tfstate 파일은 제외하여야 한다.
  1. VCS와 연동된 Workspace 생성

image-20240405124251207

2.3. state 파일 인코드

로컬 환경의 state 파일 이름을 md5 형식으로 state 파일 내용을 base64로 각각 인코드하는 과정이 필요하다.

  1. state 파일 이름 md5 형식으로 인코드
md5sum terraform.tfstate
  1. state 파일 내용 base64 형식으로 인코드
base64 -i terraform.tfstate

2.4. payload.json 파일 작성

API 요청 시 제공할 state 파일의 내용을 담은 .json 형식의 파일을 작성해야 한다.

vi payload.json
{
   "data": {
     "type":"state-versions",
     "attributes": {
       "serial": 1,
       "md5": "78fa3e15c968215fc876f885d48bc1fb",
       "lineage": "13b96fb3-5023-5014-8d80-dc0dcd212a10",
       "state": "ewogICJ2ZXJzaW9uIjogNCwKICAidGVycmFmb3JtX3ZlcnNpb24iOiAiMS4........"
     }
   }
 }
  • serial: terraform 코드가 apply될 때마다 state 파일이 변경되며 serial 번호가 하나씩 올라간다. 현재는 Workspace를 생성한 후 apply 과정없이 첫번 째로 생기는 state 파일이 될 것이기에 1으로 지정한다.

  • md5: 2.3 과정에서 md5 형식으로 인코드한 terraform.tfstate 파일의 이름을 입력한다.

  • lineage: 로컬 환경의 기존 state 파일을 열어보면 lineage 값이라는 state 파일의 ID에 해당하는 값이 존재한다. 해당 값을 입력한다.

  • state: 2.3 과정에서 base64 형식으로 인코드한 terraform.tfstate 파일의 내용을 입력한다.

3. API 요청

발급받은 TFE Token과 작성한 .json 파일과 함께 TFE로 API 요청을 진행하여 state 파일을 이관한다.

  1. Workspace에서 Lock 버튼을 클릭한다.

image-20240405142806351

  1. API를 요청한다.
curl -k \
     --header "Authorization: Bearer <TFE Token>" \
     --header "Content-Type: application/vnd.api+json" \
     --request POST \
     --data @payload.json \
     "https://<TFE Hostname>/api/v2/workspaces/<Workspace ID>/state-versions"
  • Workspace ID: Workspace의 ID의 경우 아래 이미지의 위치에서 확인할 수 있다.
    image-20240405143021624

4. state 이관 및 동작 확인

로컬 환경의 state 파일이 TFE 환경으로 이관된 것을 확인하고 plan 과정을 진행해 No Change 메시지를 확인하는 것으로 정상적으로 동작함을 확인한다.

  1. Workspace의 좌측 사이드바에서 States 항목을 선택하여 state 파일이 생긴 것을 확인한다.

image-20240405143719992

  1. Workspace 우측 상단의 Unlock 버튼을 클릭한 뒤 Yes, unlock workspace 버튼을 클릭한다.

image-20240405144113381

  1. Workspace 우측 상단의 New run 버튼을 클릭한 뒤 Start run 버튼을 클릭하여 plan 과정을 수행한다.

image-20240405144153539

  • 만약 로컬 환경에서 AWS에 관한 Provider와 Variable 내용을 별도로 지정하지 않은 채 default 환경으로 코드를 작성하였다면 VCS에서 별도의 Provider와 access_key, secret_key와 같은 Variable 또한 별도로 등록한 뒤 plan 과정을 수행해야 한다.
  1. plan 과정이 완료된 후 No Change 상태가 출력됨을 확인한다.

image-20240405160339750

0개의 댓글