【IaC】GCP × CDK for Terraform で構成管理をする

  • Google Cloud
  • インフラ
  • サーバレス
  • エンジニア

投稿日:

はじめに

Google Cloud で IaC を行う手段として、Deployment Manager や Terraform を使用する方法がよく紹介されていますが、IaC を yaml や HCL 等の宣言型言語ではなく、Typescript や Python 等のプログラミング言語を利用して実装したいという方には CDKTF という選択肢があります。
本記事では CDK for Terraform (CDKTF)を使用して、Google Cloud のリソースをコードで管理する方法をご紹介します。

CDK for Terraform (CDKTF)とは

CDKTF とは HashiCorp 社と AWS 社の共同開発により開発された Typescript や Python 等で記述できる IaC ツールです。
元々、AWS では AWS CDK という CloudFormation(AWS のインフラプロビジョニングの仕組み)を介したプログラミングベースの IaC ツールを提供しており、これがベースとなっています。
CDKTF では AWS CDK の概念やライブラリを利用することを可能としつつ、Terraform CLI を介してインフラプロビジョニングを行うことができるようになりました。
これにより、Google Cloud を含む Terraform でサポートしている Cloud プロバイダであれば、CDKTF を利用してプログラミング言語ベースでの実装が可能となっています。

alt text

イメージ引用元: CDK for Terraform( https://developer.hashicorp.com/terraform/cdktf )

CDKTF を試してみる

それでは、CDKTF で Google Cloud のリソースをプロビジョニングしてみたいと思います。
CDKTF を利用するプログラミング言語としては Typescript を使用するものとします。

構築対象

今回は簡単なネットワークと WEB サーバを CDKTF で構築します。

具体的には以下を構築するものとします。

  • VPC/サブネット
  • Compute Engine (HTTP Server)
  • VPC firewall

構成図

構成図

前提条件

本記事では以下のツールのインストール及びセットアップがなされている前提で記載していますのでご留意ください。

CDKTF のインストール

以下を実行することで CDKTF CLI の最新の安定リリースを作業環境へグローバルインストールします。

sh
npm install --global CDKTF-cli@latest

CDKTF プロジェクトの作成

以下を実行して CDKTF の Typescript プロジェクトのひな形を作成します。

sh
cdktf init --template="typescript"

cdktf initを実行するとプロジェクト名や使用するプロバイダー等のオプションの選択を求められます。
この際、プロバイダーについては、What providers do you want to use?の質問で Google を選択します。

cdktf init

実行後、プロジェクトのひな形の作成とパッケージインストールが実行されます。
続いて、CDKTF で Google プロバイダーを使用するため、以下を実行してパッケージをインストールします。

sh
npm i -S @cdktf/provider-google

CDKTF コードの作成

CDKTF プロジェクトの初期構成は以下となっています。

CDKTF プロジェクト構成

.
├── .gitignore
├── __tests__
├── cdktf.json
├── help
├── jest.config.js
├── main.ts
├── node_modules
├── package-lock.json
├── package.json
├── setup.js
└── tsconfig.json

main.ts がプログラムのエントリーポイントになっており、main.tsの内容を次のように修正します。

main.ts

  • {project ID を指定}{バケット名を指定。}の部分を修正する必要があります。
  • Terraform の State データを GCS に保存するようにしているため、GcsBackendに指定するバケットを手動で作成する必要があります。(ローカルに保存する場合はnew GcsBackend部分の記述を削除します。)
    • CLI を使用したバケット作成コマンド: gsutil mb gs://{バケット名}
ts
import { Construct } from "constructs";
import { App, TerraformStack, GcsBackend } from "cdktf";
import {
  provider,
  computeNetwork,
  computeSubnetwork,
  computeInstance,
  computeFirewall,
} from "@cdktf/provider-google";

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

    // Google Provider
    // Terraform のHCLで記述する際と同様にProviderを宣言します。
    // projectの値部分にデプロイ先のGoogle CloudのプロジェクトIDを指定してください。
    new provider.GoogleProvider(this, "google", {
      project: "{project ID を指定}",
      region: "asia-northeast1",
    });

    // TerraformのstateデータをGCSに保存
    // Terraformでは、共同開発する際、Stateファイルをオブジェクトストレージ等に保存する必要があります。
    // GCSバケットを作成してバケット名を指定してください。
    new GcsBackend(this, {
      bucket: "{バケット名を指定。}",
      prefix: "cdktf-test",
    });

    // VPC
    const vpc1 = new computeNetwork.ComputeNetwork(this, "vpc-01", {
      name: "test-vpc-01",
      autoCreateSubnetworks: false,
    });
    const subnet1 = new computeSubnetwork.ComputeSubnetwork(this, "subnet-01", {
      name: "subnet-01",
      network: vpc1.selfLink,
      ipCidrRange: "10.0.0.0/24",
    });

    // HTTP Server
    new computeInstance.ComputeInstance(this, "server-01", {
      networkInterface: [
        {
          subnetwork: subnet1.selfLink,
          accessConfig: [{}],
        },
      ],
      zone: "asia-northeast1-a",
      bootDisk: {
        initializeParams: {
          image: "debian-cloud/debian-11",
        },
      },
      name: "server-01",
      machineType: "f1-micro",
      metadataStartupScript:
        "sudo apt-get update && sudo apt-get install apache2 -y && echo '

test

' | sudo tee /var/www/html/index.html", tags: ["http-server"], }); // firewall new computeFirewall.ComputeFirewall(this, "firewall-01", { name: `${vpc1.name}-allow-http`, network: vpc1.selfLink, allow: [ { protocol: "tcp", ports: ["80"], }, ], targetTags: ["http-server"], sourceRanges: ["0.0.0.0/0"], }); } } const app = new App(); new MyStack(app, "cdktf-test"); app.synth();

💡ポイント

  • AWS CDKと同様の要領でAPP、Stack、Constructを定義してインフラ構成を記述できます。
  • プロバイダー指定やStateデータの保存先等の設定等、通常のTerraformと同様に実装する必要があります。
  • AWS CDKでは、Cloudformation に構成データが保存されますが、CDKTFではTerraformと同様、ステートデータの保存先を検討する必要があり、今回はGCSのバケットに保存をするようにしています。

💡ポイント

Google PorviderのAPIについては、以下のTerraform のドキュメントを参考に調べます。
https://registry.terraform.io/providers/hashicorp/google/latest/docs

デプロイ

コーを作成後、以下を実行してデプロイ先の環境への変更を確認します。

sh
cdktf diff
alt text

💡ポイント
CDKTF実行時に認証エラーが発生する場合は`gcloud auth application-default login`を実行して認証してください。

以下を実行してデプロイします。

cdktf deploy
alt text

途中で承認を求められるためApproveを選択します。
その後、次のようにApply complete!と表示されたらデプロイ完了となります。

alt text

動作確認

コンソール上で VPC、Compute Engine が構築されていることを確認します。

VPC

alt text

Compute Engine

alt text

Compute Engine の外部 IP へアクセスすると以下のように WEB サーバが立ち上がっていることが確認できます。

Compute Engine の外部 IP へアクセス

alt text

クリーンアップ

以下を実行することでリソースの削除を実行します。

sh
cdktf destroy

また、ステートデータ保存用にバケットを作成した場合は削除します。

まとめ

CDKTF により、簡単な Google Cloud リソースの構成を Typescript で定義しデプロイを行ってみました。
使い慣れた言語で Google Cloud の IaC を行いたい方はぜひ CDKTF を試してみてください。

次回予告

引き続き、IaC関連のご紹介を予定しています。

ご期待ください!

著者紹介

伊藤忠テクノソリューションズ株式会社 山本 和輝

伊藤忠テクノソリューションズ株式会社
山本 和輝

クラウドアーキテクトとして、Google Cloud や AWS 等のパブリッククラウド案件を主に担当。

Pickup