正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

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パッケージインストールの場合:

  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を再起動し、変更を有効にします。

オブジェクトストレージを使用する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

Terraformのステートファイルをディスクに保存する代わりに、サポートされているオブジェクトストレージオプションのいずれかを使用することをお勧めします。この設定は、有効な認証情報がすでに設定されていることを前提としています。

GitLabにおけるオブジェクトストレージの使用の詳細については、こちらをご覧ください

オブジェクトストレージ設定

次の設定があります:

  • Linuxパッケージインストールでは、プレフィックスとしてterraform_state_object_store_が付きます。
  • 自己コンパイルによるインストールでは、設定はterraform_state:の下のobject_store:にネストされます。
設定説明デフォルト
enabledオブジェクトストレージを有効または無効にします。false
remote_directoryTerraformのステートファイルが保存されているバケット名
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

以下のobjectstgfile_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互換接続設定

統合されたオブジェクトストレージ設定を使用する必要があります。このセクションでは、以前の設定形式について説明します。

プロバイダーごとの使用可能な接続設定を参照してください。

  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
}
  1. ファイルを保存して、GitLabを再設定し、変更を有効にします。
  2. オブジェクトストレージに既存のローカルステートを移行する
  1. /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
  2. ファイルを保存して、GitLabを再起動し、変更を有効にします。

  3. オブジェクトストレージに既存のローカルステートを移行する

Terraformステートファイルのパスを検索

Terraformのステートファイルは、関連するプロジェクトのハッシュされたディレクトリパスに保存されます。

パスの形式は/var/opt/gitlab/gitlab-rails/shared/terraform_state/<path>/<to>/<projectHashDirectory>/<UUID>/0.tfstateです。ここで、UUIDはランダムに定義されます。

ステートファイルのパスを見つけるには:

  1. 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}"
    }
  2. 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のドキュメントを参照してください。

暗号化キーの生成プロセスを表示するには、ステートアップローダーコードを参照してください。