对于TypeScript、Terraform、CDK和CDK for Terraform之间的关系进行整理
以下是整理Terraform、CDK和CDK for Terraform三个特点的备忘录。如果有错误,请告诉我。
IaC是什么?
-
- IaC(Infrastructure as Code)は、インフラをコードで定義するアプローチ全般を指す言葉
-
- 従来:
構成や手順は文書で定義
文書を参照し、手動で構築
IaC:
プログラミング言語やドメイン特化言語(DSL)で構成や手順を定義
自動で構築
“Terraform是什么”
-
- IaCを実現するインフラ構成ツール
-
- HCLという宣言型のドメイン特化言語でインフラを定義できる
-
- AWS、Azure、GCPをはじめ様々な1,000を超えるプラットフォームに対応している
- 競合: Pulumi
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
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
});
}
}
Terraform的CDK
-
- CDK for Terraform(CDKTF)は、IaCを実現するインフラ構成ツール
-
- TypeScript、Python、Javaなどのプログラミング言語で、インフラを定義できる
-
- HCLを書かずにTerraformを使えるようにするもの
CDKの書き味の良さと、Terraformのマルチプラットフォーム対応のいいとこどりができる
競合: Pulumi
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が魅力的