HashiCorp 社が開発した Terraform は、インフラ・アズ・コード(IaC)ツールとして広く利用されており、ユーザーは高度な構成言語を使用してソフトウェア・インフラを定義し、プロビジョニングできます。クラウドベースのインフラの導入が進むにつれ、Terraform はインフラ・リソースの管理と自動化に不可欠となっています。Terraform のコア・コマンドの 1 つは、インフラの変更が安全で予測可能、かつ効率的であることを保証する展開プロセスの重要なステップである、terraform plan です。
この記事では、terraform plan コマンド、その動作、Terraform 構成の出力を解釈する方法について詳しく解説します。
Terraform Plan とは?
terraform plan コマンドは、Terraform ワークフローの重要な部分であり、Terraform がインフラに対して行う変更のドライランまたはプレビューとして機能します。インフラの現在の状態を Terraform 構成ファイルで定義された希望の状態と比較し、ギャップを埋めるために Terraform が取る具体的なアクションを示します。これには、新しい仮想マシンの作成、既存のデータベースのスケールアップ、未使用のストレージ・ボリュームの削除など、リソースの追加、削除、変更が含まれます。
Terraform Plan のメリット
構成コードの変更がインフラにどのような影響を及ぼすかをプレビューできることは、次のような多くの点で有益です。
- 透明性:terraform plan では、今後の変更点を詳しく説明し、インフラで作成、変更、削除される内容を明確に把握できます。この透明性により、エラーを最小限に抑え、展開プロセスに関与する全ての人が同じ認識を持つことを確実にします。
- リスク軽減:変更を事前にプレビューすることで、サービスを中断する前に潜在的な問題を特定して対処できます。terraform plan は、リソースの競合(重複した名前の VM の作成など)、依存関係の欠如(構成されていない特定のセキュリティ・グループを必要とするデータベースなど)、構成ファイルの誤字による意図しない変更を明らかにするのに役立ちます。
- コラボレーション:terraform plan は、Git などのバージョン管理システムとシームレスに統合され、チームのコラボレーションを促進します。terraform plan の出力をチームメンバーと共有することで、コードコミットのコンテキスト内で変更をレビューでき、変更を実施する前に透明性と説明責任を促進できます。
- 効率性:terraform plan は、インフラの変更を計画し、適切に実行するのに役立ちます。terraform plan の出力結果を分析することで、変更を適用する前に潜在的なボトルネックや非効率性を特定できます。
- 安全性:terraform plan は、本番環境のインフラに適用される前に変更を確認、検証できるようにすることで、セーフティネットとして機能します。この保護は、偶発的な変更を防ぎ、クラウド環境の安定性と信頼性を確保します。
Terraform Plan の実行方法
terraform plan を実行するには、まず、ローカルマシンに Terraform がインストールされていることを確認します。HashiCorp 社の公式ウェブサイトから適切なバージョンをダウンロードしてインストールできます。
plan コマンドを実行する前に、作業ディレクトリに main.tf という名前の基本的な Terraform 構成ファイルを作成する必要があります。以下に、クラウド・プロバイダに仮想マシン・リソースを作成するシンプルな構成の例を示します。
# Configure the cloud provider (replace with your provider details)
provider "aws" {
region = "us-east-1"
}
# Define a virtual machine resource
resource "aws_instance" "my_vm" {
ami = "ami-0f78f7e824d9499e0" # Replace with the desired AMI ID
instance_type = "t2.micro"
}
1. Terraform ディレクトリを初期化する
main.tf ファイルを含む作業ディレクトリに移動し、ターミナルで次のコマンドを実行します。
$ terraform init
このコマンドは、Terraform ディレクトリを初期化し、構成で指定された必要なプラグインやモジュールをダウンロードし、Terraform を使用する環境を準備します。
2. Terraform Plan の実行
初期化が完了したら、次のコマンドを実行して実行計画を生成します。
$ terraform plan
このコマンドは、Terraform 構成を分析し、インフラの現在の状態(存在する場合)と比較します。次に、設定で定義された目的の状態を達成するために Terraform が実行するアクションを概説する詳細な計画が表示されます。計画には、通常、作成、変更、削除されるリソースが表示されます。
3. 計画の出力を保存する
将来参照できるように計画を保存する場合や、チームメンバーと共有する場合は、必要に応じて、plan コマンドで -out フラグを使用できます。例えば、次のコマンドは、計画を plan.tfplan という名前のファイルに保存します。
$ terraform plan -out=plan.tfplan
terraform plan コマンドは、変更をプレビューするだけです。インフラに変更はありません。計画のレビューと承認後、$ terraform apply コマンドを使用して計画された変更を実行できます。
Terraform Plan の出力の理解と分析
terraform plan の出力は通常、いくつかのセクションに分かれており、それぞれが計画されたアクションについての貴重な知見を提供します。
リソースのアクション
このセクションでは、Terraform がインフラ・リソースで実行する具体的なアクションについて解説します。これらのアクションは、主に 3 つのタイプに分類されます。
- 作成 (+):この記号は、Terraform が構成に基づいて新しいリソースを作成することを示します。
- 読み取り (~):この記号は、Terraform が既存のリソースの状態を読み取り、変更が必要かどうかを判断することを意味します。Terraform は通常、計画フェーズで必要なアクションを決定するため、計画の出力ではあまり頻繁に見られません。
- 削除 (-):この記号は、Terraform が、設定で定義されていない既存のリソースを削除することを示します。
リソースの詳細
このセクションでは、plan の影響を受ける各リソースについて詳しく説明します。以下に、一般的な詳細を示します。
- リソースの種類:これは、Terraform が管理するインフラ・リソースのタイプを指定します(例:aws_instance、azurerm_resource_group)。
- リソース名:これにより、Terraform 構成内のリソースに割り当てられた一意の名前が識別されます。
変更予定
このセクションでは、リソースに適用される具体的な変更について詳しく解説します。作成(+ で示される)されるリソースについては、定義される属性と、対応する値がリストされます。変更対象のリソースについては、既存の属性に対する変更が表示されます。
概要
計画の出力は、多くの場合、計画されたアクションの概要を提供する要約セクションで終了します。この概要では、通常、リソースの合計数を次のカテゴリに分類します。
追加予定:作成される新しいリソースの数
変更予定:変更する既存のリソースの数
破棄:削除される既存のリソースの数
先ほど作成したサンプル構成で terraform plan を実行すると、次のような結果が得られます。
# $ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.my_vm will be created
resource "aws_instance" "my_vm" {
+ ami = "ami-0f78f7e824d9499e0"
+ instance_type = "t2.micro"
+ tags = {
+ Name = "sample-tag"
}
}
1. リソースのアクション:最初の行は、Terraform がこの計画中に作成アクション (+) を実行することを示しています。
2. リソースの詳細:次のセクションでは、単一のリソースである aws_instance.my_vm について詳しく解説します。これは、Terraform が AWS 環境に my_vm という名前の新しい AWS EC2 インスタンスを作成することを意味します。さらに、Terraform が新しいインスタンスに適用する AMI ID (ami-0f78f7e824d9499e0)、インスタン・スタイプ (t2.micro)、タグ (Name = "Samplesample-tag") を指定します。
3. 要約(暗黙的):この例では明示的に示されていませんが、より複雑な計画の出力の最後には、要約が表示され、作成されるリソースの合計数を示す場合があります。
Terraform Plan のベストプラクティス
terraform plan コマンドは、インフラの変更を適用する前のセーフティネットです。以下は、メリットを最大化するために不可欠なプラクティスです。
リソース変更の精査:
- 作成(+)または削除(-)用にマークされたリソースに焦点を当てます。
- 新しいリソースの属性値が目的と一致していることを確認します(AMI ID、ストレージ・サイズなど)。
- 既存のリソースへの変更の正確性を再確認します。
潜在的な問題を見つける:
- リソースの競合(重複した名前、依存関係の欠如など)がないか調べます。
- 必要な依存関係(セキュリティ・グループなど)が全て定義されていることを確認します。
- サービスを中断させる可能性のあるリソースの予期しない削除には注意してください。
出力の活用:
- 計画された変更がインフラの目標と一致するかどうかを検証します。
- リソースの変更に伴う潜在的なコストへの影響を考慮します。また、計画の出力を共有し、チームレビューとコミュニケーションを図ることもできます。
まとめ
terraform plan は、Terraform ワークフローにおける強力なツールです。インフラの変更を安全かつ透過的にプレビューして検証し、適用することができます。terraform plan を理解し、効果的に活用することで、デプロイメントの効率、予測可能性、意図しない結果がないことを確認できます。
ピュア・ストレージは、Terraform の導入に最適な永続的ブロック・ストレージ・ソリューションを提供します。Portworx は、あらゆるコンテナと Kubernetes Terraform ワークロードのための包括的なデータ・プラットフォームを提供します。Pure Cloud Block Store は、オンプレミス・インフラと同様に、あらゆるデータベースやコンテナのワークロードをクラウドで実行できます。