👌

【Terraform】よく使う Terraform コマンドについて(実行結果の見方なども)

2023/05/10に公開

$ terraform init

Terraform を実行をするための初期化コマンド。

実行すると Terraform 実行のためのバイナリのファイルなどがカレントディレクトリにダウンロードされます。

$ terraform init 

#想定出力
$ Terraform has been successfully initialized! 

$ terraform plan

terraform を実行した際に、クラウド上に実際に構築されるリソースを模擬することができるコマンド。

実行前に必ずこのコマンドを打鍵して、想定通りかどうかを確認する必要しましょう。

$ export ARM_SUBSCRIPTION_ID="<サブスクリプションID>"

$ export ARM_TENANT_ID="<テナントID>"

#作成したいリソースが定義されている tf ファイルのあるディレクトリに移動する
$ cd ${移動先}

$ terraform plan

#想定出力(新規作成3件、変更0件、削除0件の場合)
$ Plan: 3 to add, 0 to change, 0 to destroy.

実行結果として、以下のような出力がされる(一部抜粋)


この結果を見て、問題なければ $ terraform apply を実行する。

plan 結果の見方について

plan 結果として、大きく「作成」「変更」「削除」が存在する。

  1. 作成

    リソース名の後に「will be created」という表記がされる。

    リソースが作成される際には「+」記号が緑色でそのリソース(パラメータなども含む)の先頭に付与される。

    • 参考画像
  2. 変更

    リソース名の後に、「will be updated inplace」という表記がされる。

    リソースが作成される際には「~」記号が緑色でそのリソース(パラメータなども含む)の先頭に付与される。

    • 参考画像
  3. 削除

    リソース名の後に、「will be destoryed」という表記がされる。

    リソースが作成される際には「-」記号が緑色でそのリソース(パラメータなども含む)の先頭に付与される。

    • 参考画像

$ terraform apply

クラウド上にリソースを構築するためのコマンド

$ terraform plan で想定通りの実行結果になったことを確認出来たら実行します。

$ export ARM_SUBSCRIPTION_ID="<サブスクリプションID>"

$ export ARM_TENANT_ID="<テナントID>"

#作成したいリソースが定義されている tf ファイルのあるディレクトリに移動する
$ cd ${移動先}

$ terraform apply

#本当に構築してよいか聞かれるのでyesと答える
$ Enter a value: yes

#想定出力(新規0件、変更1件、削除0件の場合)
$ Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
  • 以下のような感じで画面出力される(例として、Azure のデータ収集ルールを作成)

    参考1
    参考2

実際にクラウド上に構築されたかを確認して想定通り構築されていればOK!

※今回はデータ収集ルールというリソースを構築している

  • 参考
    参考3

$ terraform fmt

Terraform の定義ファイルのフォーマットを自動で直してくれる便利コマンド(適切な位置にインデントを入れたりなど)

なんか変更したら最後に打鍵するといいと思います。可読性が上がります。

$ terraform import

tfstate ファイル管理下にないリソースを tfstate ファイル管理下に持ってくるコマンド

ただし、import できないリソースも中には存在するため、ドキュメントを要確認

なぜ import する必要があるのか

terraform では tfstate ファイルという非常に重要なファイルが存在します

Terraform が HCL を認識して terraform plan などを実行する際には、HCL と tfstate を比較した結果を出します。

このことから tfstate ファイル内で管理していないリソースが存在した場合、HCL と tfstate ファイルに差分が出ることになってしまい、不都合な状態(実機とコードの整合性が取れない)になります。

したがって、手動で変更乃至は作成したリソースが存在する場合はterraform planやterraform apply を実行する前に$terraform import をしておくことが重要です。

やり方

$ export ARM_SUBSCRIPTION_ID="<サブスクリプションID>"

$ export ARM_TENANT_ID="<テナントID>"

#作成したいリソースが定義されている tf ファイルのあるディレクトリに移動する
$ cd ${移動先}

#ここではAzure Storage Accountをインポートする
$ terraform import azurerm_storage_account.StorageName <リソースID>

ドキュメント

基本的にドキュメントの最下部に import コマンドの書式は記載

例)

Terraform Registry

$ terraform destroy

クラウド上に構築されているリソースを削除するコマンド

Terraform でのリソース削除方法は2つあります。

  1. tf ファイル上で定義をコメントアウトなどして$ terraform apply する
  2. $ terraform destroy を実行してカレントディレクトリの tf ファイルで管理しているリソースがすべて削除する

💡 $ terraform destroy を使用する場合、カレントディレクトリの tf ファイルに記載しているリソースが本当にすべて削除されてよいものなのかを事前によく確認する必要があります。

💡 $ terraform destroy を使用する場合は、しっかりとしたディレクトリ戦略を取っていないとマジで事故る

$ export ARM_SUBSCRIPTION_ID="<サブスクリプションID>"

$ export ARM_TENANT_ID="<テナントID>"

#作成したいリソースが定義されている tf ファイルのあるディレクトリに移動する
$ cd ${移動先}

$ terraform 

#本当に削除してよいか聞かれるのでyesと答える
$ Enter a value: yes

#想定出力(新規0件、変更0件、削除3件の場合)
$ Apply complete! Resources: 0 added, 0 changed, 3 destroyed.
  • 参考


Discussion