GCP入門: Terraformの状態管理 -Vol.2-

スポンサーリンク
GCP入門: Terraformの状態管理 -Vol.2- ノウハウ
GCP入門: Terraformの状態管理 -Vol.2-
この記事は約8分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Terraformでの状態管理について解説しています。

スポンサーリンク

背景

下記の記事の続きになります。

実施内容

main.tfを下記の内容に編集します。

main.tf

provider "google" {
  project     = "プロジェクトID"
  region      = "REGION"
}

resource "google_storage_bucket" "test-bucket-for-state" {
  name        = "プロジェクトID"
  location    = "US"
  uniform_bucket_level_access = true
}

terraform {
  backend "gcs" {
    bucket  = "バケット名"
    prefix  = "terraform/state"
  }
}

更新後に下記のコマンドを実施します。

terraform init -migrate-state

下記の画面が表示されたら、yesと入力します。

% terraform init -migrate-state        
Initializing the backend...
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "local" backend to the
  newly configured "gcs" backend. No existing state was found in the newly
  configured "gcs" backend. Do you want to copy this state to the new "gcs"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: 

下記のような出力になれば成功です。

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

解説

main.tf

このコードは、Google Cloud Platform (GCP) を使用してTerraformの状態を管理するための設定です。以下に各部分の詳細な説明を提供します:

  1. Google Cloudプロバイダの設定:
provider "google" {
  project     = "プロジェクトID"
  region      = "REGION"
}
  • project: GCPプロジェクトIDを 任意の値に書き換える必要があります。
  • region: リージョンが “REGION” と設定されていますが、これは実際のリージョン(例:us-central1)に置き換える必要があります。
  1. Google Cloud Storageバケットの作成:
resource "google_storage_bucket" "test-bucket-for-state" {
  name        = "バケット名"
  location    = "US"
  uniform_bucket_level_access = true
}
  • name: バケット名を 任意の値に書き換える必要があります。
  • location: バケットの場所を “US” (アメリカ合衆国)に設定しています。
  • uniform_bucket_level_access: バケットレベルでの一様なアクセス制御を有効にしています。
  1. Terraformバックエンドの設定:
terraform {
  backend "gcs" {
    bucket  = "バケット名"
    prefix  = "terraform/state"
  }
}
  • backend "gcs": Google Cloud Storage (GCS) をバックエンドとして使用することを指定しています。
  • bucket: 状態ファイルを保存するバケット名(google_storage_bucket.test-bucket-for-stateのバケット名)を設定します。
  • prefix: バケット内での状態ファイルの保存先プレフィックスを “terraform/state” に設定しています。

このコードは、ローカルバックエンドではなくGCSバックエンドを使用するように変更されています。これにより、チーム開発やより大規模なプロジェクトに適した構成となっています。

注意点:

  1. プロジェクトID、バケット名、リージョンは、実際の使用時には適切な値に置き換える必要があります。
  2. GCSバックエンドを使用するには、適切な権限設定が必要です。
  3. バケット名はグローバルで一意である必要があります。

terraform init -migrate-state

terraform init -migrate-state コマンドについて説明します。

  1. 基本的な機能:
    このコマンドは、Terraformの初期化を行いながら、既存の状態を新しいバックエンド設定に移行するために使用されます。
  2. 主な用途:
  • バックエンド設定を変更した際に、既存の状態ファイルを新しいバックエンドに移行する。
  • 例えば、ローカルバックエンドからリモートバックエンド(GCS、S3など)に移行する場合。
  1. プロセス:
    a. 新しいバックエンド設定を検出
    b. 既存の状態ファイルの場所を確認
    c. ユーザーに移行の確認を求める
    d. 確認後、状態を新しいバックエンドに移行
  2. オプションの意味:
  • init: Terraformの初期化を行う
  • -migrate-state: 状態の移行を行うオプション
  1. 注意点:
  • このコマンドを実行する前に、新しいバックエンド設定が正しく構成されていることを確認する必要があります。
  • 移行プロセス中にエラーが発生した場合、元の状態ファイルは保持されます。
  • 重要なデータを扱うため、実行前にバックアップを取ることをおすすめします。
  1. 使用例:
   # バックエンド設定を変更した後
   terraform init -migrate-state
  1. メリット:
  • 手動での状態ファイルの移行よりも安全で効率的
  • Terraformが移行プロセスを管理するため、ヒューマンエラーのリスクが低減
  1. 補足:
  • このコマンドは対話式で実行されるため、移行の確認を求められます。
  • 非対話式で実行する場合は -force-copy オプションを追加できますが、注意が必要です。

このコマンドは、Terraformのバックエンド設定を変更する際に非常に有用ですが、重要なデータを扱うため、慎重に使用する必要があります。

トラブルシューティング

`terraform init -migrate-state` 実施時に、下記のようなエラーが発生しました。

% terraform init -migrate-state
Initializing the backend...
╷
│ Error: Error inspecting states in the "local" backend:
│     querying Cloud Storage failed: googleapi: Error 400: User project specified in the request is invalid., invalid
│ 
│ Prior to changing backends, Terraform inspects the source and destination
│ states to determine what kind of migration steps need to be taken, if any.
│ Terraform failed to load the states. The data in both the source and the
│ destination remain unmodified. Please resolve the above error and try again.

次のコマンドを実行して、再度、`terraform init -migrate-state`を実施することで解消ができました。

gcloud auth application-default login

おわりに

今日は、Terraformでの状態管理について解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました