VS Code の Terraform 拡張に新規追加された “Enhanced Validation”を試してみた
どうも、ちゃだいん(@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 · hachicorp/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_bucket
にacl
属性を入力したらエラーが出ました。
ちなみに、こちらも記述時点でオートコンプリート側でも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)でした。