[CDK for Terraform] 導入時のメモ

Stackについて

A stack represents a collection of infrastructure that CDK for Terraform (CDKTF) synthesizes as a dedicated Terraform configuration. Stacks allow you to separate the state management for multiple environments within an application.

Stackごとにstateが分離される模様
ref: https://www.terraform.io/cdktf/concepts/stacks

ベストプラクティスについて

ベストプラクティスはここにある

Terraformを直接使っているときと原則は変わってないと思われ

  • state分離 -> Stack分離
  • module(再利用可能なコンポーネント)関連 -> Construct
  • シークレットはterraform variable使う(TerraformVariable)

TerraformVariableの挙動、環境変数周り

現状、TerraformVariableは直接値を参照できないっぽい。
console.logで中を見たときに参照先を示すような文字列が入っているのみ。
GcsBackendで値を参照したときには正常に動作しなかった。

  • process.env.XXXで参照すべきところ
  • TerraformVariableで参照すべきところ(sensitive: trueオプション使いたいところ)

があるっぽい。

terraform importやterraform state周りのやり方について

cdktf.out/stacks/${stack_name}以下でやればよいっぽい。 ディレクトリ位置以外は特段変わりなく普通に下記のようにterraformコマンドが使える

1
2
3
terraform state list
terraform state rm xxx
terraform import xxx xxx

Constrct#idについて

CDKTF infers a unique name for each instance from its Construct#id and parent construct. Instances that share the same parent element are considered to be part of the same scope. If you instantiate multiple constructs within the same scope, you must set a different name for each instance to avoid naming conflicts.

同一スコープにおいてユニークでなければならない ref: https://www.terraform.io/cdktf/concepts/constructs

公式より下記

 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
27
28
29
30
31
32
import { Construct } from "constructs";
import { TerraformStack } from "cdktf";

class PublicS3Bucket extends Construct {
  public bucket: S3Bucket;
  constructor(scope: Construct, name: string) {
    super(scope, name); // This creates a new scope since we extend from construct

    // This bucket is in a different scope than the buckets
    // defined in `MyStack`. Therefore, it does not need a unique name.
    this.bucket = new S3Bucket(this, "bucket", { // 同一のthis(scope)でもう一つのbucketという名前のものを定義できない
      bucketPrefix: name,
      website: [
        {
          indexDocument: "index.html",
          errorDocument: "5xx.html",
        },
      ],
    });
  }
}

class MyStack extends TerraformStack {
  constructor(scope: Construct, name: string) {
    super(scope, name);

    // Both buckets are inside of the same stack, meaning they share
    // the same scope. Therefore, their names must be unique.
    new PublicS3Bucket(this, "first-bucket");
    new PublicS3Bucket(this, "second-bucket");
  }
}

ライブラリ

contracts.devにある

google_project_serviceに依存させてもスルーされる

CDK for Terraform関係ないだろうけど、depends_onでgoogle_project_serviceに依存させてもスルーされる 下記リンク先見る限りは一応は解決されている模様(以前はスクリプト書いて対応していたが…今は不要なはず?) ref: https://github.com/hashicorp/terraform-provider-google/issues/1393

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