연재 시리즈

테라폼 t102 스터디 - precondition/postcondition

악분 2023. 7. 9. 08:34
반응형

안녕하세요. 이 글은 테라폼 t102스터디 1주차에 공부했던 내용을 정리했습니다.

 

커스텀 조건문

테라폼은 커스텀 조건문(custom condition)이라는 조건을 사용하여, 테라폼 코드 작성자가 의도한대로 동작하도록 도와줍니다. 조건이 맞지 않는다면 테라폼 동작을 중지시키고 에러메세지를 출력합니다.

 

커스텀 조건문을 소개한 이유는, 이번 글의 주제인 precondition과 postcondition이 커스텀 조건문이기 때문입니다.

 

3항 연산자와 커스텀 조건문 차이

테라폼 조건문은 3항연사로 구현합니다. 커스텀 조건문과 동일하게 조건을 검사하지만, 조건이 만족하지 않을 때 3항 연산자와 커스텀 조건문은 동작이 서로 다릅니다.

 

3항 연산자는 조건이 만족하지 않으면 테라폼 block이 생성되지 않고 에러는 발생하지 않습니다. 하지만, 커스텀 조건문은 조건이 만족하지 않으면 에러를 발생시킵니다.

 

precondition/postcondition이란?

precondition과 postcondition은 커스텀 조건문 중 하나입니다.

 

precondition/postcondition은 block lifecycle(생명주기)단계에서 block필드를 검사합니다. 조건문은 condition필드에 설정합니다. 그리고 조건이 만족하지 않을 때 출력하는 에러메세지는 error_message필드에 정의합니다.

 

precondition/postcondition  차이

precondition은 테라폼 코드 실행 전에 block을 조건 검사합니다. 반면 postcondition은 코드 실행 중과 코드 실행 후에 커스텀 조건을 검사합니다. precondition과 postcondition 모두 조건이 만족하지 않으면 에러를 발생시켜 테라폼 동작을 중지시킵니다.

 

② precondition은 for_each, count등 반복문이 있을 경우, 각각 커스텀 조건을 검사합니다. 

postcondition은 코드 실행 중에 동작하므로 self object에 접근이 가능합니다. precondition은 self object에 접근하지 못합니다.

 

precondition/postcondition을 사용한다는 의미

개인적으로 precondition과 postcondition의미는 기대와 보장이라고 생각합니다. postcondition은 리소스가 잘못 생성되면, 다른 리소스가 참조하지 못하도록 막는 의미가 크다고 생각합니다. 그래서 postcondition은 보장이라고 생각했습니다. 

 

예제

예제는 postcondition이 보장이라고 표현한 의미를 이해할 것입니다. 예제는 제 github repo에 있습니다.

git clone https://github.com/sungwook-practice/t101-study example
cd example/wrong_postcondition

 

테라폼 초기화를 진행합니다.

terraform init

 

terraform plan으로 테라폼 코드를 미리 확인해보세요. (kown after apply)를 주목하세요. known after apply는 리소스 생성 후에 알 수 있는 값입니다.

 

만약 knwon after apply를 postcondition으로 사용하면 조건을 검사할 수 있을까요? 정답은 검사할 수 있습니다. 리소스를 생성한 후에 조건을 검사합니다. 

 

예제 테라폼 코드를 자세히 보시면 리소스 생성 후, content_base64sha256값이 111인지 검사합니다. sha256해시 값은 절대로 111일 수 없어서 커스텀 조건 검사가 실패합니다.

 

terraform apply를 사용하여 리소스를 생성하면, 예상대로 오류가 발생합니다. 커스텀 조건 검사가 실패했기 때문입니다.

 

커스텀 조건은 실패했지만, hello.txt파일은 이미 생성되었습니다. 그래서 postcondition은 다른 리소스가 참조하지 못하도록 에러를 발생시켰습니다. 다른 리소스 입장에서는 해당 리소스가 보장된 상태가 아니기 때문입니다.

 

반응형