下記の感じでstackごとにディレクトリ切って、その中で一定のまとまりの単位でファイルを分割している。
ただし、現状stackは一つ。
1
2
3
4
| ├── stacks
│ └── $stack_name
│ ├── modules
│ └── $module_name.ts
|
moduleは下記のようにしている(terraform modulesではない)。
単純にファイル(クラス)分割して可読性、保守性を上げることが目的。
scope(stack)が同じでありさえすれば同一stateなのでscopeを受け入れるようにしている。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| import { Construct } from "constructs";
import {
KmsKeyRing,
KmsCryptoKey
} from '@cdktf/provider-google'
import { defaultRegion } from '../../../utils'
import { ITerraformDependable } from "cdktf";
export class XXXKms {
constructor(scope: Construct, dependsOn: ITerraformDependable[]) {
const keyRing = new KmsKeyRing(scope, 'xxx-kms-key-ring', {
name: 'xxx',
location: defaultRegion,
dependsOn: dependsOn
})
new KmsCryptoKey(scope, 'xxx-kms-crypto-key', {
name: 'xxx',
keyRing: keyRing.id,
rotationPeriod: '7776000s',
lifecycle: {
preventDestroy: true
}
})
}
}
|
StackやConstructで細かく分割をしていない理由は、
- k8s(kustomize)管理側が多くそこまでGCPリソースを使っていない(標準的なWeb構成部分しかない)
- (小規模で)state分割点について考えるのが面倒(育っていく過程で分割すれば良いなーと)
- プレフィックスやサフィックスに現状魅力感じない(Constructの話)
ベストプラクティスにdev, prodのような環境ごとの分離が書いてあるが、そもそもGCPプロジェクト分けていてGCSBackendを切り替えるようにしていれば関係ないかと。