Terraform:Cloud Run 服务上的 Cloud Endpoints?

Posted

技术标签:

【中文标题】Terraform:Cloud Run 服务上的 Cloud Endpoints?【英文标题】:Terraform: Cloud Endpoints on a Cloud Run service? 【发布时间】:2020-02-24 00:53:04 【问题描述】:

有没有办法在 Cloud Run 服务上运行 Cloud Endpoints?

假设我有以下 main.tf,并且我想在定义 Cloud Endpoints 服务时使用 Cloud Run 的 URL。 该 URL 应该存储在google_cloud_run_service.cloud-run.status.url 下。 下面的配置会报错。

terraform plan 的输出:

Error: Unsupported attribute

  on main.tf line 411, in resource "google_endpoints_service" "cloud-run":
 411:   service_name = "$google_cloud_run_service.cloud-run.status.url"

This value does not have any attributes.

main.tf:

[...]
#############
# Cloud Run #
#############
resource "google_cloud_run_service" "cloud-run" 
  name     = "cloud-run"
  provider = "google-beta"
  location = "europe-west1"
  metadata 
    namespace = "$var.gcp_project[var.env]"
  
  spec 
    containers 
      image = "gcr.io/endpoints-release/endpoints-runtime-serverless@sha256:a12b14dd6d31a88637ca7c9e63724ad542226d9509421ba08ed4452a91ce751e"
    
    container_concurrency = var.env != "dev" ? 0 : 1
  


###################
# Cloud Endpoints #
###################
resource "google_endpoints_service" "pre-pairing-api" 
  # The service name, AFAIK, should be Cloud Run's URL:
  service_name = "$google_cloud_run_service.cloud-run.status.url" #  <--------
  openapi_config = <<EOF
swagger: '2.0'
info:
  title: Pre-pairing
  description: API on Cloud Endpoints with a Google Cloud Functions backend...
  version: 1.0.0
# Same applies to the host. It should be, AFAIK, Cloud Run's URL.
host: "$google_cloud_run_service.cloud-run.status.url" # <--------
[...]

我是否遗漏或误解了什么? 提前致谢!

【问题讨论】:

看这里 ... terraform.io/docs/providers/google/r/cloud_run_service.html ... 有一个关于将其与 terraform-provider-google-beta 提供程序一起使用的警告。你做到了吗? 阅读底部的属性引用 ... terraform.io/docs/providers/google/r/cloud_run_service.html ... 我的印象是,通过 Terraform 定义 Cloud Run 环境是一个异步操作,并且它的状态一直在变化,直到服务条件切换到您想要的结果。换句话说,我们可能在此处存在竞争条件,您正在创建 Cloud Run 定义,但在您调用 Cloud Endpoints 定义时状态数据尚未准备好使用。 感谢@Kolban 的输入。关于 beta 提供程序,是的,它设置正确:provider = "google-beta"。我还考虑了比赛条件。这可能是这里的问题......但目前我不知道如何解决这个问题。 【参考方案1】:

我找到了解决方案:

# main.tf
[...]
#############
# Cloud Run #
#############
resource "google_cloud_run_service" "cloud-run" 
  [...]



# The URL was located under `status[0].url` instead of `status.url`.
# I have created a local variable to store its value.
locals 
  cloud_run_url = google_cloud_run_service.cloud-run.status[0].url


###################
# Cloud Endpoints #
###################
resource "google_endpoints_service" "some-api" 
  service_name = "$replace(local.cloud_run_url, "https://", "")" # <--------
  openapi_config = <<EOF
swagger: '2.0'
info:
  title: Some-API
  description: API on Cloud Endpoints with a Google Cloud Functions backend...
  version: 1.0.0
host: "$replace(local.cloud_run_url, "https://", "")" # <--------
[...]
EOF

depends_on = ["google_cloud_run_service.cloud-run"]

我还不能 100% 确定这是否适用于第一次运行。尽管如此,我希望depends_on(见上文)处理此依赖关系并等待创建 Cloud Run,然后再继续创建 Cloud Endpoints 服务。

【讨论】:

【参考方案2】:

您可以按照此documentation 为 Cloud Run 设置 Cloud Endpoints。

您的 main.tf 文件不会等待 Cloud Run 服务准备就绪,以便继续将可扩展服务代理 (ESP) 容器部署到 Cloud Run 的后续步骤。

示例用法here 展示了如何使用局部变量来等待 Cloud Run 服务就绪。

【讨论】:

以上是关于Terraform:Cloud Run 服务上的 Cloud Endpoints?的主要内容,如果未能解决你的问题,请参考以下文章

我可以为 Terraform for GCP 赋予管理员角色吗? (Cloud Run 域映射示例)

如何通过 terraform 使用服务帐户创建谷歌云 pubsub 订阅?

如何对 GCP Cloud Run 上的联合 GraphQL 服务进行身份验证?

如何通过 terraform 使用服务帐户创建 google cloud pubsub pull 订阅?

使用 Google Cloud Platform 时 Terraform 状态锁定的机制是啥?

带有 Terraform 的 KVM:SSH 权限被拒绝(Cloud-Init)