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パッケージ・インストールの場合:
-
/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タスクの回避策を使うことができます:
- GitLabRailsコンソールを開きます。
-
以下のコマンドを実行してください:
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
セルフコンパイルインストールの場合。
以下の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" # 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 を再起動すると、変更が有効になります。
- 既存のローカル状態をオブジェクトストレージにマイグレーションします。