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 환경으로 이관하는 작업이 필요하다.
[TFE 환경에서 작성]
로컬 환경의 state 파일을 TFE로 이관하기 위해서는 우선 Terraform Token을 발행해야 한다.
User Settings 항목을 선택한다.
Tokens 항목을 선택한 뒤 Create an API token 버튼을 클릭한다.
Generate token 버튼을 클릭한다.

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

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
terraform.tfstate 파일은 제외하여야 한다.
로컬 환경의 state 파일 이름을 md5 형식으로 state 파일 내용을 base64로 각각 인코드하는 과정이 필요하다.
md5sum terraform.tfstate
base64 -i terraform.tfstate
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 파일의 내용을 입력한다.
발급받은 TFE Token과 작성한 .json 파일과 함께 TFE로 API 요청을 진행하여 state 파일을 이관한다.
Lock 버튼을 클릭한다.
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의 경우 아래 이미지의 위치에서 확인할 수 있다.
로컬 환경의 state 파일이 TFE 환경으로 이관된 것을 확인하고 plan 과정을 진행해 No Change 메시지를 확인하는 것으로 정상적으로 동작함을 확인한다.
States 항목을 선택하여 state 파일이 생긴 것을 확인한다.
Unlock 버튼을 클릭한 뒤 Yes, unlock workspace 버튼을 클릭한다.
New run 버튼을 클릭한 뒤 Start run 버튼을 클릭하여 plan 과정을 수행한다.
