[CDK for Terraform] はじめに用意したディレクトリ構造、ファイル分割

下記の感じで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を切り替えるようにしていれば関係ないかと。

Built with Hugo
テーマ StackJimmy によって設計されています。