Google Cloud:CDK for TerraformのJavaでIaCを構築する(MacBook)

TerraformをGoogle Cloudで使うシリーズです。
2023.03.06

IaC(Infrastructure as Code)の必要性

企業でGoogle Cloudを使用しインフラを構築するにあたりCloudコンソールからポチポチと行う方法とCloud Development ManagerというGoogle Cloud独自の構築方法、そして今回使用するTerraformがあります。

今回、なぜTerraformを選定したかというと、Google以外のクラウドでも汎用的に構築でき、さらに昨年の夏頃に発表されたCDK for TerraformをJavaを使いGCP環境をデプロイしてみたかったからです。(Javaはfor文やif文、switch文などの基本コードのみわかるのでレベルを上げたいとも思った)

今後、それをブログにするかわかりませんし、今回の情報も既知情報かと思いますが、他のブログなど見てわかりにくかった箇所があるので備忘録も兼ねてブログにしたいと思います。

今回の手順

【実施手順】

1.Apache Mavenのインストール

2.cdktfのインストール

3.cdktfで初期化

4.プロバイダーの指定

Homebrewがインストールされていること前提での作業になりますので、前回の記事を参考にして読んでください。
Google Cloud:Mac BookにTerraformをインストールしてみた

1.Apache Mavenのインストール

Apache MavenがないとJavaが使用できないため、先にインストールしていきます。
ちなみに、Home brewがインストールされている前提で進めていきますのでご了承ください。
下記のコマンドでインストール可能なバージョンを確認します。

brew search maven

すると下記のようにバージョンを確認できました。
(また使用するプロジェクトのディレクトリを先に作成しておきました。mkdir testproject)

××××××@××××××× testproject % brew search maven

==> Formulae

maven maven-shell maven@3.3

maven-completion maven@3.2 maven@3.5

今回は1番左のmavenを選択して最新のものを取得します。(@3.2とか-shellじゃない左上のバージョン)

brew install maven

インストールが完了したためmvnコマンド(mvn -v)を確認します。

×××××.××××××@××××× testproject % mvn -v

Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29)

Maven home: /opt/homebrew/Cellar/maven/3.8.7/libexec

~以下諸略~

2.cdktf cliのインストール

下記のコマンドでインストールしていきます。
※Homebrewがインストールされていればnpmも使えるはずです(たしか...)

npm install --global cdktf-cli@latest(安定版)

npm install --global cdktf-cli@next(開発版)

また、すでにTerraform CLI(v1.1以上)とNode.js、npm(v16以上)がインストールされているのが条件になります。

次にインストールしたcdktfで初期化してJavaを使えるようにセットアップしていきます。

3.初期化

3-1.cdktf initでプロジェクトを初期化

先ほどインストールしたcdktfコマンドを用いて、initで初期化していきます。また、プロジェクトは既にtestprojectなるものを作成してあります。

(こちらのコマンドは指定した言語に必要なファイル一式を用意してくれます。testprojectで初期化実行。)

cdktf init --template=java --local

すると下記のような質問形式で入力していく文が現れます。

××××××@××××× testproject % cdktf init --template=java --local

? Project Name iac-test-firstproject

? Project Description

? Do you want to send crash reports to the CDKTF team? See

https://www.terraform.io/cdktf/create-and-deploy/configuration-file#enable-crash

-reporting-for-the-cli for more information Yes

  • Project Name
    • 名前、デフォルトでディレクトリ名が使用される
  • Project Description
    • プロジェクトの説明を記入
  • Do you want to send crash reports to the CDKTF team?
    • クラッシュレポートをGoogleへ送信するかどうか、デフォルトではYes

ちなみにもし上記のコマンドを実行し、それぞれ入力していってもMavenがインストールされていなければ、下記のように記載されているURLからインストールしてこいとの指示がなされます。

Unable to find "mvn". Install from https://maven.apache.org/install.html

3-2.Node.jsのモジュールのインストール

npmコマンドでGoogle Cloudリソースの定義に必要なNode.jsのモジュールをインストールできます。

npm install @cdktf/provider-google

こちらにインストールコマンドの情報が載っています。
Terraform CDK google Provider ~> 4.0

4.プロバイダーの指定

4-1.cdktf.jsonで指定

カレントディレクトリが作成したtestprojectであれば、lsコマンドで下記のようなフォルダ/ファイルを確認できます。

cdktf.json package-lock.json src

help package.json target

node_modules pom.xml

そして、cdktf.json内にある"terraformProviders":にGoogle Cloudを入力していきます。
ソースは下記URLにあります。
cdktf/cdktf-provider-google

"language": "java",

"app": "mvn -e -q compile exec:java",

"projectId": "×××××××××××489bc99",

"sendCrashReports": "true",

"codeMakerOutput": "src/main/java/imports",

"terraformProviders": ["google@~> 4.0"],

"terraformModules": [],

"context": {

"excludeStackIdFromLogicalIds": "true",

"allowSepCharsInLogicalIds": "true"

}

今回はgoogle@~> 4.0を入れました。

4-2.cdktf getでプロバイダの取得&コード生成

下記コマンドを実行します。

cdktf get

生成されたコードは下記にて確認出来ます。

clameso××××××@××××× testproject % cat src/main/java/com/mycompany/app/Main.java

package com.mycompany.app;

import software.constructs.Construct;

import com.hashicorp.cdktf.App;

import com.hashicorp.cdktf.TerraformStack;

public class Main

{

public static void main(String[] args) {

final App app = new App();

new MainStack(app, "testproject");

app.synth();

}

}

これでソースの定義をする準備が整いました。

まとめ

以上でcdktf cliをインストールしてJavaでリソースを定義するところまでなんとか漕ぎ着けました。

実際にやってみても、ネットの情報通りには行かないことが多々ありとにかく色々試してみました。みなさまもこの記事のようには行かない場合もあるかと思いますので、その時は複合的に色々なソースを参考にして構築していってみてください。