CDK for Terraform 來到了 v0.3 版本,會寫這篇的主要原因是 CDK for Terraform 在這個版本的更新別具意義,從 skorfmann 加入 HashiCorp 主力開發 CDK for Terraform 之後,這應該是最大的更新之一
先講比較不重要的 Remote templates … XDD 基本上就是將 cdktf init
產生的模板改成自定義的 template,但老實說算是一個雞肋的功能 … 用 Github template 可以做到一樣的事情。
再來是這篇文章的重點 Multiple-stacks,一直以來 Terraform 都是以 Single-Stack 為主的模式,如果要切分不同 Stack 除了 Workspace 以外就是用 Directory 分開不同的 *.tf
部署,這對於某些場景來說很不容易管理,在這次 v0.3.0 版本釋出的 Multiple-stacks 讓 CDK for Terraform 做出與 Terraform 明顯的區隔
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { AwsProvider, Instance } from "@cdktf/provider-aws";
interface MyStackConfig {
environment: string;
region?: string;
}
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string, config: MyStackConfig) {
super(scope, id);
const { region = 'us-east-1' } = config
new AwsProvider(this, "aws", {
region,
});
new Instance(this, "Hello", {
ami: "ami-2757f631",
instanceType: "t2.micro",
tags: {
environment: config.environment
}
});
}
}
const app = new App();
new MyStack(app, "infra", { environment: 'dev' });
new MyStack(app, "eks", { environment: 'staging' });
app.synth();
Multiple-stacks 的用法基本上就是參照 AWS CDK 可以 new 多個 Stack 拆分 infra、application 或是 environments。
$ cdktf list
Stack name Path
infra cdktf.out/stacks/infra
eks cdktf.out/stacks/eks
從 cdktf list
來看其實還是把 stack 分開在不同的 cdktf.out 進行部署,而預設 tfstate 用了 Multiple-stacks 之後改成 terraform.<stack-name>.tfstate
雖然有一定的格式存放 tfstate 但我仍然建議大家指定 tfstate backend 自己命名 tfstate。
雖然 Multiple-stack 很香,但現在仍未支援 across stacks Token 互相 Reference 的方法,在還沒有 across stacks Token 之前大概都還算是好看不好用的階段。