Terraform 상태 관리

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

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

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

  • Linux 패키지 설치의 경우 /var/opt/gitlab/gitlab-rails/shared/terraform_state
  • 자체 컴파일된 설치의 경우 /home/git/gitlab/shared/terraform_state

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

GitLab Helm 차트 설치에 대해 외부 객체 리포지터리 구성 사용.

Terraform 상태 비활성화

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

Terraform 상태 관리가 비활성화되면:

  • 좌측 사이드바에서 운영 > Terraform 상태를 선택할 수 없습니다.
  • Terraform 상태에 접근하는 모든 CI/CD 작업은 다음 오류로 실패합니다:

      Error refreshing state: HTTP remote state endpoint invalid auth
    

Terraform 관리를 비활성화하려면 설치 방법에 따라 아래 단계를 따르세요.

전제 조건:

  • 관리자여야 합니다.

Linux 패키지 설치의 경우:

  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 상태 파일을 저장하는 위치를 변경하려면 아래 단계를 따르세요.

Linux 패키지 설치의 경우:

  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 아래에 설명된 다양한 연결 옵션  

객체 리포지터리로 이관

caution
객체 리포지터리에서 Terraform 상태 파일을 디스크로 다시 이관하는 것은 불가능합니다. 따라서 신중하게 진행하십시오. 해당 동작을 변경하는 이슈가 있습니다.

Terraform 상태 파일을 객체 리포지터리로 이관하려면:

  • Linux 패키지 설치의 경우:

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

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

GitLab 13.8 및 이전 버전의 경우, Rake 작업에 대한 해결책을 사용할 수 있습니다:

  1. GitLab Rails 콘솔을 엽니다.
  2. 다음 명령을 실행합니다:

    Terraform::StateUploader.alias_method(:upload, :model)
       
    Terraform::StateVersion.where(file_store: ::ObjectStorage::Store::LOCAL).   find_each(batch_size: 10) do |terraform_state_version|
      puts "Migrating: #{terraform_state_version.inspect}"
         
      terraform_state_version.file.migrate!(::ObjectStorage::Store::REMOTE)
    end
    

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

  • GitLab 14.1 이전 버전을 실행 중인 Linux 패키지 설치의 경우 sudo gitlab-rails dbconsole.
  • GitLab 14.2 이상 버전을 실행 중인 Linux 패키지 설치의 경우 sudo gitlab-rails dbconsole --database main.
  • 자체 컴파일된 설치의 경우 sudo -u git -H psql -d gitlabhq_production.

아래 SQL을 사용하여 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 호환 연결 설정

GitLab 13.2 이상에서는 통합 객체 리포지터리 설정을 사용해야 합니다. 해당 섹션은 이전 구성 형식을 설명합니다.

다양한 제공업체에 대한 연결 설정은 여기에서 확인하세요.

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'
    }
    
    note
    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
    

상대 경로가 표시됩니다.