CDK for Terraform 0.20の新機能：HCLの合成とそのメリット

# はじめに

この記事では、CDKTF で HCL の合成を試した結果を紹介します。

先日公開された ver.0.20 で HCL の合成がサポートされました。

https://www.hashicorp.com/blog/cdktf-0-20-improves-implementation-of-iterators-and-enables-hcl-output

CDKTF は Terraform の構成ファイルを出力（合成といいます）できます。しかし、出力形式は JSON しか選択できず、Terraform で一般的に利用される HCL の合成はサポートしていませんでした。

HCL サポートの経緯は、issue で確認できます。

https://github.com/hashicorp/terraform-cdk/issues/225

# CDKTFをアップデートする

先日試した CDKTF 0.19 の環境をアップデートし、HCL の合成を試してみます。

0.19 で試した記事は、こちらです。

https://qiita.com/JHashimoto/items/81c938d1a0574f1fa34c

まず、CDKTF をアップデートします。

```bash
npm i -g cdktf@latest cdktf-cli@latest
cdktf --version
# 0.20.0
```

# AWSプロバイダーをアップデートする

AWS プロバイダーも 19.0 にアップデートする必要があります。

```bash
npm i @cdktf/provider-aws@latest
npm list @cdktf/provider-aws@latest
# ...
# └── @cdktf/provider-aws@19.0.0
```

理由は、AWS プロバイダー18.x で合成を試行すると、エラーが出力されるためです。

```bash
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`オプションが追加されています。

https://developer.hashicorp.com/terraform/cdktf/cli-reference/commands#synth

```bash
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 を合成してみます。

```bash
cdktf synth --hcl
```

期待通り、`cdktf.out` ディレクトリに `.tf` ファイルが出力されました。

```hcl:cdktf.out/stacks/aws_instance/cdk.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 の合成もできます。

```bash
cdktf synth
```

```json:cdktf.out/stacks/aws_instance/cdk.tf.json
{
  "//": {
    "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 で合成するメリットがあります。

先述のアナウンスを訳します。

https://www.hashicorp.com/blog/cdktf-0-20-improves-implementation-of-iterators-and-enables-hcl-output

* HCL 出力が読みやすくなるため、CDKTF が作成する構成のデバッグが容易になります。
* CDKTF をテンプレート エンジンとして使用して、他のチームが使用および編集できる Terraform 構成を生成できます。
* Terraform HCL のみをサポートするツールで CDKTF を使用できるようになりました。ポリシー評価や正常性評価などの Terraform Cloud のネイティブ機能は JSON で動作しますが、コード スキャナーやリンターなどの他の一般的なツールは HCL のみをサポートします。

# まとめ

この記事では、新たにサポートされた HCL の合成を試しました。

HCL の合成は、従来よりサポートされていた JSON 形式に比べ、構成理解の容易さなど、多くのメリットがあります。また、Terraform の一般的な形式である HCL のサポートによって、エコシステムとの統合が、より進むことも期待されます。