21
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScriptとTerraform、CDK、CDK for Terraformの関係性についての整理

Last updated at Posted at 2022-04-05

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が魅力的
21
10
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
21
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?