Articles

Terraform Cloudへの状態の移行

Posted by admin

Terraform CLIの現在のユーザーは、状態ファイルをクラウドインフラストラクチャの真実のソースとして維持する責任があります。 既存のインフラストラクチャを中断または再作成することなく、ローカル状態ファイルをTerraform Cloudに移行できます。

警告:このチュートリアルの手順を使用して状態ファイルをTerraform Cloudにアップロードする場合は、リソースの作成に使用したTerraform CLIと同じバージョンを常に使用し 新しいバージョンのTerraformを使用すると、状態ファイルが更新され、状態ファイルが破損する可能性があります。

“前提条件

このチュートリアルでは、次のことを前提としています:

  • ローカルにインストールされたTerraform CLI
  • Terraformクラウドアカウント

注:remoteバックエンドはTerraformの古いバージョンではサポートされていなかったため、状態をTerraform Cloudに移行するには0.11.13以上を使用する必要があります。 このチュートリアルのスニペットでは、0.12構文を使用します。

Terraformがローカルにインストールされていない場合は、webブラウザから対話型ラボでこのチュートリアルを完了できます。 ここで起動します。

“状態の作成

このGitHubリポジトリを複製することから始めます。

$ git clone https://github.com/hashicorp/learn-state-migration

コピー

次に、ディレクトリに変更します。

$ cd learn-state-migration

コピー

作業ディレクトリ内のmain.tfファイルを確認して、作成しようとしているリソースの概要を取得します。 この構成では、random_petリソースを使用して、指定された単語数のランダムなペット名を生成して出力します。 名前の長さは、name_length変数の値によって決定され、デフォルトは3です。

実際の構成では、.tfvarsファイルで定義されたcloud platform credentialsなどの追加の変数がある場合があります。 このチュートリアルの後半では、状態ファイルを移行した後に、Terraform Cloudワークスペースでこれらの値を設定する方法について説明します。

## Terraform configurationterraform { required_providers { random = { source = "hashicorp/random" version = "3.0.1" } } required_version = "~> 0.14"}variable "name_length" { description = "The number of words in the pet name" default = "3"}resource "random_pet" "pet_name" { length = var.name_length separator = "-"}output "pet_name" { value = random_pet.pet_name.id}

コピー

ディレクトリを初期化します。

$ terraform init

コピー

Terraformの初期化後、設定を適用し、プロンプトで”yes”と入力して実行を承認します。

$ terraform apply

コピー

Terraformは、ランダムに生成されたペット名を三つの単語を出力します。

“リモートバックエンドの設定

ローカル状態ファイルがあるので、構成にバックエンドコードブロックを作成する必要があります。 バックエンドは、状態ファイルをロードして保存する場所をTerraformに指示します。

設定でバックエンドコードブロックを明示的に定義しない場合、Terraformはデフォルトでローカルバックエンドを使用します。 ローカルバックエンドは、状態をterraform.tfstateファイルとしてterraform applyを実行するディレクトリに保存します。 状態ファイルをTerraform Cloudに移行するには、main.tfファイルの先頭に新しいコードブロックを追加して、構成でremoteバックエンドを定義します。

terraform { required_providers { random = { source = "hashicorp/random" version = "3.0.1" } } required_version = "~> 0.14" backend "remote" { hostname = "app.terraform.io" organization = "<YOUR-ORG-NAME>" workspaces { name = "state-migration" } }}

コピー

organizationおよびworkspaces属性値を、Terraform Cloud組織の名前と目的のワークスペース名に置き換えます。 バックエンド-スタンザで定義されている組織はすでに存在している必要がありますが、ワークスペースは必要ありません。 すでに存在するワークスペースを使用する場合は、ワークスペースに既存の状態があってはなりません。

注:CLIを使用したTerraformの実行に精通している場合は、Terraformワークスペースを使用している可能性があります。 Terraform Cloud workspacesの動作は、Terraform CLI workspacesとは異なります。 Terraform CLIワークスペースでは、単一のディレクトリ内に複数の状態ファイルを存在させることができ、複数の環境に対して一つの設定を使用できます。 Terraform Cloudワークスペースには、特定のインフラストラクチャのセットを管理するために必要なすべてが含まれており、別々の作業ディレ

“Terraform Cloudで認証

バックエンドを定義したので、初期化を続行するにはTerraform Cloudで認証する必要があります。 Terraform Cloudで認証するには、terraform loginサブコマンドを実行し、プロンプトに従ってログインします。

注:0.12.21より前のバージョンのTerraformを使用している場合、terraform loginコマンドは使用できません。 代わりに、認証するCLI設定ファイルを設定します。

$ terraform loginTerraform will request an API token for app.terraform.io using your browser.If login is successful, Terraform will store the token in plain text inthe following file for use by subsequent commands: /Users/username/.terraform.d/credentials.tfrc.jsonDo you want to proceed? Only 'yes' will be accepted to confirm. Enter a value:

コピー

確認プロンプトにyesで応答します。

ログインの詳細については、login tutorialを参照してください。

“状態ファイルの移行

remoteバックエンドを認証したら、ローカル状態ファイルをTerraform Cloudに移行する準備が整いました。 移行を開始するには、再初期化します。 これにより、Terraformは変更されたバックエンド設定を認識します。

$ terraform initInitializing 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 "remote" backend. No existing state was found in the newly configured "remote" backend. Do you want to copy this state to the new "remote" backend? Enter "yes" to copy and "no" to start with an empty state. Enter a value:

コピー

再初期化中に、Terraformは状態ファイルを新しいバックエンドにコピーすることを示すプロンプトを表示します。 yesと入力すると、TerraformはローカルマシンからTerraform Cloudに状態を移行します。

“Terraform Cloudワークスペースの設定

状態をTerraform Cloudに移行した後、Terraform Cloud web UIにログインし、バックエンド設定で定義されているワークスペース名を見つけてクリックします。 ワークスペースの”状態”タブに移動し、ワークスペース内の最初のアクションを確認します。

Terraform Cloudワークスペースの"状態"タブのビュー

構成には、newworkspaceに追加する必要がある変数があることに注意してください。 ワークスペースの”変数”タブをクリックし、”変数の追加”をクリックします。変数の名前name_lengthをキーとして入力します。 次に、newvalue5を入力し、変数を保存します。

Terraform Cloudワークスペースの変数タブに変数が追加されました

実際の設定の場合は、cloud platformの資格情報やその他の設定変数もワークスペースに追加します。

“新しいワークスペースで実行を開始

状態がTerraform Cloudワークスペースに移行されたことを確認した後、ローカル状態ファイルを削除します。

$ rm terraform.tfstate

コピー

新しい実行を適用します。

$ terraform apply

コピー

TerraformはTerraform Cloudからログをストリーミングし、Terraform Cloud UIで実行へのリンクを提供します。 name_length変数に新しい値を設定すると、リソースは新しいパラメータに一致するものに置き換えられます。

実行待ちの確認の画像は、リソースが置き換えられることをログに記載しています

“次の手順

このチュートリアルのために作成したリソースを破棄するには、まずTerraform Cloudワークスペースの”設定”オプションをクリックし、”破棄と削除”を選択し、”計画の破棄を許可する”チェックボックスがチェックされていることを確認し、次に”キュー破棄計画”をクリックします。

リソースが破棄された後、”Destruction andDeletion”ページに戻り、”Terraform Cloudから削除”をクリックしてワークスペースを削除します。

このチュートリアルでは、ローカルマシンからTerraform Cloudワークスペースに状態ファイルを移行しました。 複数のローカルワークスペースの状態ファイルを移行する方法、またはワークスペースへのアクセスを特定のチームに制限する方法については、次のドキ

  • 複数のローカルワークスペースからの状態の移行
  • ワークスペースアクセスの管理

Terraform Cloudに移行する状態ファイルが多数ある場合は、Terraform Cloud APIを使用して移行 APIを使用して状態バージョンをアップロードする方法については、状態バージョンAPIのドキュメントを参照してください。

Related Post