EMD Blog

[Terraform] Terraform Cloud Workflow (3) - API-driven Runs 본문

IaC

[Terraform] Terraform Cloud Workflow (3) - API-driven Runs

EmaDam 2022. 3. 7. 21:39
반응형

개요

API 기반의 workflowTerraform Cloud API를 사용하는 방식으로, VCS 기반 workflow나 CLI 기반 workflow의 경우 저장소 또는 로컬에 있는 구성 파일들을 workspace와 연결시켜 그대로 가져다가 사용했지만 API 기반 workflow파일을 압축(tar.gz)해서 Terraform Cloud로 직접 업로드 시켜야 하며 파일이 업로드 되면 자동으로 apply(plan 포함)가 된다.

 

이 Terraform Cloud는 코드 배포 외에도 다양한 API를 지원하고 있기 때문에 Terraform Cloud에서 직접적인 연결을 지원하지 않는 서비스를 사용하고 있거나 새롭게 Terraform과의 통합하는 솔루션을 구축하려할 경우 이 API들를 사용Terraform Cloud와 통합시킬 수 있다.

 

Workspace에 파일 업로드

workspace에 파일을 업로드 하기 위해서는 아래 API를 호출해야한다.

이 API는 workspace에서 새 구성 버전을 생성한 뒤 해당 버전에서 실행할 코드를 업로드 할 수 있는 URL 정보를 반환한다. 이때 구성 버전은 pending 상태이고 실행할 코드가 업로드 되면 uploaded가 된다.

새 구성 버전을 생성하고 파일을 업로드하게 되면 자동으로 plan이 되며 자동 apply가 허용되어 있다면 plan 후 바로 apply된다. 만약 자동 apply가 허용되어 있지 않다면 UI 또는 Apply API를 사용해서 수동으로 apply 할 수 있다.

 

Shell Script를 사용한 구성 버전 생성 및 파일 업로드

구성 버전을 생성 한 후 파일을 업로드 하는 예시 코드를 작성한다. workflow는 다음과 같다.

  1. Terraform 코드 작성
  2. 테라폼 코드 압축
  3. 구성 버전 생성 후 업로드 URL 추출
  4. 압축한 테라폼 코드 업로드

위 절차를 Shell Script로 실행하기 위해 먼저 Shell Script 파일을 생성한다.

$ touch ./terraform-apply-script.sh

그 다음 파일 내부에 변수들을 정의한다.

#!/bin/zsh
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
  echo "Usage: $0 <path_to_content_directory> <organization>/<workspace> <token>"
  exit 0
fi

CONTENT_DIRECTORY="$1"
ORG_NAME="$(cut -d'/' -f1 <<<"$2")"
WORKSPACE_NAME="$(cut -d'/' -f2 <<<"$2")"
TOKEN="$3"

파일 내용을 보면 terraform-apply-script.sh를 실행 시킬때 3가지 변수를 전달 받는다.

  • path_to_content_directory → terraform 코드가 존재하는 디렉토리 경로
  • organization/workspace → workspace가 속해있는 조직명/workspace명
  • token → 인증 토큰

script 파일을 실행 시킬때는 아래처럼 실행 시키면 된다.

$ sh ./terraform-apply-script.sh ./terraform-working-dir vntg/terraform-working-workspace $TOKEN

그리고 위 변수들을 체크하고 만약 변수가 누락될 경우 아래와 같은 메세지를 출력 시킨다.

Usage: terraform-apply-script.sh <path_to_content_directory> <organization>/<workspace> <token>

Terraform 코드는 tar.gz로 압축 후 업로드 해야하기 때문에 아래 스크립트를 추가해준다.

$ UPLOAD_FILE_NAME="./content-$(date +%s).tar.gz"
$ tar -zcvf "$UPLOAD_FILE_NAME" -C "$CONTENT_DIRECTORY" .

이제 구성 버전 생성 API를 호출해야 하는데 이 API는 리소스에 workspace의 ID를 지정해야 한다. 아래 API를 사용해 workspace의 ID를 가져온다.

$ WORKSPACE_ID=($(curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  https://app.terraform.io/api/v2/organizations/$ORG_NAME/workspaces/$WORKSPACE_NAME \
  | jq -r .data.id))

workspace ID를 가져왔으면 아래 API를 사용해 구성 버전을 생성한 후 파일 업로드 URL을 추출한다.

$ echo '{"data":{"type":"configuration-versions"}}' > ./create_config_version.json

$ UPLOAD_URL=($(curl \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  --request POST \
  --data @create_config_version.json \
  https://app.terraform.io/api/v2/workspaces/$WORKSPACE_ID/configuration-versions \
  | jq -r '.data.attributes."upload-url"'))

추출한 업로드 URL을 사용해 압축한 테라폼 코드를 업로드한다. 참고로 plan 성공 시 apply가 자동으로 수행되게 하려면 token에 apply 권한이 있어야 한다.

$ curl \
  --header "Content-Type: application/octet-stream" \
  --request PUT \
  --data-binary @"$UPLOAD_FILE_NAME" \
  $UPLOAD_URL

마지막으로 업로드 이전에 생성한 파일들을 제거해준다.

$ rm "$UPLOAD_FILE_NAME"
$ rm ./create_config_version.json

참고로 위처럼 사용할 것이라면 VCS + CLI를 사용하는 것이 유리하다. 위 코드들은 workflow를 보여주기 위한 예시 코드일 뿐이니 참고만 하는 것이 좋다.

반응형