Terraform 상태 관리

Tier: Free, Premium, Ultimate Offering: Self-managed

GitLab은 Terraform 상태 파일의 백엔드로 사용될 수 있습니다.
파일은 저장하기 전에 암호화됩니다. 이 기능은 기본적으로 활성화되어 있습니다.

이 파일의 저장 위치는 기본적으로 다음과 같습니다:

  • 리눅스 패키지 설치의 경우 /var/opt/gitlab/gitlab-rails/shared/terraform_state.
  • 직접 컴파일한 설치의 경우 /home/git/gitlab/shared/terraform_state.

이러한 위치는 아래에 설명된 옵션을 사용하여 구성할 수 있습니다.

GitLab Helm 차트 설치에서 외부 객체 저장소 구성을 사용하십시오.

Terraform 상태 비활성화

전체 인스턴스에서 Terraform 상태를 비활성화할 수 있습니다. 디스크 공간을 줄이기 위해 Terraform을 비활성화하거나
인스턴스에서 Terraform을 사용하지 않는 경우 Terraform을 비활성화할 수 있습니다.

Terraform 상태 관리를 비활성화하면:

  • 왼쪽 사이드바에서 Operate > Terraform states를 선택할 수 없습니다.
  • Terraform 상태에 액세스하는 모든 CI/CD 작업이 다음과 같은 오류와 함께 실패합니다:

    Error refreshing state: HTTP remote state endpoint invalid auth  
    

Terraform 관리를 비활성화하려면 설치에 따라 아래 단계를 따르십시오.

사전 요구 사항:

  • 관리자여야 합니다.

리눅스 패키지 설치의 경우:

  1. /etc/gitlab/gitlab.rb를 편집하고 다음 행을 추가합니다:

    gitlab_rails['terraform_state_enabled'] = false  
    
  2. 파일을 저장하고 GitLab 재구성하기 변경 사항을 적용합니다.

직접 컴파일한 설치의 경우:

  1. /home/git/gitlab/config/gitlab.yml를 편집하고 다음 행을 추가하거나 수정합니다:

    terraform_state:  
      enabled: false  
    
  2. 파일을 저장하고 GitLab 재시작하기 변경 사항을 적용합니다.

로컬 스토리지 사용

기본 구성은 로컬 스토리지를 사용합니다. Terraform 상태 파일이 로컬에 저장되는 위치를 변경하려면
아래 단계를 따르십시오.

리눅스 패키지 설치의 경우:

  1. 저장 경로를 /mnt/storage/terraform_state로 변경하려면
    /etc/gitlab/gitlab.rb를 편집하고 다음 행을 추가합니다:

    gitlab_rails['terraform_state_storage_path'] = "/mnt/storage/terraform_state"  
    
  2. 파일을 저장하고 GitLab 재구성하기 변경 사항을 적용합니다.

직접 컴파일한 설치의 경우:

  1. 저장 경로를 /mnt/storage/terraform_state로 변경하려면
    /home/git/gitlab/config/gitlab.yml를 편집하고 다음 행을 추가하거나 수정합니다:

    terraform_state:  
      enabled: true  
      storage_path: /mnt/storage/terraform_state  
    
  2. 파일을 저장하고 GitLab 재시작하기 변경 사항을 적용합니다.

객체 저장소 사용

Tier: Free, Premium, Ultimate Offering: Self-managed

Terraform 상태 파일을 디스크에 저장하는 대신,
지원되는 객체 저장소 옵션 중 하나의 사용을 권장합니다.
이 구성은 이미 유효한 자격 증명이 구성되어 있어야 합니다.

GitLab과 함께 객체 저장소 사용에 대해 자세히 알아보세요.

오브젝트 스토리지 설정

다음 설정이 있습니다:

  • Linux 패키지 설치 시 terraform_state_object_store_로 접두사 붙음.
  • 자체 컴파일된 설치 시 terraform_state: 아래 object_store:에 중첩됨.
설정 설명 기본값
enabled 오브젝트 스토리지 사용/중지 false
remote_directory Terraform 상태 파일이 저장되는 버킷 이름  
connection 아래에 설명된 다양한 연결 옵션  

오브젝트 스토리지로 마이그레이션

경고:

오브젝트 스토리지에서 로컬 스토리지로 Terraform 상태 파일을 마이그레이션하는 것은 불가능하므로 주의해서 진행하세요. 문제가 존재합니다 이 동작을 변경하기 위해.

Terraform 상태 파일을 오브젝트 스토리지로 마이그레이션하려면:

  • Linux 패키지 설치의 경우:

    gitlab-rake gitlab:terraform_states:migrate
    
  • 자체 컴파일된 설치의 경우:

    sudo -u git -H bundle exec rake gitlab:terraform_states:migrate RAILS_ENV=production
    

진행 상황을 추적하고 모든 Terraform 상태 파일이 성공적으로 마이그레이션되었는지 확인하려면 PostgreSQL 콘솔을 사용할 수 있습니다:

  • Linux 패키지 설치의 경우 sudo gitlab-rails dbconsole --database main.
  • 자체 컴파일된 설치의 경우 sudo -u git -H psql -d gitlabhq_production.

objectstg가 아래와 같이 (여기서 file_store=2) 모든 상태의 수를 가지고 있는지 확인하세요:

gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM terraform_state_versions;

total | filesystem | objectstg
------+------------+-----------
   15 |          0 |      15

terraform_state 폴더에 디스크상의 파일이 없는지 확인하세요:

sudo find /var/opt/gitlab/gitlab-rails/shared/terraform_state -type f | grep -v tmp | wc -l

S3 호환 연결 설정

통합 오브젝트 스토리지 설정을 사용하는 것이 좋습니다. 이 섹션은 이전 구성 형식을 설명합니다.

다양한 공급자를 위한 사용 가능한 연결 설정을 참조하세요.

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb를 편집하고 다음 줄을 추가하세요; 원하는 값으로 교체:

    gitlab_rails['terraform_state_object_store_enabled'] = true
    gitlab_rails['terraform_state_object_store_remote_directory'] = "terraform"
    gitlab_rails['terraform_state_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
      'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
    }
    

    참고: AWS IAM 프로필을 사용하는 경우, AWS 액세스 키와 비밀 액세스 키/값 쌍을 생략해야 합니다.

    gitlab_rails['terraform_state_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'use_iam_profile' => true
    }
    
  2. 파일을 저장하고 GitLab 재구성을 통해 변경 사항을 적용합니다.
  3. 기존 로컬 상태를 오브젝트 스토리지로 마이그레이션하세요
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml를 편집하고 다음 줄을 추가하거나 수정하세요:

    terraform_state:
      enabled: true
      object_store:
        enabled: true
        remote_directory: "terraform" # 버킷 이름
        connection:
          provider: AWS # 현재 AWS만 지원됨
          aws_access_key_id: AWS_ACCESS_KEY_ID
          aws_secret_access_key: AWS_SECRET_ACCESS_KEY
          region: eu-central-1
    
  2. 파일을 저장하고 GitLab 재시작을 통해 변경 사항을 적용합니다.
  3. 기존 로컬 상태를 오브젝트 스토리지로 마이그레이션하세요

Terraform 상태 파일 경로 찾기

Terraform 상태 파일은 관련 프로젝트의 해싱된 디렉토리 경로에 저장됩니다.

경로의 형식은 /var/opt/gitlab/gitlab-rails/shared/terraform_state/<path>/<to>/<projectHashDirectory>/<UUID>/0.tfstate이며, UUID는 임의로 정의됩니다.

상태 파일 경로를 찾으려면:

  1. 셸에 get-terraform-path를 추가하세요:

    get-terraform-path() {
        PROJECT_HASH=$(echo -n $1 | openssl dgst -sha256 | sed 's/^.* //')
        echo "${PROJECT_HASH:0:2}/${PROJECT_HASH:2:2}/${PROJECT_HASH}"
    }
    
  2. get-terraform-path <project_id>를 실행하세요.

    $ get-terraform-path 650
    20/99/2099a9b5f777e242d1f9e19d27e232cc71e2fa7964fc988a319fce5671ca7f73
    

상대 경로가 표시됩니다.