- 棚井龍之介
- 約 2,500 文字
- 500 View
勉強会に登壇しました
こんにちは。
TIGの棚井龍之介です。
2022年2月17日(木)に、Terraform stateをテーマにした勉強会「Future Tech Night #20 Terraform State縛りの勉強会」が開かれました。私は後半パートでクラウドリソース自体をdestroy/createdせずに、Terraformリソース定義の記述場所を変更する方法について話しました。
登壇に向けた宣伝文がいい感じに背景を説明しているため、以下に全文を記載します。
クラウドサービス上で稼働するリソースには一切手を付けずに、Terraformの定義記載場所だけを変更する方法を話します。
Terraformを利用していると「このディレクトリ配置じゃダメだ。配置変えしたいのだけれど、リソースの再作成はできない。次にインフラ設計するときは、〇〇に注意しよう」という運用ナレッジが貯まると思います。スタート時点で完璧なTerraformディレクトリ設計ができれば御の字ですが、それが不可能なことは、この分野でベストプラクティスが確立されていないことにより証明されています。
本パートでは「Terraformのディレクトリ配置には定石がないのだから、運用状況に合わせて柔軟に配置換えすべき」という観点から、「動作中リソースに影響なく、Terraform定義箇所を移植する方法」について話します。
こういった前提のもと、terraform state mv pull push を利用した、Terraformリソースのディレクトリ移動方法を発表しました。
簡単に内容を説明すると…
(1)Terraformを運用していると、↓画像のように「.tfファイルの場所を移動」したくなることがあります。何も考えずに移動すると、リソースはdestroy/createdされてしまうのですが、データベースや24/365の稼働要件があるリソースはdestroyすべきではありません。
(2)そんな時は、terraform stateコマンドを活用することで、実リソースに手をつけることなく定義場所のディレクトリ移動ができます。さらに、↓画像のモデルをベースとすれば、リソース操作状況を視覚的にイメージしながら作業ができます。
という内容でした。
「state操作を図で表現する」というのが推しポイントだったのですが、勉強会後のツイートで Terraformの「moved block」という方法を教えて頂きました。実際に使ってみたことろ、terraform mvと同様の操作を、私が勉強会で説明した方法よりも安全に実行できると感じたため、この方法について以下で説明します。
moved blockを試す
事前準備
まずは、こちらの記事「LocalStackに向けてTerraformを実行する」に沿って環境構築を進めて、ローカル環境でTerraformが操作できるようにします。
moved blockは v1.1.0 により追加された機能のため、Terraformは最新バージョンを入れます。
私は tfenv を利用し、v1.1.7 を入れました。
tfenv install 1.1.7 |
作業用ディレクトリを用意し、以下のようにファイルを配置します。
tree |
今回の動作検証には、Terraform の null_resource を利用します。
resource "null_resource" "resource_A" {} |
作業ディレクトリで terraform init / plan / apply を実行して、null_resource を作成します。
これにより、stateファイル(terraform.tfstate) が作成されます。
tree |
stateファイルを直接覗いて見ると、
3つのリソース「resource_A」「resource_B」「resource_C」が作成されていることが分かります。
$ cat terraform.tfstate |
terraform state list でも、リソース名を確認できます。
terraform state list |
以上で準備は完了です。
moved blockでリソースを改名する
さっそく、moved block を利用して、terraform mv と同様に「リソース名の変更」を実施してみましょう。
まずは、同一ディレクトリに moved.tf を追加します。
moved { |
このタイミングで、すぐに terraform plan してみると…
terraform plan |
「null_resource.resource_Xに改名しようとしていますが、main.tf にはnull_resource.resource_Aのままで残っていますよ。Terraform の定義を変更してください」
と、丁寧なエラー文で通知してくれます。
terraform state mv でリソースを改名する場合、state操作に集中するあまり、Terraform本体側コードの書き換えを忘れがちですが、moved blockを使うと事前に通知してくれるのが嬉しい。
main.tf を正しく書き換えて、再度 plan してみます。
resource "null_resource" "resource_X" {} # renamed resource_A to resource_X |
terraform plan |
# null_resource.resource_A has moved to null_resource.resource_X
というメッセージで、「どこが変わるのか」が分かりますね。
applyして、変化後の状況を確認してみます。
terraform apply |
リソース名が、resource_A から resource_X に変化しています。
これにより moved.tf ファイルは役目を果たしたので、削除しても以降の plan / apply には影響しません。
rm moved.tf # delete moved.tf file |
以上で、moved block を利用したTerraformリソースの改名作業は終了です。
Terraformのリファクタリングには「(1)stateファイルの操作」と「(2)Terraformコード自体の操作」の2つが必要であり、(1)に集中することで(2)を忘れてしまうことがありますが、moved block を利用すればそれを防げそうです。
私の中では、Terraform stateファイルの操作には「terraform stateコマンドしかない」と思っていましたが、今回の勉強会に参加することで、結果的に新しい方法を知ることができました。改めて、継続的な技術インプット & 定期的なアウトプットが重要だなと実感した勉強会でした。