想要通过 Terraform 部署 Google Cloud Run 服务

Ani*_*ket 1 google-cloud-platform terraform terraform-provider-gcp google-cloud-run

我想使用 terraform 部署一个谷歌云运行服务。当我尝试通过“端口”块进行部署以定义容器端口时,出现错误,我必须从模板标记传递容器端口,但无法这样做。这是我的 .tf 文件 -

resource "google_cloud_run_service" "default" {
  name     = "cloudrun-srv"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "us.gcr.io/xxxxxx/xxxx.app"

        port {
          container_port = 19006
        }
      }
    }
  }

  traffic {
    percent         = 100
    latest_revision = true
  }
}

data "google_iam_policy" "noauth" {
  binding {
    role = "roles/run.invoker"
    members = [
      "allUsers",
    ]
  }
}

resource "google_cloud_run_service_iam_policy" "noauth" {
  location    = google_cloud_run_service.default.location
  project     = google_cloud_run_service.default.project
  service     = google_cloud_run_service.default.name

  policy_data = data.google_iam_policy.noauth.policy_data
}

output "url" {
  value = "${google_cloud_run_service.default.status[0].url}"
}
Run Code Online (Sandbox Code Playgroud)

使用端口标签,这里是错误 -在此处输入图片说明

如果我没有通过端口块,这里是错误 - 在此处输入图片说明

我必须将容器端口值传递为 19006,因为我的容器仅在该端口上运行。我如何传递容器端口 19006 而不是默认端口 8080。 在此处输入图片说明

Kol*_*ban 5

我查看了 Google 公开的用于创建 Cloud Run 服务的 REST API。

这从这里的条目开始:

POST https://{endpoint}/apis/serving.knative.dev/v1/{parent}/services

其中 body 包含一个Service

其中包含一个ServiceSpec

其中包含一个RevisionRemplate

其中包含一个RevisionSpec

其中包含一个容器

其中包含一个ContainerPort

如果我们现在将其映射到 Terraform 扩展的源以处理 Cloud Run 服务的创建,我们会发现:

https://github.com/terraform-providers/terraform-provider-google/blob/2dc3da62e3844d14fb2136e09f13ea934b038411/google/resource_cloud_run_service.go#L90

在评论中,我们发现以下内容:

在修订的上下文中,我们禁止使用此 Container 的许多字段,包括:名称、端口和 volumeMounts。运行时合约记录在此处:https : //github.com/knative/serving/blob/master/docs/runtime-contract.md

虽然名称和volumeMounts似乎确定在这一点上我了,我不感应,之所以ports不被映射。

尽管如此,我似乎看到无法通过 Terraform 指定端口似乎是明确的,而不是遗漏。我似乎也看到 Google 的 REST API 中确实存在指定端口的功能。

然后我打算建议你通过 Github 提出一个缺陷,但后来想知道它是否已经存在。我做了一些挖掘,已经有一个缺少功能的请求:

允许为 google_cloud_run_service 指定“container_port”和“request_timeout”

我的信念是,您问题的核心答案将变为:

您尝试做的事情应该与 Terraform 一起使用,并且已作为问题提出,我们必须等待 Terraform 提供程序中的解决方案。