みどりのさるのエンジニア

CDK for Terraform でVPCを構築するチュートリアル

2020年07月23日

CDK for Terraform のチュートリアルを TypeScript で試してみました。
CDK for Terraform: Enabling Python & TypeScript Support

Terraformのインストール

Install Terraform | Terraform - HashiCorp Learn

$ brew install terraform

CDK for terraform のインストール

$ yarn global add cdktf-cli

AWSでVPCを構築するチュートリアル

プロジェクトの作成

Terraform Cloud でリモートステートを管理するか聞かれるので "no" とする。

$ mkdir vpc-example
$ cd vpc-example
$ cdktf init --template=typescript
...
Do you want to continue with Terraform Cloud remote state management (yes/no)? no
Project Name: (default: 'vpc-example')
Project Description: (default: 'A simple getting started project for cdktf.')

実装

TerraformのHCLと比較すると、型のおかげで必須オプションの漏れなどが、リアルタイムで分かるのは良いですね。

import { Construct } from 'constructs';
import { App, TerraformStack, Token } from 'cdktf';
import { Vpc } from './.gen/providers/aws/vpc';
import { Subnet } from './.gen/providers/aws/subnet';
import { AwsProvider } from './.gen/providers/aws'

class MyStack extends TerraformStack {
 constructor(scope: Construct, name: string) {
   super(scope, name);

   new AwsProvider(this, 'aws', {
     region: 'ap-northeast-1'
   });

   const vpc = new Vpc(this, 'my-vpc', {
     cidrBlock: '10.0.0.0/16'
   });
    new Subnet(this, 'my-subnet', {
     vpcId: Token.asString(vpc.id),
     cidrBlock: '10.0.0.0/24'
   });
 }
}

const app = new App();
new MyStack(app, 'vpc-example');
app.synth();

TerraformのJSONファイルを生成

TypeScriptのコードからTerraformのJSON形式の設定ファイルをに生成します。ファイルはcdk.tfディレクトリに出力されます。

$ cdktf synth
Generated Terraform code in the output directory: cdktf.out

$ tree cdktf.out
cdktf.out
└── cdk.tf.json

Terraformを実行

生成された設定ファイルを元に terraform を実行することで、AWSにVPCを構築できます。
設定がまだの場合は事前に aws configure で設定を完了させておく必要があります。

AWSコンソールのVPCを確認すれば、新しくリソースが作成されている事が確認できます。

$ cd cdktf.out
$ terraform init
$ terraform plan
...
# 追加されるVPCの情報が表示される

$ terraform apply
aws_vpc.vpcexample_myvpc_80A1790F: Creating...
aws_vpc.vpcexample_myvpc_80A1790F: Still creating... [10s elapsed]
aws_vpc.vpcexample_myvpc_80A1790F: Creation complete after 10s [id=vpc-09aeca6257ae5fe31]
aws_subnet.vpcexample_mysubnet_3769B309: Creating...
aws_subnet.vpcexample_mysubnet_3769B309: Creation complete after 3s [id=subnet-0264b990708ed4f69]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

リソースの削除

最後に今回のチュートリアルで作成したVPCを削除しておきます。

$ terraform destroy