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 상태에 액세스하는 모든 CI/CD 작업은 다음 오류로 실패합니다.

      오류 refreshing state: HTTP 원격 상태 엔드포인트가 유효하지 않습니다
    

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

객체 저장소로 마이그레이션

경고: 객체 저장소에서 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 레일즈 콘솔을 엽니다.
  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 "마이그레이션 중: #{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을 사용하세요.

아래 쿼리로 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'
    }
    

    참고: 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 <프로젝트_아이디>를 실행합니다.

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

상대 경로가 표시됩니다.