用Golang开发的Terraform CDK,试着创建Google的资源

首先

你好,我是Isso!
这次我打算使用Golang的CDK for Terraform来构建GCE实例。

(Terraform 是在了解 CDK for Terraform 之前的概念)。

    • Terraform は IaC(Infrastructure as Code) の一種で、インフラ構成をコードとして管理できる機能を持つツールです。

 

    • GCP や AWS などのリソースを管理する (一括でリソースを構築したり、変更したり、削除する) ことができます。

 

    コードベースなので、バージョン管理なども行うことができるのも利点です。

请参阅以下详细信息。

CDK for Terraform是什么

通过使用CDK for Terraform,可以将Terraform的代码从TypeScript、Python、Java、C#和Golang生成,尽管Terraform使用了自己独特的语法(HCL,HashiCorp配置语言)。

请点击这里获取更详细的信息。

我认为CDKTF的优点和缺点。

    • 良い点

 

    • 
- HCL を学習しなくて良く
、既存の言語の知識, スキルを使用可

 

    • 
- 使用するプログラミング言語の知識を活かせる

 

    • 
- 静的解析もしやすい

 

    • 

- IDE の補完や実行 (synth) 時にある程度テストしてくれる

 

    • 

- コードの再利用性が高い

 

    • 

- インフラ知識が無い人でもコードを読めばどんなインフラ構成なのか理解がしやすい

 

    • 悪い点

 

    • 
- 比較的新しく、コミュニティや情報が少ない
、またバージョンアップがすごく早い

 

    
- プロバイダーが言語のライブラリを提供している必要がある (TF より対応範囲が少ない)

这次可用的资源

我將建立這樣的資源。

image.png

安装

安装各种软件。

安装Terraform

macOS可以使用HomeBrew来安装,Windows可以使用Scoop之类的工具来安装。

image.png

安装 gcloud 命令行界面 (CLI)

使用Terraform时,可以通过启用API和借用账户权限(即无需使用服务账户凭据文件)来操作资源。

image.png

安装Terraform的CDK

使用npm进行安装。

image.png

项目的初始化

在一个空文件夹中执行以下操作。

    • 今回は Golang を使用するため Golang の初期化テンプレートを要求します。

 

    今回はローカルで実行するようにします。(つまり普通であれば状態管理ファイル tfstate を S3 などに保存するところをローカルに保存するようにします)
cdktf init --template=go --providers=hashicorp/google --local

由于会被问及各种各样的问题,请设置相应的选项。

image.png

会创建如下文件。

image.png

写代码

我们将在生成的 main.go 文件中编写 NewMyStack 函数。

image.png

创建提供者和启用 API

为了管理Google的资源,我们定义了Google提供者。请适当设置使用的区域、项目ID和区域以建立GCE的资源。同时,为了建立GCE的资源,我们将预先启用GCE的API。

image.png

创建 GCE 实例

按照先前的要求,定义资源。

image.png

代码的完整内容

如果按上述的代码进行编写,最终将变成以下的样子。

package main

import (
	"github.com/aws/constructs-go/constructs/v10"
	"github.com/aws/jsii-runtime-go"
	"github.com/cdktf/cdktf-provider-google-go/google/v5/computeinstance"
	"github.com/cdktf/cdktf-provider-google-go/google/v5/projectservice"
	"github.com/cdktf/cdktf-provider-google-go/google/v5/provider"
	"github.com/hashicorp/terraform-cdk-go/cdktf"
)

func NewMyStack(scope constructs.Construct, id string) cdktf.TerraformStack {
	stack := cdktf.NewTerraformStack(scope, &id)

	// Google Provider を作成する
	provider.NewGoogleProvider(stack, jsii.String("google"), &provider.GoogleProviderConfig{
		Region:  jsii.String("asia-northeast1"),
		Project: jsii.String("rat-cdktf-test"), //  Your Google Project ID Here
		Zone:    jsii.String("asia-northeast1-b"),
	})

	// API を有効にする
	apis := map[string]string{
		"ComputeEngine": "compute.googleapis.com",
	}
	for name, service := range apis {
		projectservice.NewProjectService(stack, jsii.String(name), &projectservice.ProjectServiceConfig{
			Service:                  jsii.String(service),
			DisableDependentServices: jsii.Bool(true),
		})
	}

	// GCE のインスタンスを作成する
	computeinstance.NewComputeInstance(stack, jsii.String("test-instance"), &computeinstance.ComputeInstanceConfig{
		Name:        jsii.String("test-instance"),
		MachineType: jsii.String("e2-micro"),
		Zone:        jsii.String("asia-northeast1-b"),
		BootDisk: &computeinstance.ComputeInstanceBootDisk{
			InitializeParams: &computeinstance.ComputeInstanceBootDiskInitializeParams{
				// google_compute_image のリファレンスを参照して、image を指定する
				Image: jsii.String("projects/debian-cloud/global/images/family/debian-11"),
				Size:  jsii.Number(10),
				Type:  jsii.String("pd-standard"),
			},
		},
		NetworkInterface: &[]computeinstance.ComputeInstanceNetworkInterface{
			{
				Network: jsii.String("default"),
			},
		},
	})

	return stack
}

func main() {
	app := cdktf.NewApp(nil)

	NewMyStack(app, "test-cdktf-for-google")

	app.Synth()
}

使用 Terraform 执行 CDK 来创建资源。

终于要执行 CDK for Terraform 来建立资源了。

# Google Project ID
proj=your-google-cloud-project-id

# gcloud コマンドを使用できるようにログイン
gcloud auth login
gcloud config set project ${proj}

# CDKTF でサービスアカウントの権限を借用するためアプリケーションログイン
gcloud auth application-default login

# Terraform を実行するのに必要な Cloud Resource Manager API を有効にする
gcloud services enable cloudresourcemanager.googleapis.com --project ${proj}

# CDK for Terraform を実行してリソースを建てる
cdktf deploy

当显示出资源的差异并询问是否真的要部署时,我会选择批准。

如果能达到以下的要求,就算是成功了。

image.png

你真的建立了实例吗?

image.png

摧毁

Terraform 不仅可以一键构建资源,还可以进行资源的销毁。

cdktf destroy

如果符合以下情况,就会被删除。

image.png

由于在Terraform中启用了GCE的API,因此GCE页面变为了在启用API之前的界面。

image.png

附赠

可以将要创建的实例的全局地址存储在变量中,然后与其他提供者结合使用,可以实现将其注册到Cloudflare DNS的功能。

image.png

总结一下

这次我们使用CDK for Terraform和Google Provider构建了GCE实例。
不仅仅是Terraform,在一次命令中创建资源减少了人工手工操作的部分,降低了出错的风险,而且更加方便!
此外,CDKTF还可以使用诸如Golang等编程语言来使用Terraform功能,无需记住HCL语言,这使得后端工程师更容易执行以前由SRE完成的任务,这点也很好!

请务必试一试!