Terraform、CDK、CDK for Terraformの3つの特徴を整理するためのメモです。間違っていたら教えて下さい。
IaCとは
- IaC(Infrastructure as Code)は、インフラをコードで定義するアプローチ全般を指す言葉
- 従来:
- 構成や手順は文書で定義
- 文書を参照し、手動で構築
- IaC:
- プログラミング言語やドメイン特化言語(DSL)で構成や手順を定義
- 自動で構築
Terraformとは
- IaCを実現するインフラ構成ツール
- HCLという宣言型のドメイン特化言語でインフラを定義できる
- AWS、Azure、GCPをはじめ様々な1,000を超えるプラットフォームに対応している
- 競合: Pulumi
Terraformのサンプルコード
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
CDKとは
- CDK(Cloud Development Kit)は、IaCを実現するインフラ構成ツール
- TypeScript、Python、Javaなどのプログラミング言語で、インフラを定義できる
- AWSにのみ対応している
- 競合: CloudFormation
CDKのサンプルコード
import * as cdk from 'aws-cdk-lib';
import { aws_s3 as s3 } from 'aws-cdk-lib';
export class HelloCdkStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
}
}
CDK for Terraform
- CDK for Terraform(CDKTF)は、IaCを実現するインフラ構成ツール
- TypeScript、Python、Javaなどのプログラミング言語で、インフラを定義できる
- HCLを書かずにTerraformを使えるようにするもの
- CDKの書き味の良さと、Terraformのマルチプラットフォーム対応のいいとこどりができる
- 競合: Pulumi
CDKTFのサンプルコード
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import {
GoogleProvider,
ComputeNetwork,
ComputeInstance,
} from "./.gen/providers/google";
import * as path from "path";
import * as fs from "fs";
class MyStack extends TerraformStack {
constructor(scope: Construct, name: string) {
super(scope, name);
const credentialsPath = path.join(process.cwd(), "google.json");
const credentials = fs.existsSync(credentialsPath)
? fs.readFileSync(credentialsPath).toString()
: "{}";
new GoogleProvider(this, "Google", {
region: "us-central1",
zone: "us-central1-c",
project: "terraform-cdk",
credentials,
});
const network = new ComputeNetwork(this, "Network", {
name: "cdktf-network",
});
new ComputeInstance(this, "ComputeInstance", {
name: "cdktf-instance",
machineType: "f1-micro",
bootDisk: {
initializeParams: {
image: "debian-cloud/debian-9",
},
},
networkInterface: [
{
network: network.name,
},
],
tags: ["web", "dev"],
dependsOn: [network],
});
}
}
const app = new App();
new MyStack(app, "typescript-gcp");
app.synth();
所感
- TypeScriptでIaCするなら、次のいずれかになる
- CDK
- Pulumi
- CDK for Terraform
- CDKはAWS専用なので、マルチプラットフォームを扱うなら選択肢から除外される
- PulumiとCDK for Terraformだと、どっちでも良さそうだが、PulumiよりTerraformのほうがエコシステムが大きそうなので、CDKTFが魅力的