테라폼의 홍길동, 잠금 파일 정보
테라폼 명령어를 실행하면서 .terraform.tfstate.lock.info 파일을 보신 적 있으신가요?
이 파일은 평소에는 존재하지 않다가 테라폼의 특정 명령어 실행 시 잠깐 생성되었다가 다시 사라지는데요. 그 모습이 마치 홍길동 같습니다. 그래서 저는 이 파일을 테라폼의 홍길동이라 부릅니다. 아래 본문에서도 .terraform.tfstate.lock.info를 홍길동 파일이라고 부릅니다.
과연 어떤 명령어에서 나타나고 사라지는 걸까요?
바로 terraform plan
, terraform apply
, terraform destroy
와 같은 명령어를 실행하였을 때 잠깐 나타났다가 사라진답니다.
왜 이 세 가지 명령어에서 .terraform.tfstate.lock.info 파일이 생성되고 사라지는걸까요?
위 명령어들의 공통점은 모두 Terraform의 텍스트 파일인 .tf
파일을 읽고 해석한다는 것입니다. 읽고 해석하였다면 다음으로 각 명령어가 담당하는 기능을 수행하게 됩니다. plan은 인프라 구성이 실제로 어떤 변경사항을 초래할지 사용자에 게 보여주고 apply는 plan이 보여준 변경사항을 실제로 인프라에 적용(생성, 수정, 삭제)하게 되고 destroy는 생성된 리소스를 삭제하게 됩니다.
만약 테라폼 코드를 여러 팀원이 관리하게 된다면 동일한 인프라를 관리하게 될 것이고 이에 따라 인프라의 상태를 나타내는 테라폼 코드도 모두 동일하게 공유해야 합니다. (테라폼 코드는 인프라 상태를 나타내는데 동일한 인프라를 관리하면서 상태를 나타내는 테라폼 코드가 다르다는 것은 곧 인프라 상태를 서로 다르게 갖고 있다는 것과 마찬가지입니다.)
만약 인프라를 변경하고자 다른 팀원이 코드를 수정하고 인프라를 변경하게 된다면 변경하는 동안 다른 팀원은 Terraform 명령을 실행할 수 없게 됩니다. 이러한 기능은 테라폼의 일관성과 동시성 문제를 방지하기 위해서 존재하는 기능입니다. 테라폼에서는 state locking이라고 부르며 상태 잠금을 의미합니다.
다시 말해, .terraform.tfstate.lock.info는 상태 잠금에 대한 정보를 메타데이터로 가지고 있는 파일입니다.
그럼, 이 파일에는 어떤 정보가 담겨있는지 같이 살펴보겠습니다.
아래는 저의 테라폼 코드들인데요. .terraform.tfstate.lock.info를 봐주세요. terraform plan을 실행하는 동안 잠깐 나타났고 실행 계획을 모두 출력하자 이내 사라졌는데요. 그 사이를 ls -al로 포착한 모습입니다. 파일 권한이 600으로 만들어져 있네요.
total 56
drwxr-xr-x 10 hongjinhyeok admin 320 7 28 12:31 .
drwxr-xr-x 3 hongjinhyeok admin 96 7 28 12:31 ..
drwxr-xr-x 4 hongjinhyeok admin 128 7 28 12:31 .terraform
-rw-r--r-- 1 hongjinhyeok admin 5444 7 28 12:31 .terraform.lock.hcl
-rw------- 1 hongjinhyeok admin 208 7 28 12:31 .terraform.tfstate.lock.info
-rw-r--r-- 1 hongjinhyeok admin 223 7 28 12:31 key.tf
-rw-r--r-- 1 hongjinhyeok admin 454 7 28 12:31 main.tf
-rw-r--r-- 1 hongjinhyeok admin 175 7 28 12:31 output.tf
-rw-r--r-- 1 hongjinhyeok admin 43 7 28 12:31 provider.tf
-rw-r--r-- 1 hongjinhyeok admin 0 7 28 12:31 terraform.tfstate
저 홍길동 파일에는 어떤 내용이 담겨있는지 한 번 확인해봅시다.
{
"ID": "c1d19001-512b-a0d7-6793-5409b5a90d80",
"Operation": "OperationTypePlan",
"Info": "",
"Who": "hongjinhyeok@gimsiyepleWatch",
"Version": "1.5.3",
"Created": "2023-07-28T03:18:41.749393Z",
"Path": "terraform.tfstate"
}
ID는 상태 잠금마다 실행되는 파일의 고유 아이디를 의미하고 Operation은 제가 실행한 명령어 타입을 보여줍니다. terraform plan을 실행하였으니 OperationTypePlan으로 나타난 것이죠. Who에는 명령을 실행한 호스트 정보가 담기고 Version에는 테라폼 버전이 담기게 되는군요. Created는 UTC를 기준으로 명령을 실행함으로써 홍길동 파일이 생성된 시간을 보여주게 되고 홍길동 파일이 terraform.tfstate 경로에 있나 보네요. 정확합니다.
이번에는 terraform plan이 아니라 terraform apply를 실행해 볼게요. 잠깐 생성된 홍길동 파일 내용은 아래와 같습니다.
{
"ID": "458f2bd3-1c64-0705-5450-83691172573a",
"Operation": "OperationTypeApply",
"Info": "",
"Who": "hongjinhyeok@gimsiyepleWatch",
"Version": "1.4.5",
"Created": "2023-07-28T03:19:57.614029Z",
"Path": "terraform.tfstate"
}
위 terraform plan을 실행해서 나타난 홍길동 파일과 비교하였을 때 다른 점이 네 가지 정도 보이네요. 먼저 ID가 달라졌어요. 이는 잠금 파일의 고유 아이디이기 때문에 매번 변경되는 것입니다. 다음은 Operation이 바뀌었네요. OperationTypeApply로 바뀐 것을 보니 terraform apply 명령으로 생긴 홍길동 파일임이 분명해졌어요. 하지만 버전이 이전에는 1.5.3이었는데 지금은 1.4.5인데요. 이번에는 원격으로 명령을 실행하였고 원격 서버에는 테라폼 버전이 1.4.5로 설치되어 있기 때문입니다. Created의 내용도 파일이 생성된 시각에 맞게 생성되었네요.
마지막으로 terraform destroy를 실행해 볼 건데요.
terraform destory로 나타나는 홍길동 파일의 Operation에는 OperationTypeDestroy가 생길 것으로 예상되지 않으신가요?
저도 그렇게 예상했었습니다만 전혀 그렇지 않습니다. 아래 내용을 한 번 확인해봅시다.
{
"ID": "102028d3-b6c8-1165-94d8-e9fed5de18cc",
"Operation": "OperationTypeApply",
"Info": "",
"Who": "hongjinhyeok@gimsiyepleWatch",
"Version": "1.5.3",
"Created": "2023-07-28T03:22:51.236912Z",
"Path": "terraform.tfstate"
}
terraform apply를 실행한 것이 아니냐고요?
그럴리가요.😂😂😂 terraform destroy를 실행한 것입니다.
리소스를 삭제하는 명령어에는 terraform destory 외에도 terraform apply -destroy가 존재합니다. 위에서 예상한 결과와 다른 내용이었기에 이번에는 terraform apply -destroy
를 실행해보았습니다. 하지만 결과는 아래처럼 OperationTypeApply로 나타납니다. 이유는 모르겠으나 테라폼은 리소스 삭제를 하나의 OperationType으로 보지 않고 Apply의 속성 중 하나로 보는 것 같습니다.
이렇게 생각하는 근거는 다음과 같습니다. 테라폼에서 deprecated되고 대안으로 사용되는 대부분의 명령어들이 앞으로 terraform apply의 옵션 플래그로 사용되기 때문입니다. 예를 들어, terraform refresh는 terraform apply -refresh-only로 대체되고 terraform taint는 terraform apply -replace로 대체되기 때문입니다.
{
"ID": "0d2583d2-16a1-4ed2-1606-60425eb27324",
"Operation": "OperationTypeApply",
"Info": "",
"Who": "hongjinhyeok@gimsiyepleWatch",
"Version": "1.5.3",
"Created": "2023-07-28T04:09:43.201768Z",
"Path": "terraform.tfstate"
}
지금까지 상태 잠금 기능인 state locking을 사용하였기 때문에 잠금 정보를 메타데이터로 가지는 홍길동 파일이 생성되는 것을 확인하였습니다.
만약 상태 잠금 기능을 사용하지 않는다면 홍길동 파일도 생성이 안 되지 않나요?
네, 그렇습니다. 상태 잠금 기능을 사용하지 않는다면 디렉토리에 홍길동 파일은 생성되지 않습니다. 상태 잠금 기능을 사용하지 않기 위해서는 옵션 플래그인 -lock=false
를 추가해주면 됩니다. terraform apply -lock=false
를 실행하였더니 홍길동 파일이 생성되지 않은 채로 인프라가 생성되는 것을 확인하였습니다. 이는 상태 잠금 기능을 사용하지 않았기 때문에 잠금 정보를 메타데이터로 가지는 홍길동 파일도 동일하게 생성되지 않기 때문입니다.
상태 잠금 기능을 사용하지 않은 채로 인프라를 생성하게 될 때 동시성 문제가 발생하거나 테라폼의 일관성을 해칠 수도 있기 때문에 신중하게 사용해야 합니다.