Terraformステート管理
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab 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パッケージインストールの場合:
/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を再起動し、変更を有効にします。
オブジェクトストレージを使用する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab 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
オプションで、PostgreSQLコンソールを使用して、すべてのTerraformのステートファイルが正常に移行されたことを追跡し、確認できます:
- 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 -lS3互換接続設定
統合されたオブジェクトストレージ設定を使用する必要があります。このセクションでは、以前の設定形式について説明します。
プロバイダーごとの使用可能な接続設定を参照してください。
/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" # The bucket name connection: provider: AWS # Only AWS supported at the moment 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をShellに追加します: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
相対パスが表示されます。
バックアップからTerraformのステートファイルを復元する
バックアップからTerraformのステートファイルを復元するには、暗号化されたステートファイルとGitLabデータベースへのアクセス権が必要です。
データベーステーブル
次のデータベーステーブルは、S3パスを特定のプロジェクトに追跡するのに役立ちます:
terraform_states: 各ステートのユニバーサル一意識別子(UUID)を含む、基本ステート情報が含まれています。
ファイル構造とパスの構成
ステートファイルは特定のディレクトリ構造に保存されます。ここで:
- パスの最初の3つのセグメントは、プロジェクトIDのSHA-2ハッシュ値から派生しています。
- 各ステートには、
terraform_statesデータベーステーブルに保存されているUUIDがあり、パスの一部を形成します。
たとえば、次のようなプロジェクトの場合:
- プロジェクトIDは
12345です - ステートUUIDは
example-uuidです
12345のSHA-2ハッシュ値が5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5の場合、フォルダー構造は次のようになります:
terraform/ <- configured Terraform storage directory
├─ 59/ <- first and second character of project ID hash
| ├─ 94/ <- third and fourth character of project ID hash
| | ├─ 5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5/ <- full project ID hash
| | | ├─ example-uuid/ <- state UUID
| | | | ├─ 1.tf <- individual state versions
| | | | ├─ 2.tf
| | | | ├─ 3.tf復号化プロセス
ステートファイルはLockboxを使用して暗号化されたおり、復号化には次の情報が必要です:
db_key_baseアプリケーションシークレット- プロジェクトID
暗号化キーは、db_key_baseとプロジェクトIDの両方から派生します。db_key_baseにアクセスできない場合、復号化はできません。
ファイルを手動で復号化する方法については、Lockboxのドキュメントを参照してください。
暗号化キーの生成プロセスを表示するには、ステートアップローダーコードを参照してください。