使用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后,请从控制台界面确认是否已成功创建。

スクリーンショット 2023-08-12 20.25.56.png

结束吧。

bannerAds