Terraform国家管理

GitLab 12.10で導入されました

GitLabはTerraformのステートファイルのバックエンドとして利用できます。ファイルは暗号化されて保存されます。この機能はデフォルトで有効になっています。

これらのファイルの保存場所はデフォルトで

  • /var/opt/gitlab/gitlab-rails/shared/terraform_state Linux パッケージインストール用。
  • /home/git/gitlab/shared/terraform_state セルフコンパイルインストールの場合。

これらの場所は、以下に説明するオプションを使用して設定できます。

GitLab Helmチャートのインストールには外部オブジェクトストレージ設定を使用します。

Terraformステートの無効化

インスタンス全体でTerraformの状態を無効にすることができます。Terraformを無効にしてディスク容量を減らしたい場合や、インスタンスがTerraformを使用していない場合などが考えられます。

Terraformの状態管理を無効にした場合:

  • 左サイドバーで、Operate > Terraform statesを選択できません。
  • 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 を再起動すると、変更が有効になります。

オブジェクトストレージを使う

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

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

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

以下の設定があります:

  • Linux パッケージインストールでは、terraform_state_object_store_ がプレフィックスとなります。
  • terraform_state: の下にネストされ、セルフコンパイル・インストールではobject_store: の下にネストされます。
設定説明デフォルト
enabledオブジェクトストレージの有効化/無効化false
remote_directoryTerraformの状態ファイルを保存するバケット名 
connection以下に説明するさまざまな接続オプション 

オブジェクトストレージへのマイグレーション

GitLab 13.9 で導入されました

caution
Terraformのステートファイルをオブジェクトストレージからローカルストレージにマイグレーションすることはできません。この動作を変更するイシューが存在します。

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タスクの回避策を使うことができます:

  1. GitLabRailsコンソールを開きます。
  2. 以下のコマンドを実行してください:

    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
    

オプションで、PostgreSQLコンソールを使って進捗を追跡し、すべてのTerraform状態ファイルが正常にマイグレーションされたことを確認できます:

  • sudo gitlab-rails dbconsole GitLab 14.1以前を実行しているLinuxパッケージインストールの場合。
  • sudo gitlab-rails dbconsole --database main GitLab 14.2 以降を実行している Linux パッケージインストール用。
  • 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互換接続設定

GitLab 13.2以降では、統合オブジェクトストレージ設定を使用する必要があります。このセクションでは、以前の設定フォーマットについて説明します。

各プロバイダーで利用可能な接続設定を参照してください。

Linux package (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 (source)
  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. 既存のローカル状態をオブジェクトストレージにマイグレーションします。