どうも,エンジニアのナカノです.
今月は梅雨の時期でしたね。洗濯物を外に干せないことが多く、悶々としておりました.
天気予報を見ると今週から天気が良いみたいなので、少しホッとしております.
さて,今回も前回の記事の内容の続きとなります.
前回はterraform.tfstate
の管理/運用コマンド (1)に関する内容でした.
今回の内容は,terraform.tfstate
の管理/運用コマンド (2)に関してです.
- `terraform.tfstate`の管理/運用コマンド (2)
- taint
- untaint
- refresh
- workspace
- list
- select
- new
- delete
- 最後に
terraform.tfstate
の管理コマンド (2)
taint
Terraformを使っていると,apply
の実行でエラーが出てしまって適当なリソースが想定とは異なる形で作成されることがしばしばあります.
そういった時は,まずはエラー箇所を修正し,次にそのリソースを作り直して想定通りの状態でデプロイしたい欲求に駆られるでしょう.
taint
というコマンドはその様な時に役に立ちます.例えば,訳あって作成済みのリソースxxxxxxxx
を作り直したいとします.
そのためにterraform taint xxxxxxxx
を実行すると,terraform.tfstate
に記載されているxxxxxxxx
の項目tainted
の値がfalseからtrueに変わります。
tainted
の値がtrueになると,xxxxxxxx
はまずTerraformによって削除され,次にxxxxxxxx
が再作成されます.
こういった状況ではゴリ押しでapply
を実行しまくるのも一つの手ですが,taint
コマンドを上手く使う方が得策かもしれません.
untaint
untaint
コマンドは,文字から分かる様に,taint
とは反対の挙動を起こすコマンドです.
まずはtaint
の挙動を思い起してみましょう.このコマンド実行すれば,指定されたリソースがtaintedな状態になります.
一方,untaint
を実行すると,指定されたリソースがuntaintedな状態であるとしてterraform.tfstate
に記録されます.
taintedなリソースはTerraformにより再作成されるのですから,untaintedなリソースはそのままの状態で保持されます.
このことをterraform.tfstate
の観点で言えば,taint
はtaintedの値をtrueに変えるがuntaint
はtaintedの値をfalseに変えます.
refresh
一般に,Terraformで管理されているリソースの情報はterraform.tfstate
で管理されています.
しかし,Terraform以外の手段によってTerraformの管轄対象のリソースが更新された場合,`terraform.tfstate‘の内容は古いものとなります.
この様な状況では,apply
の実行の際に思わぬ挙動が起きて痛い目を合うことがあります.そういう時こそrefresh
コマンドの出番です.
このコマンドは,Terraformが管轄するリソースに合わせてterraform.tfstate
の内容を更新してくれます.
例えば,何らかの問題が起こって,管理コンソールでTerraformに管理されているリソースの更新を行うことがあります.
そんな時にrefresh
コマンドを実行すると,実態のリソースたちとterraform.tfstate
の間に差分が生まれない様にすることが出来ます.
このコマンドは,問題が起きた時に威力を発揮することが多いので,覚えておくべきものかと思います.
workspace
workspace
を使うと,terraform.tfstate
の切り替えを実現することが出来ます.このことをもう少し具体的に説明します.
初めはdefault
というworkspaceしかないのですが,新しく作成してworkspace1
,workspace2
というworkspaceを作ったとします.
そして,workspace1
,workspace2
の各々でリソースを作成すると,各々のworkspaceに応じた‘terraform.tfstate`が生成されます.
これらのファイルは,ローカルでは
./terraform.tfstate.d/workspace1/terraform.tfstate
./terraform.tfstate.d/workspace2/terraform.tfstate
の様に配置されます.一方で,バックエンド設定をしている場合でも殆ど同様な感じで各々のterraform.tfstate
が格納されます.
この時,workspace毎のterraform.tfstate
は互いに独立しており,リソース作成の状態の上書きは起こりません.
よって,このコマンドを使えば,リソース作成の状態を適切に管理/運用することが出来る様になります.
しかし,.tf
ファイルの内容はworkspaceでは切り替わらないため,現状では共通の設定をステージ毎に管理する場合に役立つという感じでしょうか.
さて,以下はworkspace
のサブコマンドlist
,select
,new
,delete
の説明となります.
list
このサブコマンドは,存在する全てのworkspaceをリストします.また,現在のworkspaceには*
が付いています.
例えば,存在するworkspaceがdefalut
,workspace1
,workspace2
であり,現在のworkspaceがworkspace1
であるならば,list
の実行結果は下記の様になります.
$ terraform workspace list default * workspace1 workspace2
select
現在のworkspaceから別のworkspaceに切り替えたい時に,このサブコマンドを使用します.
例えば,存在するworkspaceがdefalut
,workspace1
,workspace2
であり,現在のworkspaceがworkspace1
であるとします.
この時に,現在のworkspaceからworkspace2
に切り替えたい時は,以下の様に実行します.
$ terraform workspace select workspace2 Switched to workspace "workspace2".
new
これを実行すると,新しいworkspaceを作成することが出来ます.例えば,new_workspace
というworkspaceを作成する場合は下記を実行します.
$ terraform workspace new new_workspace Created and switched to workspace "new_workspace"! You're now on a new, empty workspace. Workspaces isolate their state, so if you run "terraform plan" Terraform will not see any existing state for this configuration.
delete
workspaceを削除する場合は,このサブコマンドを利用します.ただし,以下の点に注意する必要があります.
- 削除対象のworkspaceがそもそも存在する
- 削除対象のworkspaceに対応する
terraform.tfstate
の内容が空である - 削除対象のworkspaceは現在のworkspaceではない
これらの点を守った上で,例えばworkspace_to_delete
を削除したい場合は以下を実行します.
$ terraform workspace delete workspace_to_delete Deleted workspace "workspace_to_delete".
もしterraform.tfstrate
の内容が空ではない場合にworkspace_to_delete
を削除したいならば,-force
オプションを使えばよいです.
ただし,このオプション付きでdelete
を実行すると,workspace_to_delete
の場合でTerraformにより作成されたリソースはTerraformの管理外となってしまいます.
最後に
今回はterraform.tfstate
の管理/運用コマンド (2)を紹介させて頂きました.
前回と同様で,使い所を適切に考えれば割と役に立つコマンドばかりです.
直近はTerraformコマンドを紹介してきましたが,コマンドの紹介は今回で終わりです.
次回からは,また別のトピックを扱おうかと思います.
それでは,今回はこの辺りで筆を置かせて頂きます.
次回に乞うご期待下さい.