Open5
CDK for TerraformでGCPのリソースを管理してみる
CDK for Terraformは自分の好きな言語でインフラの設定を書くと、それがTerraform用のコードに変換され、AWSだけではなく好きな環境のインフラに反映される仕組みっぽい。
自分はTypeScriptが好きなのでTypeScriptでやってみることに
試しにまずはCDK for Terraformをインストール
npm install -g cdktf-cli@latest
プロジェクトを作成
cdktf init --template=typescript --local
GCPでサービスアカウントを作成して、ロールに編集者を指定。
そして、そのサービスアカウントの鍵をJSONでダウンロードする
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();
上のコードで、staging用と、production用のStackを作成したのでそれぞれデプロイする場合は以下のように実行
ステージングに適用
cdktf apply staging
プロダクションに適用
cdktf apply production
できた!!