🐣

Terraform 初心者が CDK for Terraform を触ってみた所感 #jawsug_cdk

2022/09/07に公開

この記事は 2022/09/07 に開催された JAWS-UG CDK支部 #3 にて発表した 「Terraform 初心者が CDK for Terraform を触ってみた」というタイトルのLTの内容を記事にしたものです。

CDK for Terraform とは

CDK for Terraform (以下、CDKTF) は 2020年7月にプレビューとして発表され、2022年8月12日に GA になりました 🎉
https://aws.amazon.com/jp/blogs/news/cdk-for-terraform-on-aws-jp/

CDK for Terraform は簡単に言うと、Terraform がサポートしているクラウド・プラットフォームのリソースを プログラミング言語( TypeScript、Python、Go、C#、Java )で記述できるツールです。
CDK for Terraform で書いたコードは最終的に Terraform のコードとして吐き出され、Terraform と同じようにデプロイできます。
開発者にとっては、プログラミング言語を使いながら Terraform のメリット(デプロイ速度、Lifecycle などの独自の機能)を享受できるのが強みです。

公式ドキュメントはこちら
https://www.terraform.io/cdktf

なぜ CDK for Terraform を触ろうと思ったのか

私自身は CDK 歴が1年くらい、Terraform は全くの初心者です。
これまで 2〜3年ほど AWS を触っていたのですが、最近 Google Cloud をちょこちょこ触る機会があり、Google Cloud のリソースも TypeScript で定義できたらいいのにな、と思っていたところに CDKTF の GA のニュースが飛び込んできました 😄

今後 CDK for Terraform ユーザーが増え、エコシステムが盛り上がってほしいという気持ちで、とりあえず自分でも触ってみることにしました。

実際に触ってみる

せっかく Terraform をラップした CDK for Terraform を触るので、AWS リソースのみのデプロイではなく、1ファイルで AWS と Google Cloud に同時にデプロイできるのかを試してみます。

実際に AWS S3 と Google Cloud Storage に同時にデプロイするためのサンプルコードを以下のリポジトリに用意しました。
https://github.com/MayForBlue/cdktf-lt-sample

コードを少し解説していきます。

前提条件

サンプルコードを動かすための前提条件です。

  • AWS CLI のセットアップ(クレデンシャルの設定など)ができていること

  • Google Cloud のサービスアカウントの設定ができていること

  • cdktf-cli がインストール済みであること

CDK for Terraform のプロジェクトのセットアップ

一から CDKTF のプロジェクトを用意する場合は以下のセットアップが必要です。
(サンプルコードを動かす場合は不要です)

プロジェクトのセットアップ

CDKTF を利用するディレクトリで以下のセットアップコマンドを実行します。

$ cdktf init --template=typescript --local

プロバイダーのインストール

CDKTF のプロジェクトで使用するプロバイダーはあらかじめプロジェクトにインストールする必要があります。
今回は以下のように AWS / Google Cloud のプロバイダーをインストールしました。

$ npm install @cdktf/provider-aws
$ npm install @cdktf/provider-google

プロバイダーの詳細や他に利用できるプロバイダーについては以下の公式ドキュメントを参照してください。
https://www.terraform.io/cdktf/concepts/providers

サンプルコード

前述のリポジトリの main.ts のコードです。(今回触ったのはこのコードのみです)

import { Construct } from 'constructs'
import { App, TerraformStack } from 'cdktf'
import { AwsProvider, s3 } from '@cdktf/provider-aws'
import { GoogleProvider, StorageBucket } from '@cdktf/provider-google'
import * as path from 'path'
import * as fs from 'fs'

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

    // AWS
    new AwsProvider(this, 'aws', { region: 'ap-northeast-1' })

    new s3.S3Bucket(this, 'bucket', {
      bucket: 'BUCKET_NAME',
    })

    // Google Cloud
    const credentialsPath = path.join(__dirname, 'google.json')
    const credentials = fs.existsSync(credentialsPath)
      ? fs.readFileSync(credentialsPath).toString()
      : '{}'

    new GoogleProvider(this, 'googleCloud', {
      region: 'asia-northeast1',
      project: 'PROJECT_NAME',
      credentials,
    })

    new StorageBucket(this, 'strageBucket', {
      name: 'BUCKET_NAME',
      location: 'ASIA-NORTHEAST1',
    })
  }
}

const app = new App()
new MyStack(app, 'cdktf-lt-sample')
app.synth()

コードの解説

上記のコードを簡単に解説します。

👇 それぞれ AWS / Google Cloud のプロバイダーを用意しています。

    new AwsProvider(this, 'aws', { region: 'ap-northeast-1' })
    new GoogleProvider(this, 'googleCloud', {
      region: 'asia-northeast1',
      project: 'PROJECT_NAME',
      credentials,
    })

👇 ここは Google Cloud のサービスアカウントのクレデンシャルを読み込んでいる部分です。

    const credentialsPath = path.join(__dirname, 'google.json')
    const credentials = fs.existsSync(credentialsPath)
      ? fs.readFileSync(credentialsPath).toString()
      : '{}'

サービスアカウントの鍵の生成・ダウンロードの方法を知りたい方は以下のドキュメントを参照してみてください。
https://www.ibm.com/docs/ja/urbancode-deploy/6.2.7?topic=platform-creating-key-file-google-cloud

👇 この部分で実際にデプロイする AWS S3 / Google Cloud Storage のリソースを定義しています。

    new s3.S3Bucket(this, 'bucket', {
      bucket: 'BUCKET_NAME',
    })
    new StorageBucket(this, 'strageBucket', {
      name: 'BUCKET_NAME',
      location: 'ASIA-NORTHEAST1',
    })

PROJECT_NAME / BUCKET_NAME についてはそれぞれ必要な値を設定してください。

デプロイ

サンプルコードについては以下のセットアップ後、デプロイコマンドを実行することができます。

  • リポジトリのクローン
  • npm i の実行
  • AWS CLI / Google Cloud のクレデンシャル設定

下記のコマンドを実行して実際にデプロイができます。

npm run cdktf deploy

実際にデプロイした結果をマネジメントコンソールで確認してみた結果がこちら👇

AWS S3

Google Cloud Storage

CDK for Terraform を使うことで、TypeScript で定義したリソースを AWS / Google Cloud に同時にデプロイできました 🎉

デプロイしてみて感じたこと

まず、普段 CDK を触っている自分からすると、CDKTF のデプロイがめちゃくちゃ速く感じました。CDK ( or CloudFormation ) と Terraform のアーキテクチャの違いなので厳密に比較する部分ではないかもしれませんが、この部分については CDKTF を利用するメリットかなと思いました。

プロバイダーを読み込む部分について、コードを書いていて、リソース作成の際にどのプロバイダーを読み込むのか、コードの記述の順序など関係があるのか気になったので順番を入れ替えたりしてみたのですが、順番を変えても特に動きに変化はありませんでした。
宣言されたリソースを見て、内部で利用するプロバイダーを判断しているのかなと想像しています。

プロバイダーの読み込みにも関連する部分なのですが、実際にマルチクラウドな環境で CDKTF を利用するとなった場合、ファイル分割 / ディレクトリ分割には考慮するポイントがたくさんありそうなので、このへんの知見が溜まっていくとおもしろいなと思いました。

また、今回は Terraform の知識はほとんどなくても問題ありませんでしたが、実際に利用するとなると、エラーハンドリングや Terraform ならではのリソース管理の考え方などの部分で Terraform の知識は絶対に必要になると思いました。

まとめ

CDK for Terraform を使うことで AWS 以外のクラウドのリソースも、プログラミング言語で / CDK の書き味で 定義できました。
開発での利用ももちろんですが、CDK ユーザーが Terraform に入門したいとなった場合にとっかかりとして触ってみるのもおもしろそうだなと思いました。

CDK 好き / AWS 以外のクラウドも利用するユーザーとしてはめちゃくちゃ育ってほしいサービスなので、今後ユーザーやコントリビューターが増え、サービスが育っていくことを期待しています!

Discussion