こんにちは。よっしーです(^^)
今日は、Terraformのstateをクラウドで管理する方法についてご紹介します。
背景
これまでは、ローカルマシンからインフラを構築し、変更し、破壊することができました。これはテストや開発には最適ですが、本番環境では状態を安全かつ暗号化しておき、チームメイトがインフラストラクチャの共同作業のためにアクセスできるようにしておく必要があります。これを実現する最善の方法は、リモート環境でTerraformを実行し、状態へのアクセス権を共有することです。
Terraform Cloudを使えば、チームはインフラの変更について簡単にバージョン管理、監査、共同作業を行うことができます。また、APIトークンやアクセスキーなどの変数を安全に保存し、長時間稼働するTerraformの処理に安全で安定した環境を提供します。
この記事では、ステートをTerraform Cloudに移行します。
事前準備
この記事は、前回の記事から継続していることを前提としています。前回の記事を参照していない方は、前回の記事を参照することをおすすめします。
AWSリソースの構築
まず、前回の記事で構築したAWSリソースを適用します。
cd learn-terraform-aws-instance
export AWS_ACCESS_KEY_ID=[Terraformを実行するIAMユーザーのアクセスキーを入力]
export AWS_SECRET_ACCESS_KEY=[Terraformを実行するIAMユーザーのシークレットキーを入力]
terraform init
terraform apply
Terraform は AWS EC2 インスタンスをプロビジョニングし、リソースに関するデータをローカルにstateファイルとして保存しました。
Terraform Cloudのセットアップ
HashiCorp Cloud PlatformまたはTerraform Cloudのアカウントをお持ちの場合は、既存の認証情報を使用してログインしてください。新規アカウントのサインアップと組織の作成方法の詳細については、Terraform Cloudのサインアップのチュートリアルをご覧ください。
次に、main.tfを修正してTerraformの構成にcloudブロックを追加し、organization-nameを組織名で置き換えます。赤字の内容を追記します。
terraform {
cloud {
organization = "organization-name(自身の組織名を入力)"
workspaces {
name = "learn-tfc-aws"
}
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
}
次に、ターミナルの Terraform CLI を使用して、Terraform Cloud アカウントにログインします。
terraform login
Yesで確認し、自動的に開くブラウザウィンドウでワークフローに従います。プロンプトが表示されたら、生成された API キーを Terminal に貼り付ける必要があります。ログインの詳細については、Terraform Cloudのチュートリアル「Authenticate the CLI with Terraform Cloud」に従ってください。
Terraform Cloud 統合の構成が完了したので、terraform init を実行して構成を再初期化し、状態ファイルを Terraform Cloud に移行します。移行を確認するプロンプトが表示されたら、「yes」と入力します。
terraform init
TerraformがTerraform Cloudに状態ファイルを移行したため、ローカルの状態ファイルを削除します。
rm terraform.tfstate
CLI駆動のワークフローでTerraform Cloudを使用する場合、Terraformをリモートで実行するか、ローカルマシンで実行するかを選択することができます。ローカル実行を使用する場合、Terraform CloudはローカルマシンでTerraformを実行し、リモートでTerraform Cloudに状態ファイルを保存します。この記事では、リモート実行モードを使用します。
terraform initステップでは、Terraform Cloud組織にlearn-tfc-awsワークスペースが作成されました。AWSプロバイダーを認証するために、ワークスペースにAWS認証情報を設定する必要があります。
Terraform Cloudのlearn-tfc-awsワークスペースに移動し、ワークスペースの「Variables」ページに移動してください。Workspace Variablesで、AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを環境変数として追加し、必ず「Sensitive」とマークしてください。
terraform構成の適用
ここで、terraform apply を実行して、Terraform Cloud での実行をトリガーします。
terraform apply
Terraform では、変更の必要がないことが表示されます。
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
これは、Terraformがあなたの設定と実際に存在する物理リソースとの違いを検出しなかったことを意味します。その結果、Terraformは何もする必要がありません。
Terraformは現在、Terraform Cloudに状態をリモートで保存しています。リモートステートストレージはコラボレーションを容易にし、ステートとシークレット情報をローカルディスクに残さないようにします。リモートステートは、使用時にメモリにのみロードされます。
構築したAWSリソースの破棄
この記事で作成したリソースをクリーンアップするために、terraform destroyを実行することを確認してください。Terraformはこの実行をTerraform Cloudで実行し、出力をターミナルウィンドウにストリームします。プロンプトが表示されたら、忘れずにyesで確定してください。また、Terraform CloudのWeb UIでワークスペースにアクセスし、実行を確認することで操作を確認することができます。
terraform destroy
Terraformのステートについて
terraform.tfstate
ファイルは、Terraformが管理しているリソース(例:仮想マシン、ネットワーク、データベースなど)の現在の状態を示します。このファイルはJSON形式で保存され、次のような情報を含んでいます:
- リソースの詳細: リソースのタイプ(例:AWS EC2インスタンス、Azure仮想ネットワークなど)、名前、ID、作成日時、その他のプロパティに関する情報が含まれます。
- リソース間の依存関係: リソース間の依存関係も記録されています。たとえば、仮想マシンがネットワークに依存している場合、その関連性も
terraform.tfstate
ファイルに含まれます。 - 変数の値: Terraformで使用される変数(例:AWSアクセスキー、サブネットIDなど)の値も保存されます。これにより、状態ファイルを介して変数の値を保持し、次回の実行時に再利用することができます。
Terraformは、terraform.tfstate
ファイルを使用して、現在の状態と望ましい状態との差分を計算し、必要な変更を特定します。Terraformは、変更のプランを立てる際に状態ファイルを参照し、作成、更新、削除などの必要なアクションを実行します。
注意点としては、terraform.tfstate
ファイルは機密情報を含む可能性があるため、適切なアクセス制御を実施する必要があります。また、terraform.tfstate
ファイルが誤って変更されたり削除されたりすると、Terraformが管理するインフラストラクチャの整合性が失われる可能性があるため、注意が必要です。
最後に、チームで共同作業する場合やリモート環境で状態を管理する場合には、リモートバックエンドを使用してterraform.tfstate
ファイルをセキュアに保存することをお勧めします。
おわりに
今日は、Terraformのstateをクラウドで管理する方法を解説しました。
今回使用したTerraformのソースは下記のGitHubにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント