Merge Request에서의 Terraform 통합

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

Infrastructure as Code(IaC) 변경 사항 주변의 협업은 코드 변경과 예상되는 인프라 변경을 확인하고 승인해야합니다. GitLab은 Merge Request 페이지를 사용하여 Terraform 코드 변경 및 그 예상 효과 주변의 협업을 지원하는 솔루션을 제공합니다. 이렇게 함으로써 사용자들은 IaC 워크플로우를 간소화시키기 위해 사용자 정의 도구를 만들거나 제3자 솔루션에 의존할 필요가 없습니다.

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

GitLab 테라폼 보고서 Artifact를 사용하면 terraform plan 실행에서 나온 세부 정보를 Merge Request 위젯에서 직접 확인할 수 있으며, 테라폼이 생성, 수정 또는 제거하는 리소스에 대한 통계를 볼 수 있습니다.

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

테라폼 보고서 artifact 구성

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

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

Terraform 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. 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)}'"
    
    note
    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를 실행하고 해당 출력을 파이프하여 관련 부분을 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. 위젯의 전체 로그 보기 버튼을 선택하면 파이프라인 로그에 표시된 계획 출력으로 직접 이동할 수 있습니다:

    테라폼 계획 로그