Terraform 상태 관리
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 관리를 비활성화하려면 설치에 따라 아래 단계를 따르세요.
전제 조건:
- 관리자여야 합니다.
리눅스 패키지 설치의 경우:
-
/etc/gitlab/gitlab.rb
파일을 편집하고 다음 라인을 추가합니다:gitlab_rails['terraform_state_enabled'] = false
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.
Self-Compiled 설치의 경우:
-
/home/git/gitlab/config/gitlab.yml
파일을 편집하고 다음 라인을 추가하거나 수정합니다:terraform_state: enabled: false
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.
로컬 리포지터리 사용
기본 구성은 로컬 리포지터리를 사용합니다. 로컬로 Terraform 상태 파일을 저장하는 위치를 변경하려면 아래 단계를 따르세요.
리눅스 패키지 설치의 경우:
-
저장 위치를
/mnt/storage/terraform_state
로 변경하려면/etc/gitlab/gitlab.rb
파일을 편집하고 다음 라인을 추가합니다:gitlab_rails['terraform_state_storage_path'] = "/mnt/storage/terraform_state"
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.
Self-Compiled 설치의 경우:
-
저장 위치를
/mnt/storage/terraform_state
로 변경하려면/home/git/gitlab/config/gitlab.yml
파일을 편집하고 다음 라인을 추가하거나 수정합니다:terraform_state: enabled: true storage_path: /mnt/storage/terraform_state
-
파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.
객체 리포지터리 사용
Terraform 상태 파일을 디스크에 저장하는 대신, 지원되는 객체 리포지터리 옵션 중 하나을 사용하는 것을 권장합니다. 이 구성은 이미 유효한 자격 증명이 구성되어 있어야 합니다.
GitLab과 객체 리포지터리를 사용한 추가 정보는 여기에서 확인하세요.
객체 리포지터리 설정
다음 설정은 리눅스 패키지 설치에서는 terraform_state_object_store_
로 시작하고, Self-Compiled 설치에서는 terraform_state:
아래에 object_store:
로 중첩됩니다.
설정 | 설명 | 기본값 |
---|---|---|
enabled
| 객체 리포지터리 사용 여부 | false
|
remote_directory
| Terraform 상태 파일이 저장된 버킷 이름 | |
connection
| 아래에 설명된 다양한 연결 옵션 |
객체 리포지터리로 마이그레이션
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 호환 연결 설정
각각의 공급자에 대한 사용 가능한 연결 설정을 참조하세요.
-
/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 }
- 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재구성합니다.
- 이전의 로컬 상태를 객체 리포지터리로 마이그레이션합니다.
-
/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
- 파일을 저장하고 변경 사항이 적용되도록 GitLab을 재시작합니다.
- 이전의 로컬 상태를 객체 리포지터리로 마이그레이션합니다.
Terraform 상태 파일 경로 찾기
Terraform 상태 파일은 관련 프로젝트의 해시화된 디렉터리 경로에 저장됩니다.
경로의 형식은 /var/opt/gitlab/gitlab-rails/shared/terraform_state/<path>/<to>/<projectHashDirectory>/<UUID>/0.tfstate
이며, UUID는 임의로 정의됩니다.
상태 파일 경로를 찾으려면:
-
쉘에
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}" }
-
get-terraform-path <프로젝트_id>
를 실행하세요.$ get-terraform-path 650 20/99/2099a9b5f777e242d1f9e19d27e232cc71e2fa7964fc988a319fce5671ca7f73
상대 경로가 표시됩니다.