병합 요청에서의 Terraform 통합

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Infrastrcuture as Code(IaC) 변경에 대한 협업은 코드 변경과 기대하는 인프라 변경의 모두를 확인하고 승인해야 합니다. GitLab은 Terraform 코드 변경과 해당 기대 효과에 대한 협업을 돕는 솔루션을 제공합니다. 이를 통해 사용자들은 IaC 작업 흐름을 최적화하기 위해 사용자 지정 도구를 구축하거나 제삼자 솔루션에 의존할 필요가 없습니다.

Terraform Plan 정보를 병합 요청에 출력하기

GitLab Terraform 보고서 artifact를 사용하여 terraform plan 실행에서 바로 병합 요청 위젯으로 세부 정보를 노출시킬 수 있습니다. 이를 통해 Terraform이 생성, 수정 또는 삭제하는 리소스에 대한 통계를 확인할 수 있습니다.

경고:
다른 작업 artifact와 마찬가지로 Terraform plan 데이터는 저장소의 Guest 역할을 가진 모든 사용자가 볼 수 있습니다. Terraform 또는 GitLab은 기본적으로 plan 파일을 암호화하지 않습니다. Terraform plan.json 또는 plan.cache 파일에 비밀번호, 액세스 토큰 또는 인증서와 같은 민감한 데이터가 포함되어 있는 경우, plan 출력을 암호화하거나 프로젝트 가시성 설정을 수정해야 합니다. 또한 public pipelines 비활성화artifact의 public 플래그를 false로 설정 (public: false)해야 합니다. 이 설정은 artifact에 대한 액세스 권한을 GitLab 관리자 및 최소한 Reporter 역할을 가진 프로젝트 구성원에게만 부여합니다.

Terraform 보고서 artifact 구성

GitLab은 Terraform과의 통합OpenTofu와의 통합을 통해 CI/CD 템플릿 및 구성요소를 사용하여 GitLab 관리 Terraform 상태를 표시하고 병합 요청에서 Terraform 변경 사항을 표시합니다.

자동으로 Terraform 보고서 artifact 구성

Terraform CI/CD 템플릿 또는 OpenTofu CI/CD 구성요소 중 하나를 사용하여 plan 작업에서 Terraform 보고서 artifact를 자동으로 구성해야 합니다.

수동으로 Terraform 보고서 artifact 구성

빠른 설정을 위해 미리 빌드된 이미지를 사용하고 gitlab-terraformgitlab-tofu 도우미에 의존해야 합니다.

GitLab Terraform 보고서 artifact를 수동으로 구성하려면:

  1. 간단히 몇 가지 재사용 가능한 변수를 정의하여 이 파일들을 여러 번 참조할 수 있도록 해야 합니다: yaml variables: PLAN: plan.cache PLAN_JSON: plan.json

  2. 경량 및 유연한 명령 줄 JSON 처리기인 jq를 설치해야 합니다.
  3. terraform plan 출력에서 추출하려는 정보를 파싱하는 특정 jq 명령에 대한 별칭을 생성해야 합니다: ```yaml before_script:
    • apk –no-cache add jq
    • alias convert_report=”jq -r ‘([.resource_changes[]?.change.actions?]|flatten)|{"create":(map(select(.=="create"))|length),"update":(map(select(.=="update"))|length),"delete":(map(select(.=="delete"))|length)}’” ```

    참고:
    Bash를 사용하는 배포에서(예: Ubuntu), alias 문은 비대화식 모드에서 확장되지 않습니다. 파이프라인이 convert_report: command not found 오류와 실패하는 경우, 별칭 확장은 스크립트에 shopt 명령을 추가함으로써 명시적으로 활성화할 수 있습니다: yaml before_script: - shopt -s expand_aliases - alias convert_report="jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'"

  4. terraform planterraform show을 실행하는 script를 정의해야 합니다. 이 명령어는 출력을 파이핑하고 해당 부분을 저장 변수 PLAN_JSON로 변환합니다. 이 JSON은 GitLab Terraform 보고서 artifact를 생성하는 데 사용됩니다. Terraform 보고서는 Terraform tfplan.json 파일을 얻습니다. 수집된 Terraform plan 보고서는 artifact로 GitLab에 업로드되어 병합 요청에서 표시됩니다. yaml plan: stage: build script: - terraform plan -out=$PLAN - terraform show --json $PLAN | convert_report > $PLAN_JSON artifacts: reports: terraform: $PLAN_JSON

  5. 파이프라인을 실행하면 병합 요청에서 다음과 같이 위젯이 표시됩니다: 병합 요청 Terraform 위젯

  6. 위젯에서 View Full Log 버튼을 선택하면 파이프라인 로그에 표시된 plan 출력으로 직접 이동할 수 있습니다: Terraform plan 로그