ABOUT ME

누구나 알기 쉽게 클라우드 설명해주는 남자

Today
Yesterday
Total
  • Terraform State Lock

    IaC/Terraform 기초 2023. 9. 15. 20:34

     

     

    이전에 Terraform에서 state파일을 통해 인프라의 현재 상태를 파악하고 관리한다고 말씀드렸습니다.

    (Terraform State에 관한 내용을 아직 모르시는 분들은 링크를 참고해주세요.)

     

    그러면 한 가지 고민이 생깁니다.

     

    만약에 동시에 state 파일을 수정하려고 하면 꼬이는거 아닐까?
    여러 명이 하나의 state 을 바라보고 있다면 어떻게 관리해야하지?

     

     

    이런 고민을 해결해주는 것이 state lock입니다.

     

    만약 하나의 state을 바라보고 손오공과 저팔계라는 테라폼 개발자가 각자 다른 인프라를 개발하고 있다고 가정해봅시다.

    (하지만 Github에서 같은 코드를 공유하고 terraform apply는 main(master) 브랜치의 최신 commit을 기준으로 합니다)

    그리고 동시에 손오공은 terraform plan을, 저팔계는 terraform apply를 실행했습니다. 

     

    만약에 state lock이 없다면 테라폼은 현재 state 파일을 기준으로 terraform plan의 결과를 손오공에게 보여주려 하고,

    동시에 저팔계의 테라폼의 변경 사항을 state에 기술하려고 하기 때문에,

    손오공은 실시간으로 변경되는 state 파일을 읽은 terraform plan 결과를 보게 될 겁니다.

     

    그러면 손오공은 아마 이런 혼란에 휩싸이겠죠.

     

    분명히 plan을 찍었을 때 만들어져야 된다고 찍혀야 되는데 이미 만들어졌다고?

     

     

    이런 혼세마왕같은 상황을 방지하기 위해 테라폼은 똑똑하게

    state를 한 명만 보거나 수정할 수 있도록 state lock이라는 것을 활용합니다.

    그러면 다시 손오공이 terraform plan을 하고 그 다음에 저팔계가 terraform apply를 하고

    다시 손오공이 terraform plan 결과를 바탕으로 apply를 하려고 하는 상황을 가정해 봅시다.

     

    먼저 손오공은 plan을 찍고 생성될 리소스를 확인하려는데

    자신이 코드를 작성하지 않은 리소스가 생성되는 것을 확인합니다. 

    그리고 손오공은 생각하겠죠.

     

    음 내가 올린 PR이 merge된 이후에 누가 또 바로 PR을 merge 했나?
    저팔계? 사오정? 아무튼 누군가 동시에 작업을 하고 있는 것 같은데?

     

    손오공이 terraform plan을 하는 동안 저팔계가 terraform apply를 시도합니다.

    그리고 state lock이 손오공에 의해 걸려있는 것을 봅니다.

    (state lock이 누구에 의해서 걸려있는지도 보여줍니다.)

    그리고 저팔계가 생각하겠죠.

     

    지금 손오공이 terraform plan 찍어보고 있구나?

     

    그리고 둘은 slack으로 얘기를 나눕니다. 

     

    손오공: 팔계님 혹시 테라폼으로 람다 만드는 코드 작성하셨어요? 제 플랜에 뜨던데..

    저팔계
    : 네 제가 만들었어요. 지금 저 apply 돌리려고 하다가 lock 걸려서 저도 손오공님이 뭐 하고 계시구나 하고 왔어요.

    손오공
    : 아하 그러면 제가 apply해도 될까요? 어차피 한번에 실행하면 될 거 같은데요.

    저팔계
    : 그럼 혹시 plan 결과만 한번 공유부탁드려도 될까요? 아니면 저도 plan으로 한번 보고 apply 부탁드리겠습니다.

    손오공
    : 네 그러면 저 plan해보고 팔계님도 plan 한번 해보시고 말씀주세요.

     

    그러면 state lock으로 혼세마왕같은 충돌 상황은 해결이 되었습니다.

     

     

    그러면 실제로 state lock 이 걸리면 어떤 식으로 확인할 수 있는지 보겠습니다.

     

     

    state lock 때문에 Error가 발생했다고 뜨는데요. 현재 state lock이 어떻게 걸려있느지 하나씩 살펴보겠습니다.

     

    ID: 현재 state lock을 걸어놓은 lock의 ID가 있습니다. (이 ID를 가지고 강제로 lock을 풀 수도 있습니다.)

    Path: state 파일이 현재 어디에 위치하는지 나타내는 경로

    Operation: 어떤 작업을 하고 있어서 lock이 걸려있는지 보여주는 정보

    Who: 누가 lock을 걸고 작업을 하고 있는지 나타내는 정보

    Created: lock을 언제 걸었는지 나타내는 정보

     

    이걸 바탕으로 위에 나온 lock을 살펴보면,

    현재 lock을 걸어놓은 ID는 e0f85***이고,

    로컬에서 terraform.tfstate 파일에서 state를 관리하고 있는 것으로 보이고,

    다른 곳에서 plan작업 때문에 lock이 걸려있으며,

    root@S8426이라는 유저에 의해 걸려있고,

    2022년 10월 4일 9시 12분 경에 작업을 시작했다는 것을 알 수 있습니다.

     

    이런 경우 lock을 건 사람을 찾아가서 얘기를 해볼 수도 있고,

    lock이 풀리면 내 작업을 하도록 대기를 걸어놓을 수도 있습니다.

    (-lock-timeout=60m: 1시간까지 대기, 그 전에 풀리면 실행)

    혹은 내가 terraform console로 작업을 하던 중 예기치 못한 이유로 종료되어서

    무한 lock이 걸려있을 수도 있는데, 이런 경우에 아래와 같은 force-unlock 명령어로 lock을 강제 종료 시킬 수 있습니다.

     

    terraform force-unlock <LOCK-ID>

     

     

    지금까지 테라폼 state lock에 대해서 알아보았습니다. 

    'IaC > Terraform 기초' 카테고리의 다른 글

    Terraform Local  (0) 2023.09.20
    Terraform Variable  (0) 2023.09.19
    Terraform Backend  (0) 2023.09.12
    Terraform Provider  (0) 2023.09.12
    Terraform Apply  (0) 2023.09.05
Designed by Tistory.