はじめに
この記事では、CDKTF で HCL の合成を試した結果を紹介します。
先日公開された ver.0.20 で HCL の合成がサポートされました。
CDKTF は Terraform の構成ファイルを出力(合成といいます)できます。しかし、出力形式は JSON しか選択できず、Terraform で一般的に利用される HCL の合成はサポートしていませんでした。
HCL サポートの経緯は、issue で確認できます。
CDKTFをアップデートする
先日試した CDKTF 0.19 の環境をアップデートし、HCL の合成を試してみます。
0.19 で試した記事は、こちらです。
まず、CDKTF をアップデートします。
npm i -g cdktf@latest cdktf-cli@latest
cdktf --version
# 0.20.0
AWSプロバイダーをアップデートする
AWS プロバイダーも 19.0 にアップデートする必要があります。
npm i @cdktf/provider-aws@latest
npm list @cdktf/provider-aws@latest
# ...
# └── @cdktf/provider-aws@19.0.0
理由は、AWS プロバイダー18.x で合成を試行すると、エラーが出力されるためです。
cdktf synth
...
[2024-01-12T08:14:46.072] [ERROR] default - npm
npm[2024-01-12T08:14:46.073] [ERROR] default - ERR! code ELSPROBLEMS
...
ERR! code ELSPROBLEMS
[2024-01-12T08:14:46.074] [ERROR] default - npm ERR! invalid: cdktf@0.20.0 <parent dir>/sample/node_modules/cdktf
...
npm ERR! invalid: cdktf@0.20.0 <parent dir>/sample/node_modules/cdktf
...
HCLを合成する
合成を実行するコマンドは cdktf synth
です。
CDKTF 0.20 では、cdktf synth
に、HCL 形式で出力する--hcl
オプションが追加されています。
cdktf synth --help
# cdktf synth
#
# Synthesizes Terraform code for the given app in a directory.
#
# Options:
# ...
# --hcl Should the output be in HCL format? [boolean] [default: false]
# ...
では、HCL を合成してみます。
cdktf synth --hcl
期待通り、cdktf.out
ディレクトリに .tf
ファイルが出力されました。
terraform {
required_providers {
aws = {
version = "5.31.0"
source = "aws"
}
}
backend "local" {
path = "<parent dir>/sample/terraform.aws_instance.tfstate"
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_instance" "compute" {
ami = "ami-0d48337b7d3c86f62"
instance_type = "t2.micro"
tags = {
Name = "CDKTF-Demo"
}
}
output "public_ip" {
value = "${aws_instance.compute.public_ip}"
}
JSON形式との比較
従来どおり JSON の合成もできます。
cdktf synth
{
"//": {
"metadata": {
"backend": "local",
"stackName": "aws_instance",
"version": "0.20.0"
},
"outputs": {
"aws_instance": {
"public_ip": "public_ip"
}
}
},
"output": {
"public_ip": {
"value": "${aws_instance.compute.public_ip}"
}
},
"provider": {
"aws": [
{
"region": "ap-northeast-1"
}
]
},
"resource": {
"aws_instance": {
"compute": {
"//": {
"metadata": {
"path": "aws_instance/compute",
"uniqueId": "compute"
}
},
"ami": "ami-0d48337b7d3c86f62",
"instance_type": "t2.micro",
"tags": {
"Name": "CDKTF-Demo"
}
}
}
},
"terraform": {
"backend": {
"local": {
"path": "<parent dir>/sample/terraform.aws_instance.tfstate"
}
},
"required_providers": {
"aws": {
"source": "aws",
"version": "5.31.0"
}
}
}
}
次の理由で、JSON よりも HCL の方が、構成を理解しやすいと感じました。
- Terraform を直接利用する場合は、HCL での記述が一般的であること
- HCL の方が抽象度が高いこと
HCL合成のメリット
理解の容易さの他にも、HCL で合成するメリットがあります。
先述のアナウンスを訳します。
- HCL 出力が読みやすくなるため、CDKTF が作成する構成のデバッグが容易になります。
- CDKTF をテンプレート エンジンとして使用して、他のチームが使用および編集できる Terraform 構成を生成できます。
- Terraform HCL のみをサポートするツールで CDKTF を使用できるようになりました。ポリシー評価や正常性評価などの Terraform Cloud のネイティブ機能は JSON で動作しますが、コード スキャナーやリンターなどの他の一般的なツールは HCL のみをサポートします。
まとめ
この記事では、新たにサポートされた HCL の合成を試しました。
HCL の合成は、従来よりサポートされていた JSON 形式に比べ、構成理解の容易さなど、多くのメリットがあります。また、Terraform の一般的な形式である HCL のサポートによって、エコシステムとの統合が、より進むことも期待されます。