VS Code の Terraform 拡張に新規追加された “Enhanced Validation”を試してみた

2023.10.26

どうも、ちゃだいん(@chazuke4649)です。

HashiConf 2023 にて、Visual Studio Code (VS Code) のTerraform の拡張機能 における、バリデーションチェック強化が発表されました。

アップデートの概要や、リリース速報ブログは以下です。

自分も普段 VS Code を利用しているので、実際に試してみたいと思います。

前提

HashiCorp Terraform - Visual Studio Marketplace

Release v2.28.0 · hashicorp/vscode-terraform

ちなみに、上記が VS Code 拡張の本体ですが、内部的には、Terraform-ls (Terraform language Server) という LSP をバンドルしており、VS Code エディタに対して、Terraform/HCL言語の特有の構造や仕様を伝達しています。よって、今回紹介する構文エラーや、無効/非推奨な表現などの判定は、実質 Terraform-ls が行なっている模様です。

よって、今回のアップデートの詳細は、Terraform-ls 側のREADME.mdにスクショ付きで説明されています。

terraform-ls/docs/validation.md v0.32.0 · hach​​icorp/terraform-ls

バリデーションチェック

全容は↑のREADME.mdですが、特に気になる項目を、AWSプロバイダーで確認していきます。

% terraform --version
Terraform v1.5.2
on darwin_arm64
+ provider registry.terraform.io/hashicorp/aws v5.7.0

必須属性がありません

resourceブロックの aws_s3_bucket_acl には、少なくとも bucket 属性を指定しないとダメだよと怒られました。

bucket を入力すると、エラーは消えました。

ちなみに、記述時に cmd+i 等で IntelliSence(オートコンプリート)機能を使用すると、bucket属性がRequiredであることは確認可能です。

非推奨の属性

非推奨な属性といえば、例えばAWS Provider v4 で非推奨となった aws_s3_bucket に何でもかんでも詰め込む方式が有名ですが、試しにaws_s3_bucketacl属性を入力したらエラーが出ました。

ちなみに、こちらも記述時点でオートコンプリート側でもaclには打ち消し線が入っています。

バージョンによる差異

"Enhanced validation of selected Terraform language constructs in both .tf and *.tfvars files based on detected Terraform version and provider versions is also provided. (検出されたTerraformのバージョンとプロバイダーのバージョンに基づいて、.tfと*.tfvarsファイルの両方で選択されたTerraform言語コンストラクトのバリデーションも強化された。)"

と記載があるので、Terraform と AWS Provider のバージョンを上げれば、そのバージョンで追加された機能やリソースのチェックも可能か?を調べてみました。

AWS Providerのバージョン

今までは AWS Provider v5.7.0 で検証しましたが、AWS Provider を最新バージョンに上げてみるのと比較してみます。

例えば、"aws_ec2_image_block_public_access" は、v5.21.0 にて追加された比較的新しいresourceブロックですが、現在の v5.7.0 にて記述すると、そもそもそんなものないよとエラーになります。

※後で補足しますが、記述後にsaveした段階ではエラー表示はなく、コマンドパレットでterraform validateを実行することでエラー表示されました。

それでは、AWS Providerのバージョンを v5.20.O に更新してみます。 更新後は以下の通りとなります。

% terraform --version
Terraform v1.5.2
on darwin_arm64
+ provider registry.terraform.io/hashicorp/aws v5.21.0

すると、先ほどのエラーは解消され、今度は「必須の属性がありません」エラーが表示されました。 つまり、これはバリデーションチェックが機能していることを意味するので、指定しているAWS Providerのバージョンに合わせて検証してくれるようです!

Terraformのバージョン

Terraform v1.5 にて importブロックがサポートされましたが、v1.5の段階では、idには静的な値しか指定できません。それが v1.6 にて importブロック の id に変数など動的な値が指定可能になりました。

このバージョン差異を確認します。

まず、現行(v1.5)だと、以下の通り、変数はここでは使えませんとエラーが出ます。

次に、Terraformのバージョンをv1.6に更新します。

% terraform --version
Terraform v1.6.2
on darwin_arm64
+ provider registry.terraform.io/hashicorp/aws v5.21.0

すると、以下の通り v1.5 のエラーが解消されました!

コマンドパレット terraform validate 実行

ちなみに、今回の調査の中でたまたま知ったのですが、VS Code のコマンドパレットにて terraform validate を実行することができます。

これがドキュメント曰く " It is the slowest method, but the most thorough - i.e. it will catch the most mistakes.(最も時間がかかる方法だが、最も徹底的で、つまり最も多くのミスを見つけることができる。)"とのことで、実は、編集保存後の自動的なバリデーションチェックでひっかからなかったエラーも、こっちでひっかけることができました。ターミナルからterraform validateコマンド実行するより早く実行できるので便利です。(地味にこれが今回一番嬉しい発見でしたw)

まとめ

  • Enhanced Validation、いい感じ
  • 実行環境のTerraform,Providerバージョンに基づいて検証可能
  • コマンドパレットのterraform validateも操作性よき

それでは今日はこの辺で。ちゃだいん(@chazuke4649)でした。