Terraform 상태 관리
- GitLab 12.10에서 소개됨.
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 패키지 설치의 경우:
-
/etc/gitlab/gitlab.rb
를 편집하고 다음 행을 추가하세요:gitlab_rails['terraform_state_enabled'] = false
-
변경 사항이 적용되려면 파일을 저장하고 GitLab 다시 구성을 수행하세요.
자체 컴파일된 설치의 경우:
-
/home/git/gitlab/config/gitlab.yml
를 편집하고 다음 행을 추가 또는 수정하세요:terraform_state: enabled: false
-
변경 사항이 적용되려면 파일을 저장하고 GitLab 다시 시작을 수행하세요.
로컬 리포지터리 사용
기본 구성은 로컬 리포지터리를 사용합니다. 로컬로 Terraform 상태 파일을 저장하는 위치를 변경하려면 아래 단계를 따르세요.
Linux 패키지 설치의 경우:
-
리포지터리 경로를
/mnt/storage/terraform_state
로 변경하려면,/etc/gitlab/gitlab.rb
를 편집하고 다음 행을 추가하세요:gitlab_rails['terraform_state_storage_path'] = "/mnt/storage/terraform_state"
-
변경 사항이 적용되려면 파일을 저장하고 GitLab 다시 구성을 수행하세요.
자체 컴파일된 설치의 경우:
-
리포지터리 경로를
/mnt/storage/terraform_state
로 변경하려면,/home/git/gitlab/config/gitlab.yml
를 편집하고 다음 행을 추가 또는 수정하세요:terraform_state: enabled: true storage_path: /mnt/storage/terraform_state
-
변경 사항이 적용되려면 파일을 저장하고 GitLab 다시 시작을 수행하세요.
객체 리포지터리 사용
디스크에 Terraform 상태 파일을 저장하는 대신, 지원되는 객체 리포지터리 옵션 중 하나를 사용하는 것을 권장합니다. 이 구성은 이미 유효한 자격 증명이 구성되어 있을 것으로 의존합니다.
GitLab과 함께 객체 리포지터리 사용에 대해 더 알아보기.
객체 리포지터리 설정
다음 설정은:
- Linux 패키지 설치에서는
terraform_state_object_store_
로 접두어가 붙습니다. - 자체 컴파일된 설치에서는
terraform_state:
그리고object_store:
하위에 중첩됩니다.
설정 | 설명 | 기본값 |
---|---|---|
enabled
| 객체 리포지터리 활성화/비활성화 | false
|
remote_directory
| Terraform 상태 파일이 저장되는 버킷 이름 | |
connection
| 아래에 설명된 다양한 연결 옵션 |
객체 리포지터리로 이관
- GitLab 13.9에서 소개됨.
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 작업에 대한 해결책을 사용할 수 있습니다:
- GitLab Rails 콘솔을 엽니다.
-
다음 명령을 실행합니다:
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 이상에서는 통합 객체 리포지터리 설정을 사용해야 합니다. 해당 섹션은 이전 구성 형식을 설명합니다.
다양한 제공업체에 대한 연결 설정은 여기에서 확인하세요.
-
/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 <project_id>
를 실행합니다.$ get-terraform-path 650 20/99/2099a9b5f777e242d1f9e19d27e232cc71e2fa7964fc988a319fce5671ca7f73
상대 경로가 표시됩니다.