Terraform 상태 관리

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

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

이러한 파일의 저장 위치는 다음과 같이 기본값으로 설정됩니다.

  • 리눅스 패키지 설치의 경우 /var/opt/gitlab/gitlab-rails/shared/terraform_state
  • Self-Compiled 설치의 경우 /home/git/gitlab/shared/terraform_state

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

GitLab Helm 차트 설치를 위해 외부 객체 리포지터리 구성을 사용합니다.

Terraform 상태 비활성화

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

Terraform 상태 관리가 비활성화된 경우:

  • 왼쪽 사이드바에서 운영 > Terraform state를 선택할 수 없습니다.
  • 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을 재구성합니다.

Self-Compiled 설치의 경우:

  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을 재구성합니다.

Self-Compiled 설치의 경우:

  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과 객체 리포지터리를 사용한 추가 정보는 여기에서 확인하세요.

객체 리포지터리 설정

다음 설정은 리눅스 패키지 설치에서는 terraform_state_object_store_로 시작하고, Self-Compiled 설치에서는 terraform_state: 아래에 object_store:로 중첩됩니다.

설정 설명 기본값
enabled 객체 리포지터리 사용 여부 false
remote_directory Terraform 상태 파일이 저장된 버킷 이름  
connection 아래에 설명된 다양한 연결 옵션  

객체 리포지터리로 마이그레이션

caution
Terraform 상태 파일을 객체 리포지터리에서 로컬 리포지터리로 마이그레이션하는 것은 불가능합니다. 따라서 주의해서 진행하세요. 관련 이슈가 있습니다.

Terraform 상태 파일을 객체 리포지터리로 마이그레이션하려면:

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

    gitlab-rake gitlab:terraform_states:migrate
    
  • Self-Compiled 설치의 경우:

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

모든 Terraform 상태 파일이 성공적으로 마이그레이션되었는지 확인하고 진행 상황을 선택적으로 추적할 수 있습니다. PostgreSQL 콘솔을 사용하여 아래 명령어로 확인할 수 있습니다.

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

  • sudo gitlab-rails dbconsole --database main Self-Compiled 설치의 경우:

  • 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 호환 연결 설정

각각의 공급자에 대한 사용 가능한 연결 설정을 참조하세요.

리눅스 패키지 (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. 이전의 로컬 상태를 객체 리포지터리로 마이그레이션합니다.
Self-Compiled (소스)
  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 <프로젝트_id>를 실행하세요.

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

상대 경로가 표시됩니다.