使用Terraform来部署GCP Cloud Run
使用 Terraform 管理 Cloud Run 的笔记。
前提 (Qian ti)
-
- terraform がインストールされている
-
- gcloud cli がインストールされてる
- GCPのプロジェクトを作成し、gcloud projects list を叩いたときに作成したプロジェクトが表示されている
设置Google Cloud Platform(GCP)的配置。
基本上我们会使用gcloud命令来操作,而不是在控制台界面上输入命令。
使用gcloud命令激活项目。
首先,让我们将要处理的项目在Terraform中设为活动状态。
gcloud config set project [PROJECT_ID]
执行后,请确认是否已激活。执行以下命令,将返回当前配置的默认GCP项目ID。
gcloud config get-value project
创建适用于Terraform的服务帐号(SA)
通过执行以下命令,可以为 Terraform 创建一个 GCP 服务帐号。
gcloud iam service-accounts create サービスアカウントの名前 \
--description="説明文(任意)" \
--display-name="表示名"
授予SA权限
给之前创建的服务帐户分配权限。
gcloud projects add-iam-policy-binding プロジェクトID \
--member="serviceAccount:作成したサービスアカウントの名前@プロジェクトID.iam.gserviceaccount.com" \
--role="roles/editor"
获取SA的密钥
获取已创建的服务帐户密钥(JSON文件)。
gcloud iam service-accounts keys create 任意のパス/key.json \
--iam-account 作成したサービスアカウントの名前@プロジェクトID.iam.gserviceaccount.com
把Docker镜像推送
当在Cloud Run中运行应用程序时,需要将Docker镜像推送到GCR(Google容器注册表)。本次我们将创建一个简单的Go语言应用程序和Dockerfile。
# Goの公式イメージをベースにする
FROM golang:1.20 AS build-env
# 作業ディレクトリを設定
WORKDIR /app
# 必要なGoのモジュールをコピー
COPY go.mod .
COPY go.sum .
# 依存関係をダウンロード
RUN go mod download
# ソースコードをコピー
COPY . .
# バイナリをビルド
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# ランタイムイメージのステージ
FROM gcr.io/distroless/base-debian10
# ビルドされたバイナリをコピー
COPY --from=build-env /app/main /app/main
# ポート8080を公開
EXPOSE 8080
# アプリケーションを実行
CMD ["/app/main"]
请参考以下内容以查看应用程序的代码。
请在包含 Dockerfile 文件的目录中进行本地构建 Docker 镜像的操作。
docker build -t sample-app-001 .
给图像打标签。
docker tag sample-app-001 asia.gcr.io/sample-pro-395702/sample-app-001
将图像推送到 GCR。
docker push asia.gcr.io/プロジェクトID/sample-app-001
让我们确认图像是否已推送。只需运行以下命令,推送的图像应该会显示出来。
gcloud container images list --repository=asia.gcr.io/プロジェクトID
使用terraform来描述和部署资源。
只有达到这个程度才能开始进行基础设施的代码化。目录结构如下所示。
└── infrastructure-project
├── main.tf
└── variables.tf
首先,在 variable.tf 文件中定义变量。这次我们将定义项目ID和地区。
variable "project_id" {
description = "project id"
type = string
default = "プロジェクトID"
}
variable "default_region" {
description = "The default region for resources"
default = "asia-southeast1"
}
接下来,在 main.tf 文件中设置 GCP 的 google 提供程序。顺便说一下,提供程序是用于操作和管理特定的云服务或基础设施技术的插件。
provider "google" {
credentials = file("path/key.json") // 「SA のキーを取得する」で生成したkey.jsonまでのパスを指定
project = var.project_id // variable.tf を参照してる
region = var.default_region
}
如果你能做到这一步,就执行 terraform init 进行初始化。
terraform init
当成功时,将输出如下日志。
Terraform has been successfully initialized!
接下来,我们将描述Cloud Run资源的定义。将其添加到main.tf文件的provider部分之下。
resource "google_cloud_run_service" "sample-app-001" {
name = var.project_id
location = var.default_region
template {
spec {
containers {
image = "asia.gcr.io/${var.project_id}/sample-app-001"
}
}
}
traffic {
percent = 100
latest_revision = true
}
}
顺便提一句,使用”${var.project_id}”创建的Docker镜像,请指定为asia.gcr.io/${var.project_id}/sample-app-001。
如果已经设置好了,就执行 terraform apply。
terrafrom apply
当您成功部署到Cloud Run后,请从控制台界面确认是否已成功创建。

结束吧。