问题描述
希望在Terraform中模拟持续部署基础设施,但碰到一个问题:Cloud Run需要一个容器镜像的路径,而该镜像的路径根据其 ‘版本’ 的变化而变化。用户使用Cloud Build在每次git推送事件到GitHub仓库的main
分支时进行构建,并推送镜像,镜像路径的格式如下:eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA
。在Terraform中,用户想知道如何配置Cloud Run的镜像,特别是在初始基础设施部署时镜像路径尚不存在的情况下。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
为了解决这个问题,可以采取以下步骤:
使用通配符(Wildcards)来指定镜像
在Terraform的Cloud Run资源定义中,你可以使用通配符来指定镜像的路径。这将使得Cloud Run能够动态地指向最新的镜像,而不需要提前知道具体的版本号。在路径中使用通配符*
来匹配版本号部分。
下面是一个示例的Terraform配置,展示了如何在Cloud Run中使用通配符来指定镜像路径:
resource "google_cloud_run_service" "example_service" {
name = "example-service"
location = "us-central1"
template {
spec {
containers {
image = "eu.gcr.io/${var.project_id}/${var.repo_name}/${var.service_name}:*"
}
}
}
}
在上述配置中,${var.project_id}
、${var.repo_name}
、${var.service_name}
是变量,你需要根据实际情况设置它们的值。在image
字段中,我们使用了通配符*
来匹配版本号,这样Cloud Run会始终使用最新的镜像。
使用Cloud Build的输出来获取镜像路径
另一种方法是在Terraform中使用Cloud Build的输出来获取镜像路径。你可以在Cloud Build的构建步骤中将镜像路径输出到某个文件(例如一个.txt
文件),然后在Terraform中读取该文件,从而获得镜像路径。这样可以确保在Terraform部署Cloud Run服务时,镜像路径已经存在。
以下是一个示例的Cloud Build配置和Terraform配置,展示了如何使用输出来获取镜像路径:
Cloud Build 配置(cloudbuild.yaml
):
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA']
- name: 'gcr.io/cloud-builders/gcloud'
args: ['secrets', 'versions', 'access', 'latest', '--secret=my-secret', '--data-file=/workspace/image_path.txt']
Terraform 配置:
data "local_file" "image_path" {
depends_on = [google_cloud_run_service.example_service]
filename = "${path.module}/image_path.txt"
}
resource "google_cloud_run_service" "example_service" {
name = "example-service"
location = "us-central1"
template {
spec {
containers {
image = file("${data.local_file.image_path.content}")
}
}
}
}
在上述配置中,我们在Cloud Build中使用了一个名为image_path.txt
的文件来存储镜像路径。然后,我们在Terraform的配置中使用了local_file
数据源来读取该文件,然后将镜像路径传递给Cloud Run服务。
以上两种方法都可以让你在Cloud Run中动态地指向最新的容器镜像。你可以根据自己的需求选择其中一种方法来实现。