병합 요청에서 Terraform 통합

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

인프라스트럭처 코드(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 flag를 false로 설정해야 합니다(public: false). 이 설정은 artifact가 GitLab 관리자 및 Reporter 역할 이상의 프로젝트 구성원만 접근할 수 있도록 보장합니다.

Terraform 보고서 artifact 구성

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

자동으로 Terraform 보고서 artifact 구성

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

수동으로 Terraform 보고서 artifact 구성

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

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

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

    variables:
      PLAN: plan.cache
      PLAN_JSON: plan.json
    
  2. 가벼우며 유연한 명령줄 JSON 프로세서인 jq를 설치해야 합니다.

  3. terraform plan 출력에서 추출하려는 정보를 파싱하는 특정 jq 명령어에 대한 별칭을 만들어야 합니다.

    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 명령을 추가하여 별칭 확장을 명시적으로 활성화해야 합니다.

    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에 업로드되어 병합 요청에서 표시됩니다.

    plan:
      stage: build
      script:
        - terraform plan -out=$PLAN
        - terraform show --json $PLAN | convert_report > $PLAN_JSON
      artifacts:
        reports:
          terraform: $PLAN_JSON
    
  5. 파이프라인을 실행하면 병합 요청에 위젯이 표시됩니다. 다음과 같이 선택할 수 있습니다.

    병합 요청 Terraform 위젯

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

    Terraform 계획 로그