Calendarの3日目の記事です。紹介するサブコマンドサブコマンド紹介・解説initapplydestroyplanrefreshimportまとめTerraformコマンド紹介Terraformコマンドにはインフラを柔軟に管理するためのサブコマンドが豊富に用意されています。managementこの記事では、主によく使うものや便利なものについて紹介します。必要に応じて行われます。モジュールの初期化、プラグインのインストールは、新しくリソースを定義した後にレシピを適用する前に必ず実行しなければエラーになってしまいます。CI/CDにTerraformを組み込む場合や運用スクリプトを整備する場合はinitコマンドを必ず実行するように書いておくと良いでしょう。www.terraform.ioBackendコンフィグの初期化時には、tfstateの保存パスが以前のコンフィグのものと異なる場合に「既存のstateを使いまわすかどうか」を問う旨のメッセージが表示されます。単純に保存先のパスを変更したい場合には使いまわしても大丈夫ですが、例えば保存パスを外部から注入して構築した環境ごとに別々のstateで管理したいようなケースでは、使いまわした後にレシピを適用すると既存の環境が全て破壊されて再作成されてしまう点に注意してください。stateの保存パスの変更時に常に既存のstateを使い回さないようにするには、以下のように-reconfigureオプションをつけて実行してください。applyapplyコマンドは手元にあるレシピをクラウド上のリソースに反映して、リソースの作成・削除・変更を行います。実行の前にはrefreshコマンドとdry-run(planコマンド)が暗黙的に実行されます。既存リソースのargumentの一部を変更した場合でも、リソースの変更にとどまらずリソースの削除→再作成が走ることがあります。クラウドプロバイダ側がリソース作成後に変更することを許していないargumentを変更しようとした場合に発生します。デフォルトではコマンドを実行した直下のプロジェクトで管理されるリソースが全てレシピ実行の対象となりますが、-targetオプションで特定のリソースのみを対象としてレシピを実行することができます。リソースの指定には、TerraformのResourceAddressingの戦略に基づいて決められたリソースのパスを使用します。www.terraform.ioapplyコマンドの実行時には、リソースやモジュールの依存関係は自動的に解決されて適切な順序で作成が行われますが、例えばモジュールA.リソースa1がモジュールB.リソースb1に依存し、モジュールB.リソースb2がモジュールA.リソースa2に依存しているような形でレシピを定義してしまった場合は、依存関係のデッドロックが発生してリソースが作成されません。デッドロックが発生しないようなモジュール設計を心がける必要があります。destroyリソースの削除自体はapplyコマンドでも行われますが、destroyコマンドはstateで管理されているすべてのリソースを削除します。S3バケットやその他複雑な依存関係を持つリソースによっては特定の条件下でないと削除できないものもあるので、-targetオプションで特定のリソースのみを削除したい場合には注意が必要です。デフォルトで実行する場合にはTerraformが削除の順序を自動的に判断してくれます。guide.applyコマンドと同様に、Terraformはどういう順序でリソースを削除されるべきかを判断してくれます。この場合リソースが一つしか無ければ、特に順序付けは必要ありません。複雑な依存関係がある場合は、Terraformは依存関係に従って最適な順序でリソースを削除します。planplanコマンドは、レシピを適用した場合にどのリソースが作成・削除・変更されるのかを一覧で表示してくれるdry-runの機能を担っています。基本的なオプションはapplyコマンドと同様です。refresh2日目の記事の「事始め」でも書いた通り、Terraformはリソースに対してどのような変更を加えるかをレシピとstateとの差分を見て適切に判断しています。前回のレシピの適用移行、Terraformの見えない範囲で(例えばGUI上から手動で)変更が加えられた場合、クラウド上にあるリソースとstateとの間に差分ができてしまいます。refreshコマンドは、クラウド上にあるリソースの実体の状態をstateに反映するコマンドです。applyコマンドはデフォルトでrefreshコマンドを事前に実行するようになっています。my-bucket-id第一引数には、クラウドからimportしたリソースをレシピ中のどのリソースに対応付けるかを指定します。第二引数では、そのリソースを参照するための一意な値を指定します。この値はリソースのタイプによって異なります。上の例では、AWS上にあるmy-bucket-idというIDを持つS3バケットをmy-s3-bucketsモジュール下のmy-bucketというS3バケットのレシピに対応づけてimportしています。importコマンドを使うのは大体が既存のインフラをTerraformで管理できるようにしたいようなニーズだと思いますが、残念ながらTerraformはimportしたリソースに対応するレシピを自動的に生成する機能をまだ持っていません。import後のstateに完全に一致するようなレシピはユーザーが手作りする必要があります。バイク月別アーカイブリンクPortfolioはてなブログをはじめよう!mic_psmさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。