3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

この記事では、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 ファイルが出力されました。

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 の合成もできます。

cdktf synth
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 で合成するメリットがあります。

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

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

まとめ

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

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

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?