とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Terraform 1.5で追加されたcheck / importブロックをみる

Terraform 1.5がリリースされましたね。このバージョンではcheckブロックとimportブロックというのが追加されています。いまいちどんなものかわからないので公式ドキュメントを見ていきます。

github.com

check{}

developer.hashicorp.com

checkブロックはバリデーションの1つで、planやappley後に実行できるバリデーションのようです。バリデーションというと1.5未満のバージョンでもvariableブロックのvalidationや、resource, data source, outputで記述できるprecondition, postconditionなどがありましたが、これらはそのブロック内でのみ有効でした。checkブロックを使用することで、全体的なバリデーションを行うことができるようになったみたいです。

公式ドキュメントのコードを拝借するとこんな感じ

check "health_check" {
  data "http" "terraform_io" {
    url = "https://www.terraform.io"
  }

  assert {
    condition = data.http.terraform_io.status_code == 200
    error_message = "${data.http.terraform_io.url} returned an unhealthy status code"
  }
}

https://www.terraform.ioのレスポンスコードを取得してヘルスチェックしてるみたいですね。

例えば、IaCでデプロイする前後でステータスを取得して健全性を確認する、みたいな時にいいかもしれません。

import{}

developer.hashicorp.com

元々あったimportコマンドとは別物で、importブロックを記述していくようです。importブロックにはtoidがあり、toはどのリソースブロックに出力するかというもの、idはインポートしたいリソースのID(IAMユーザーならユーザー名、VPCならvpc_idなど)になります。importブロックを記述した上でterraform plan -generate-config-out=path/to/generated_resources.tfなどとするとgenerated_resources.tfにコードが出力されます。このファイル名はなんでもいいですが、同じファイルがあるとジェネレートできませんでした。

import {
  to = aws_instance.example
  id = "i-abcd1234"
}

resource "aws_instance" "example" {
  name = "hashi"
  # (other resource arguments...)
}

countやfor_eachにも対応しているようです。

Import - Configuration Language | Terraform | HashiCorp Developer

ある程度のコードが出力されたら後は plan & error で少しずつ不要なコードを削除していくとよさそうです。 importコマンドとは違ってtfstateは出力されないので、必要に応じてterraform refreshなんかで既存環境のtfstateをジェネレートしておくと、非IaC環境をIaCに移行していけるかもしれません。

まとめ

ドキュメントを読みつつ、ちらっと触ってみた感じimportは便利そうでした。checkは今のところ具体的な使用方法が思いつきません。色々触りつつ模索してみたいと思います。