연재 시리즈

테라폼 t102 스터디 - 프로비저너(provisioner)

악분 2023. 7. 22. 22:08
반응형

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

 

1. 프로비저너란?

프로비저너(provisioner)는 테라폼 resource block기능 이외에 사용자 액션을 수행합니다. 예를 들어 resource block은 리소스를 생성/수정/삭제하는데 프로비저너를 사용하면, 리소스 작업 말고 API호출 등 사용자가 원하는 기능을 추가할 수 있습니다.

 

테라폼 공식문서에서 프로비저너 컨셉을 다음과 같이 설명합니다. "테라폼 모델이 표현하지 못하는 것들을 수행". 테라폼 모델이 표현하지 못한다는 의미는 테라폼 block 이외에 커스텀 기능은 수행하지 못한다는 의미로 해석할 수 있습니다.

출처: https://developer.hashicorp.com/terraform/language/resources/provisioners/syntax#provisioners-are-a-last-resort

 

2. 사용방법

프로비저너는 resource block에만 사용할 수 있습니다. resource block에 provisioner block을 정의하면 됩니다. 프로비저너 종류는 local-exec, remote-exec, file 등이 있습니다.

 

local-exec 프로비저너는 테라폼을 실행하는 PC에서 사용자 액션을 실행합니다. 반대로, remote-exec는 resource block에서 생성한 리소스에서 사용자 액션을 실행합니다.

 

3. 실행시점(Creation-Time Provisioners)

프로비저너는 디폴트로 리소스가 생성될 때 실행됩니다. when 인자를 설정하면 리소스 삭제시 프로비저너가 실행되도록 설정할 수 있습니다.

 

4. 실행실패(Failure Behavior)

프로비저너 실행을 실패한 리소스는 status가 tainted로 됩니다. 리소스는 생성이 되었지만 프로비저너 실행 실패 때문에 비정상적인 status가 됩니다.

 

tainted된 리소스는 다음 terraform apply명령어 실행 시 replaced됩니다.

 

반응형

 

5. 로컬 프로비저너 예제

5.1 예제코드 다운로드

예제코드는  github에 있습니다.  

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

 

5.2 예제 전제조건

실습을 진행하기 위해 slack app과 slack webhook을 생성해야 합니다. 이 과정 설명은 생략합니다.

 

5.3 첫 번째 시나리오 - 리소스 생성, 삭제 slack알림

예제코드는 aws vpc, subnet을 생성합니다. vpc, subnet생성/삭제할 때, 로컬 프로비저너로 파이썬 API를 호출합니다. 파이썬 API는 slack webhook을 사용하여 알림 메세지를 slack에 전송합니다.

 

5.4 파이썬 API실행

파이썬 API는 python_slack_notification_api 디렉터리에 있습니다.

cd python_slack_notifcation_api

 

파이썬 API실행에 필요한 파이썬 패키지를 설치합니다. fastapi 등을 사용합니다.

pip install -r requirements.txt

 

파이썬 API는 slack webhook주소를 환경변수로 설정합니다.

export SLACK_WEBHOOK="https://hooks.slack.com/services/{your-webhook-url}"

 

환경변수 설정을 한 후, uvicorn으로 파이썬 API를 실행합니다.

uvicorn main:app --host 127.0.0.1 --port 8000

 

웹 브라우저에서 http://127.0.0.1:8000/docs에 접속합니다. 그리고 send_message API를 호출합니다.

 

slack 채널을 확인하면 파이썬 API가 전송한 메세지가 보입니다.

 

5.5  테라폼 코드 분석

테라폼 예제코드는 terraform 디렉터리에 있습니다.

 

main.tf파일을 확인하면 vpc, subnet resource block에 로컬 프로비저너가 있습니다. 로컬 프로비저너는 리소스 생성, 삭제 시, curl을 사용하여 로컬에 실행되고 있는 파이썬 API를 호출합니다.

 

5.6 첫 번째 시나리오 실행

terraform apply로 테라폼 코드를 실행합니다.

terraform init && terraform apply

 

aws 콘솔에서 리소스를 확인해보세요. vpc 1개와 subnet 2개가 생성되었습니다.

 

slack 채널을 확인해보세요. vpc, subnet이 생성될 때, 로컬 프로비저너가 전송한 메세지가 보입니다.

 

terraform destroy명령어로 리소스를 삭제합니다.

terraform destory

 

slack채널을 확인하면 vpc, subnet이 삭제되었다는 메세지가 있습니다.

 

5.7  두 번째 시나리오 - 프로비저너 실행 실패

로컬 프로비저너가 호출하는 파이썬 API를 종료하여 프로비저너 실행 실패를 유도합니다.

 

5.8 두 번째 시나리오 실행

파이썬 API를 종료시킨 후, 테라폼 코드를 실행합니다.

terraform apply

 

로컬 프로비저너 실행 실패 오류가 발생합니다. 파이썬 API호출을 실패했기 때문입니다.

 

하지만, aws 콘솔를 확인하면 vpc는 생성이 되었습니다.

 

state파일을 확인하면 status가 tainted로 되어 있습니다. 정상적이지 않은 status입니다.

 

tainted status를 갖는 리소스는 다음 terraform apply를 실행할 때 replaced됩니다. terraform plan명령어를 실행하면 replaced되는지 확인할 수 있습니다.

terraform plan

 

6. 마치며

저는 프로비저너는 테라폼 공식문서에서 언급한 것처럼, 사용하지 않을 것 같습니다. 

 

왜냐하면 프로비저너 실행을 실패하면 예상하지 못한 결과를 만날 수 있습니다. [챕터 5.7 두 번째 시나리오]에서 프로비저너가 실행을 실패했지만, 일부 리소스가 생성되었습니다. 그리고 다음 테라폼 실행 시 리소스가 교체되었습니다.

 

반응형