6
1

More than 1 year has passed since last update.

CDK for Terraform 入門 Google Cloud Platform 編

Last updated at Posted at 2023-01-24

対象の読者

Google Cloud PlatformでCDK for Terraform(以下CDKTF)を使ってみたいが、始めかたのわからない方

CDKTFとは

CDKTFとは、Terraformを汎用のプログラミング言語で操作できる仕組みです。

(CDKTFでない)Terraformでは、専用のHashiCorp Configuration Languageで記述します。
一方、CDKTFではTypeScript, Python, Go, C#, Javaで記述できます。

ただし、TypeScript以外は事例が極端に少ないので、特段の理由のない限りはTypeScriptを勧めます。

前提

  • gcloud CLI設定済み。

CDKTF CLIのインストール

npm install --global cdktf-cli@latest

初期化

cdktf init --template typescript --local

プロバイダーの追加

Google Cloudを使用するので、googleプロバイダーを追加します。

cdktf provider add google

ファイルの確認

この時点で以下のディレクトリ、ファイルができました。

cdktf.out/
node_modules/
__tests__/
.gitignore
.npmrc
cdktf.json
help
jest.config.js
main.ts
package-lock.json
package.json
README.md
setup.js
terraform.qiita-cdktf-start.tfstate
tsconfig.json

本記事の範囲では、触るのはmain.tsのみです。

デプロイ(1)

main.tsの初期状態は以下のとおりです。

// Copyright (c) HashiCorp, Inc
// SPDX-License-Identifier: MPL-2.0
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";

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

    // define resources here
  }
}

const app = new App();
new MyStack(app, "qiita-cdktf-start");
app.synth();

このあと、 // define resources here の部分にコーディングしていきます。

マニフェストは空の状態ですが、一度ためしにデプロイしてみます。

cdktf deploy

作成すべきリソースがないので、以下の出力で正常終了しました。

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

コーディング

Cloud Storage Bucketを1つ作成してみます。

最初に追加したgoogleプロバイダーをインポートします。

import * as google from '@cdktf/provider-google';

以降、Visual Studio Codeでは google. と入力すると、補完が利くようになり、コーディングが楽になります。

次にプロバイダーを定義します。

    new google.provider.GoogleProvider(this, 'google', {
      project: 'qiita-cdktf-start',
    });

project にはプロジェクトIDを指定します。

最後にCloud Storage Bucketを定義します。

    new google.storageBucket.StorageBucket(this, 'storage', {
      location: 'us-central1',
      name: 'qiita-cdktf-start-bucket',
    });

Cloud Storage Bucketの場合 location name が必須設定です。

なお、設定の不備があると警告がでるので、必須の設定項目がわかります。
たとえば以下は location の設定不足です。
error.png

main.ts全体は以下のようになりました。

// Copyright (c) HashiCorp, Inc
// SPDX-License-Identifier: MPL-2.0
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import * as google from '@cdktf/provider-google';

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

    new google.provider.GoogleProvider(this, 'google', {
      project: 'qiita-cdktf-start',
    });

    new google.storageBucket.StorageBucket(this, 'storage', {
      location: 'us-central1',
      name: 'qiita-cdktf-start-bucket',
    });

  }
}

const app = new App();
new MyStack(app, "qiita-cdktf-start");
app.synth();

デプロイ(2)

cdktf deploy

Cloud Storage Bucketを作成したので 1 added となりました。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

なお --auto-approve オプションをつけると、確認のプロンプトをスキップできます。

cdktf deploy --auto-approve

以下スクリーンショットのとおり、Cloud Storage Bucketが作成されました。

cloud-storage.png

後始末

以下のコマンドで作成したリソースを破棄できます。

cdktf destroy

おわりに

筆者は、「Google CloudでInfrastructure as Codeをしたいが、HCLを覚えるのは面倒」という動機でCDKTFを使い始めました。

備考

作成したソースコード

Google Cloud各種リソースのリファレンス

TerraformのGoogle Cloud用ドキュメントを参照します。
https://registry.terraform.io/providers/hashicorp/google/latest/docs

パラメータ名が変わることに留意してください。
たとえばHCLでは uniform_bucket_level_access ですが、CDKTF TypeScriptでは uniformBucketLevelAccess になります。
Visual Studio Codeであれば、コーディング中に候補を表示してくれるので、あまり問題ありません。

ローカルかTerraform Cloudか

初期化のコマンドで

cdktf init --template typescript --local

のようにlocalオプションを指定しました。

この場合、ローカルのtfstateファイルで状態管理します。
--localオプションなしの場合、Terraform Cloudで状態管理します。

--localオプションの有無 状態管理
あり ローカル
なし Terraform Cloud

本記事ではTerraform Cloudのセットアップを避けるためにローカル管理としました。
会社など複数名でTerraformを操作する場合には、Terraform Cloudが便利かと思います。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1