Open5

CDK for TerraformでGCPのリソースを管理してみる

Godai HoriGodai Hori

CDK for Terraformは自分の好きな言語でインフラの設定を書くと、それがTerraform用のコードに変換され、AWSだけではなく好きな環境のインフラに反映される仕組みっぽい。

自分はTypeScriptが好きなのでTypeScriptでやってみることに

試しにまずはCDK for Terraformをインストール

npm install -g cdktf-cli@latest
Godai HoriGodai Hori

GCPでサービスアカウントを作成して、ロールに編集者を指定。
そして、そのサービスアカウントの鍵をJSONでダウンロードする

Godai HoriGodai Hori

CDK for Terraformで、さらにGoogle用のプロバイダーをインストールする

npm install @cdktf/provider-google

cdktf.jsonに、stagingとproductionの変数を設定

cdktf.json
{
  "language": "typescript",
  "app": "npx ts-node main.ts",
  "projectId": "******",
  "sendCrashReports": "true",
  "terraformProviders": [],
  "terraformModules": [],
  "context": {
    "excludeStackIdFromLogicalIds": "true",
    "allowSepCharsInLogicalIds": "true",
    "staging": {
      "schedulerName": "*****",
      "issueMailAPI": "*****"
    },
    "production": {
      "schedulerName": "*****",
      "issueMailAPI": "*****"
    }
  }
}

main.ts に以下のようなコードを記述
自分の場合はCloudSchedulerが動作するようにまずは書いてみた
credentialsに先程ダウンロードしたJSONをJSON.stringifyで文字列化して渡すのがミソ

import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { provider } from "@cdktf/provider-google";
import { CloudSchedulerJob } from "@cdktf/provider-google/lib/cloud-scheduler-job";
import serviceAccount from "./service-account.json";

class MyStack extends TerraformStack {
  constructor(scope: Construct, id: string) {
    super(scope, id);
    // define resources here
    new provider.GoogleProvider(this, "google", {
      project: "techup-345506",
      // 👇 ここで取得した鍵を文字列にしてる
      credentials: JSON.stringify(serviceAccount)
    });
    // npx cdk deploy --all --context stage=staging
    const context = app.node.tryGetContext(id) // staging or production

    new CloudSchedulerJob(this, context.schedulerName, {
      name: context.schedulerName,
      schedule: "0 */3 * * *",
      timeZone: "Asia/Tokyo",
      region: "asia-northeast1",
      httpTarget: {
        uri: context.issueMailAPI,
        httpMethod: "POST",
        headers: {
          "User-Agent": "Google-Cloud-Scheduler"
        }
      }
    })
  }
}

const app = new App();
new MyStack(app, "staging"); // cdktf apply staging
new MyStack(app, "production"); // cdktf apply production
app.synth();
Godai HoriGodai Hori

上のコードで、staging用と、production用のStackを作成したのでそれぞれデプロイする場合は以下のように実行

ステージングに適用

cdktf apply staging

プロダクションに適用

cdktf apply production

できた!!