테라폼 템플릿 레시피

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
caution
테라폼 CI/CD 템플릿은 폐기되며 GitLab 18.0에서 삭제될 예정입니다. 자세한 내용은 폐기 공지를 참조하십시오.

이 페이지의 레시피를 사용하여 파이프라인에 테라폼 통합을 사용자 정의할 수 있습니다.

자신의 테라폼 구성을 공유하려면 레시피를 기여해보세요.

terraform destroy 작업 활성화

다음 스니펫을 .gitlab-ci.yml에 추가하세요:

include:
  - template: Terraform.latest.gitlab-ci.yml

destroy:
  extends: .terraform:destroy

destroy 작업은 cleanup 단계의 일부입니다. deploy 작업과 마찬가지로 destroy 작업은 항상 manual이며 기본 브랜치와 관련되어 있지 않습니다.

destroy 작업을 GitLab 환경에 연결하려면:

include:
  - template: Terraform.latest.gitlab-ci.yml

deploy:
  environment:
    name: $TF_STATE_NAME
    action: start
    on_stop: destroy

destroy:
  extends: .terraform:destroy
  environment:
    name: $TF_STATE_NAME
    action: stop

이 구성에서 destroy 작업은 항상 생성됩니다. 그러나 특정 조건이 충족될 때에만 destroy 작업을 만들고 싶을 수 있습니다.

다음 구성은 TF_DESTROY가 true일 때만 destroy 작업을 만들고 deploy 작업을 생략합니다:

include:
  - template: Terraform.latest.gitlab-ci.yml

build:
  rules:
    - if: $TF_DESTROY == "true"
      variables:
        TF_CLI_ARGS_plan: "-destroy"
    - when: on_success

deploy:
  environment:
    name: $TF_STATE_NAME
    action: start
    on_stop: destroy
  rules:
    - if: $TF_DESTROY == "true"
      when: never
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $TF_AUTO_DEPLOY == "true"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual

destroy:
  extends: .terraform:destroy
  dependencies:
    - build
  variables:
    TF_CLI_ARGS_destroy: "${TF_PLAN_CACHE}"
  environment:
    name: $TF_STATE_NAME
    action: stop
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $TF_DESTROY == "true"
      when: manual

이 구성에는 알려진 이슈가 있습니다: destroy 작업이 deploy 작업과 같은 파이프라인에 없을 때 on_stop 환경 액션이 작동하지 않습니다.

작업에서 사용자 정의 terraform 명령 실행

사용자 정의 terraform 명령을 실행하는 작업을 정의하려면 gitlab-terraform 래퍼를 어떤 작업에서든 사용할 수 있습니다:

include:
  - template: Terraform.latest.gitlab-ci.yml

state-list:
  stage: validate # 사용할 수 있는 임의의 스테이지를 사용할 수 있지만 정의되어 있는지 확인하십시오
  script: gitlab-terraform state list

gitlab-terraform 명령은 terraform 명령을 설정하고 주어진 인수로 실행합니다.

이 작업을 특정 Terraform 상태 리소스 그룹에서 실행하려면 resource_group을 작업에 할당하세요:

include:
  - template: Terraform.latest.gitlab-ci.yml

state-list:
  stage: validate # 사용할 수 있는 임의의 스테이지를 사용할 수 있지만 정의되어 있는지 확인하십시오
  resource_group: ${TF_STATE_NAME}
  script: gitlab-terraform state list

작업에 사용자 정의 디버그 도구 추가

테라폼 템플릿 작업에서 사용하는 기본 이미지에는 최소한의 도구만 포함되어 있습니다. 그러나 디버깅을 위해 추가 도구를 추가하고 싶을 수 있습니다.

추가 도구를 추가하려면:

  1. 작업 또는 파이프라인의 before_script에 도구를 설치하세요.
  2. script 또는 after_script 블록에서 도구를 사용하세요.
    • script 블록을 사용하는 경우 템플릿 작업 명령을 다시 추가해야 합니다.

예를 들어, 다음 스니펫은 모든 파이프라인의 before_scriptbashjq를 설치합니다:

include:
  - template: Terraform.latest.gitlab-ci.yml

default:
  before_script: apk add --update bash jq

이를 builddeploy 작업에만 추가하려면 해당 작업에 직접 추가하세요:

include:
  - template: Terraform.latest.gitlab-ci.yml

build:
  before_script: apk add --update bash jq

deploy:
  before_script: apk add --update bash jq

사용자 정의 컨테이너 이미지 추가

디버그 도구 및 간단한 설치의 경우 작업에 사용자 정의 디버그 도구를 추가하세요. 도구가 복잡하거나 캐싱을 사용할 경우 gitlab-terraform 이미지를 기반으로 사용자 정의 컨테이너 이미지를 만들 수 있습니다. 이 사용자 정의 이미지를 이후의 테라폼 작업에서 사용할 수 있습니다.

사용자 정의 컨테이너 이미지를 정의하려면:

  1. 사용자 정의 도구를 포함하는 새 Dockerfile을 정의하세요. 예를 들어, .gitlab/ci/Dockerfile에서 bashjq를 설치하세요:

    FROM registry.gitlab.com/gitlab-org/terraform-images/stable:latest
       
    RUN apk add --update bash jq
    
  2. 새 작업에서 Dockerfile이 변경될 때마다 이미지를 빌드하는 prepare 스테이지를 정의하세요.
    • 빌드된 이미지는 GitLab 컨테이너 레지스트리에 푸시됩니다. 이미지가 Merge Request에서 또는 기본 브랜치에서 빌드되었는지를 나타내는 태그가 적용됩니다.
  3. 생성된 이미지를 테라폼 작업인 builddeploy와 같이 사용하세요.
    • 작업을 위한 입력 생성과 같은 설정 명령을 수행하기 위해 사용자 이미지를 특정 before_script 구성과 결합할 수 있습니다.

예를 들어, 완전한 기능을 갖춘 파이프라인 구성은 다음과 같을 수 있습니다:

include:
  - template: Terraform.latest.gitlab-ci.yml

variables:
  IMAGE_TAG: latest

workflow:
  rules:
    - if: $CI_MERGE_REQUEST_IID
      changes:
        - .gitlab/ci/Dockerfile
      variables:
        IMAGE_TAG: ${CI_COMMIT_REF_SLUG}
    - when: always

stages:
  - prepare
  - validate
  - test
  - build
  - deploy
  - cleanup

prepare:image:
  needs: []
  stage: prepare
  image:
    name: gcr.io/kaniko-project/executor:v1.9.0-debug
    entrypoint: [""]
  rules:
    # 만약 MR에 있다면 커밋 SHA로 태그 지정
    - if: $CI_MERGE_REQUEST_IID
      changes:
        - .gitlab/ci/Dockerfile
      variables:
        DOCKER_TAG: $CI_COMMIT_REF_SLUG
    # 기본 브랜치에 있다면 "latest"로 태그 지정
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      changes:
        - .gitlab/ci/Dockerfile
      variables:
        DOCKER_TAG: latest
  before_script:
    # 도커 레지스트리 및 의존성 프록시에 인증
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
  script:
    - /kaniko/executor
      --context "${CI_PROJECT_DIR}/.gitlab/ci"
      --cache=true
      --dockerfile "${CI_PROJECT_DIR}/.gitlab/ci/Dockerfile"
      --destination "${CI_REGISTRY_IMAGE}:${DOCKER_TAG}"

build:
  image: ${CI_REGISTRY_IMAGE}:${IMAGE_TAG}

deploy:
  image: ${CI_REGISTRY_IMAGE}:${IMAGE_TAG}

예제 리포지터리를 보려면 GitLab 테라폼 템플릿 사용 예제 프로젝트를 참조하세요.

기본 브랜치에서 자동으로 배포

TF_AUTO_DEPLOY 변수를 "true"로 설정하여 기본 브랜치에서 자동으로 배포할 수 있습니다. 다른 모든 값은 "false"로 해석됩니다.

variables:
  TF_AUTO_DEPLOY: "true"

include:
  - template: Terraform.latest.gitlab-ci.yml

여러 환경에 Terraform 배포

고유한 Terraform 상태를 갖는 각각의 여러 환경에서 파이프라인을 실행할 수 있습니다.

stages:
  - validate
  - test
  - build
  - deploy

include:
  - template: Terraform/Base.latest.gitlab-ci.yml
  - template: Jobs/SAST-IaC.latest.gitlab-ci.yml

variables:
  # x prevents TF_STATE_NAME from beeing empty for non environment jobs like validate
  # wait for https://gitlab.com/groups/gitlab-org/-/epics/7437 to use variable defaults
  TF_STATE_NAME: x${CI_ENVIRONMENT_NAME}
  TF_CLI_ARGS_plan: "-var-file=vars/${CI_ENVIRONMENT_NAME}.tfvars"

fmt:
  extends: .terraform:fmt
validate:
  extends: .terraform:validate

plan dev:
  extends: .terraform:build
  environment:
    name: dev
plan prod:
  extends: .terraform:build
  environment:
    name: prod

apply dev:
  extends: .terraform:deploy
  environment:
    name: dev

apply prod:
  extends: .terraform:deploy
  environment:
    name: prod

이 구성은 기본 GitLab 템플릿에서 수정되었습니다.