terraform destroy
작업 활성화- 작업에서 사용자 정의
terraform
명령 실행 - 작업에 사용자 정의 디버그 도구 추가
- 사용자 정의 컨테이너 이미지 추가
- 기본 브랜치에서 자동 배포
- 여러 환경에 Terraform 배포
Terraform 템플릿 레시피
Offering: GitLab.com, Self-managed, GitLab Dedicated
Terraform CI/CD 템플릿은 더 이상 사용되지 않으며 GitLab 18.0에서 제거됩니다.
자세한 내용은 사용 중단 공지를 참조하세요.
이 페이지의 레시피를 파이프라인에 추가하여 Terraform 통합을 사용자 정의할 수 있습니다.
자신의 Terraform 구성을 공유하고 싶다면, 이 페이지에 레시피를 기여하는 것을 고려해보세요.
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
작업을 생성하고 싶을 수 있습니다.
다음 구성은 destroy
작업을 생성하고, 파괴 계획을 실행하며, TF_DESTROY
가 true인 경우에만 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
작업에 사용자 정의 디버그 도구 추가
기본적으로 Terraform 템플릿 작업에서 사용되는 이미지는 최소한의 도구만 포함되어 있습니다.
그러나 디버깅을 위해 추가 도구를 추가하고 싶을 수 있습니다.
추가 도구를 추가하려면:
- 작업 또는 파이프라인의
before_script
에 도구를 설치합니다. -
script
또는after_script
블록에서 도구를 사용합니다.-
script
블록을 사용하는 경우 템플릿 작업 명령을 다시 추가해야 합니다.
-
예를 들어, 다음 코드 조각은 파이프라인의 모든 작업에서 before_script
에 bash
및 jq
를 설치합니다:
include:
- template: Terraform.latest.gitlab-ci.yml
default:
before_script: apk add --update bash jq
build
및 deploy
작업에만 추가하려면 해당 작업에 직접 추가합니다:
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
이미지를 기반으로 하는
사용자 정의 컨테이너 이미지를 생성할 수 있습니다.
후속 Terraform 작업에서 사용자 정의 이미지를 사용할 수 있습니다.
사용자 정의 컨테이너 이미지를 정의하려면:
-
사용자 정의 도구를 포함하는 새로운
Dockerfile
을 정의합니다. 예를 들어,.gitlab/ci/Dockerfile
에bash
및jq
를 설치합니다:FROM registry.gitlab.com/gitlab-org/terraform-images/stable:latest RUN apk add --update bash jq
- 새로운 작업에서
Dockerfile
이 변경될 때 이미지를 빌드하는prepare
단계를 정의합니다.- 빌드된 이미지는 GitLab 컨테이너 레지스트리로 푸시됩니다.
머지 요청에서 빌드된 이미지인지 기본 브랜치에서 빌드된 이미지인지 표시하기 위해 태그가 적용됩니다.
- 빌드된 이미지는 GitLab 컨테이너 레지스트리로 푸시됩니다.
-
build
및deploy
와 같은 Terraform 작업에서 이미지를 사용합니다.- Terraform에 대한 입력을 생성하는 설정 명령을 수행하기 위해 전문화된
before_script
구성과 이미지를 결합할 수 있습니다.
- Terraform에 대한 입력을 생성하는 설정 명령을 수행하기 위해 전문화된
완전히 작동하는 파이프라인 구성의 예는 다음과 같습니다:
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 Terraform 템플릿 사용 프로젝트를 참조하세요.
기본 브랜치에서 자동 배포
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는 validate와 같은 비환경 작업에 대해 TF_STATE_NAME이 비어 있지 않도록 방지합니다.
# 변수 기본값을 사용하려면 https://gitlab.com/groups/gitlab-org/-/epics/7437를 기다립니다.
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 템플릿에서 수정되었습니다.