用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](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/12-0.png)
安装
安装各种软件。
安装Terraform
macOS可以使用HomeBrew来安装,Windows可以使用Scoop之类的工具来安装。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/17-0.png)
安装 gcloud 命令行界面 (CLI)
使用Terraform时,可以通过启用API和借用账户权限(即无需使用服务账户凭据文件)来操作资源。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/20-0.png)
安装Terraform的CDK
使用npm进行安装。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/23-0.png)
项目的初始化
在一个空文件夹中执行以下操作。
-
- 今回は Golang を使用するため Golang の初期化テンプレートを要求します。
- 今回はローカルで実行するようにします。(つまり普通であれば状態管理ファイル tfstate を S3 などに保存するところをローカルに保存するようにします)
cdktf init --template=go --providers=hashicorp/google --local
由于会被问及各种各样的问题,请设置相应的选项。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/29-0.png)
会创建如下文件。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/31-0.png)
写代码
我们将在生成的 main.go 文件中编写 NewMyStack 函数。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/34-0.png)
创建提供者和启用 API
为了管理Google的资源,我们定义了Google提供者。请适当设置使用的区域、项目ID和区域以建立GCE的资源。同时,为了建立GCE的资源,我们将预先启用GCE的API。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/37-0.png)
创建 GCE 实例
按照先前的要求,定义资源。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/40-0.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](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/49-0.png)
你真的建立了实例吗?
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/51-0.png)
摧毁
Terraform 不仅可以一键构建资源,还可以进行资源的销毁。
cdktf destroy
如果符合以下情况,就会被删除。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/56-0.png)
由于在Terraform中启用了GCE的API,因此GCE页面变为了在启用API之前的界面。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/58-0.png)
附赠
可以将要创建的实例的全局地址存储在变量中,然后与其他提供者结合使用,可以实现将其注册到Cloudflare DNS的功能。
![image.png](https://cdn.silicloud.com/blog-img/blog/img/657d8685913a08637a6bd558/61-0.png)
总结一下
这次我们使用CDK for Terraform和Google Provider构建了GCE实例。
不仅仅是Terraform,在一次命令中创建资源减少了人工手工操作的部分,降低了出错的风险,而且更加方便!
此外,CDKTF还可以使用诸如Golang等编程语言来使用Terraform功能,无需记住HCL语言,这使得后端工程师更容易执行以前由SRE完成的任务,这点也很好!
请务必试一试!