테라폼 통합 Merge Request

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

인프라스트럭처 코드(IaC) 변경에 대한 협업은 코드 변경과 예상된 인프라스트럭처 변경을 검토하고 승인해야 합니다. GitLab은 테라폼 코드 변경과 해당 변경이 예상되는 영향에 대한 협업을 지원하여, Merge Request 페이지를 사용하여 IaC 워크플로를 간소화하기 위해 사용자들이 사용자 정의 도구를 구축하거나 제 3자 솔루션에 의존할 필요가 없게 합니다.

테라폼 계획 정보를 Merge Request에 출력

GitLab Terraform 보고서 artifact를 사용하여 terraform plan 실행에서의 세부 정보를 직접 Merge Request 위젯에 공개할 수 있습니다. 이를 통해 테라폼이 생성, 수정 또는 파괴하는 리소스에 대한 통계를 볼 수 있게 됩니다.

caution
다른 작업 artifact와 마찬가지로, 테라폼 계획 데이터는 리포지터리의 게스트 역할을 가진 모든 사용자가 볼 수 있습니다. 테라폼이나 GitLab은 계획 파일을 기본적으로 암호화하지 않습니다. 만약 테라폼의 plan.json 또는 plan.cache 파일에 패스워드, 액세스 토큰 또는 인증서와 같은 민감한 데이터가 포함되어 있다면, 계획 출력을 암호화하거나 프로젝트 가시성 설정을 수정해야 합니다. 또한 public pipelines를 비활성화하고 artifact의 public flag를 false(public: false)로 설정해야 합니다. 이 설정은 artifact가 GitLab 관리자 및 최소한 Reporter 역할을 가진 프로젝트 구성원만 접근할 수 있도록 합니다.

테라폼 보고서 artifact 구성

GitLab은 테라폼 상태를 관리하고 Merge Request에서 테라폼 변경 사항을 표시하는 CI/CD 템플릿과 컴포넌트를 통해 Terraform 및 OpenTofu와 통합됩니다.

자동으로 테라폼 보고서 artifact 구성

테라폼 CI/CD 템플릿 또는 OpenTofu CI/CD 컴포넌트을 사용하여 plan 작업에서 자동으로 테라폼 보고서 artifact를 구성해야 합니다.

매뉴얼으로 테라폼 보고서 artifact 구성

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

GitLab 테라폼 보고서 artifact를 매뉴얼으로 구성하려면:

  1. 간단히 몇 가지 재사용 가능한 변수를 정의하여 여러 번 이 파일을 참조할 수 있게 합시다.

    variables:
      PLAN: plan.cache
      PLAN_JSON: plan.json
    
  2. 경량이면서 유연한 명령줄 JSON 프로세서jq를 설치합니다.
  3. jq 명령을 파싱하는 특정 jq 명령의 별칭을 만듭니다. 이 명령은 terraform plan 출력에서 추출하려는 정보를 구문 분석합니다.

    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)}'"
    
    note
    Bash를 사용하는 배포(distribution)에서(ex. Ubuntu), alias 명령은 비대화(non-interactive) 모드에서 확장되지 않습니다. 만약 파이프라인이 convert_report: command not found와 같은 오류로 실패한다면, alias 확장은 명시적으로 shopt 명령을 스크립트에 추가하여 활성화할 수 있습니다.
    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 테라폼 보고서 artifact를 작성하는 데 사용됩니다. 테라폼 보고서는 테라폼 tfplan.json 파일을 가져옵니다. 수집된 테라폼 계획 보고서는 artifact로서 GitLab에 업로드되고 Merge Request에서 표시됩니다.

    plan:
      stage: build
      script:
        - terraform plan -out=$PLAN
        - terraform show --json $PLAN | convert_report > $PLAN_JSON
      artifacts:
        reports:
          terraform: $PLAN_JSON
    
  5. 파이프라인을 실행하면 Merge Request에 위젯이 표시됩니다.

    Merge Request 테라폼 위젯

  6. 위젯의 전체 로그 보기 버튼을 선택하면 파이프라인 로그에 있는 계획 출력으로 직접 이동됩니다.

    테라폼 계획 로그