标签: google-cloud-run

请求取消不会传播到云运行容器

当发送到云运行服务的 HTTP 请求被发起服务取消时,取消/关闭的连接不会传播到云运行容器内正在服务的请求。

示例代码:

package main

import (
    "log"
    "net/http"
    "os"
    "time"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        ctx := r.Context()
        select {
        case <-ctx.Done():
            log.Printf("context cancelled")
        case <-time.After(time.Minute):
            w.Write([]byte("OK"))
            log.Printf("request completed. path=%s", r.URL.Path)
        }
    })
    log.Fatal(http.ListenAndServe(":"+port, nil))
}
Run Code Online (Sandbox Code Playgroud)

在本地运行此代码,发送到http://localhost:8080然后使用 ctrl-c 取消的curl 请求将在日志中显示为“上下文已取消”。与在云运行中部署并取消的服务相同的请求将在 1 分钟后在日志中显示为成功请求。

google-cloud-run

5
推荐指数
1
解决办法
504
查看次数

如何关闭旧 Cloud Run 修订版的 SQL 连接?

语境

我正在 Cloud Run 上运行 SpringBoot 应用程序,该应用程序使用 Hikari 连接池连接到 postgres11 CloudSQL 数据库。我使用的是最小的 PSQL 实例(1vcpu/614mb/25 连接限制)。对于设置,我遵循了以下资源:

从 Cloud Run 连接到 Cloud SQL

管理数据库连接

问题

部署第三个修订版后,出现以下错误:

FATAL: remaining connection slots are reserved for non-replication superuser connections

我发现了什么

  • 默认连接池大小为 10,这就是为什么它在第三次部署时失败 (30 > 25)。

  • 删除旧版本时,Cloud SQL 管理面板中显示的活动连接数会减少 10,并且下一次部署会成功。

问题

看来,旧的 Cloud Run 修订版一直处于“冷”状态,以维护其连接池。有没有办法关闭这些连接而不删除修订?

最佳实践部分,它说:

...我们建议您使用支持连接池的客户端库,该连接池可以自动重新连接断开的客户端连接。”

鉴于旧版本似乎以某种方式设法维护其连接,在 Cloud Run 中管理连接池的推荐方法是什么?

谢谢!

postgresql google-cloud-sql google-cloud-platform hikaricp google-cloud-run

5
推荐指数
1
解决办法
1348
查看次数

将 hasura 与 Google Cloud Run 和 Google Cloud SQL 结合使用

文档描述 hasura 需要带有 HASURA_GRAPHQL_DATABASE_URL环境变量的 postgres 连接字符串。

例子:

docker run -d -p 8080:8080 \
  -e HASURA_GRAPHQL_DATABASE_URL=postgres://username:password@hostname:port/dbname \
  hasura/graphql-engine:latest
Run Code Online (Sandbox Code Playgroud)

看起来我的问题是 google cloud sql 的服务器实例连接名称看起来PROJECT_ID:REGION:INSTANCE_ID不是 TCP

从云运行文档(https://cloud.google.com/sql/docs/postgres/connect-run)我得到了这个例子:

postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432但它似乎不起作用。有想法吗?

我目前正在将其cloud_sql_proxy作为解决方法添加到容器中,以便我可以连接到 TCP 127.0.0.1:5432,但我正在寻找与 google-cloud-sql 的直接连接。

// 编辑感谢您的评论,beta8 做了大部分的技巧,但我也错过了参数set-cloudsql-instances: https: //cloud.google.com/sdk/gcloud/reference/beta/run/deploy#--set-cloudsql-instances

我的完整云运行命令:

gcloud beta run deploy \
    --image gcr.io/<PROJECT_ID>/graphql-server:latest \
    --region <CLOUD_RUN_REGION> \
    --platform managed \
    --set-env-vars HASURA_GRAPHQL_DATABASE_URL="postgres://<DB_USER>:<DB_PASS>@/<DB_NAME>?host=/cloudsql/<PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>" \
    --timeout 900 \
    --set-cloudsql-instances <PROJECT_ID>:<CLOUD_SQL_REGION>:<INSTANCE_ID>
Run Code Online (Sandbox Code Playgroud)

postgresql google-cloud-sql hasura google-cloud-run

5
推荐指数
1
解决办法
1648
查看次数

使用 GoogleCloud Run 运行 Keycloak

我目前正在使用 kubernetes 运行 keycloak,没有任何问题。一切都按预期进行,但我想切换到云运行(完全托管),目前 keycloak 给我带来了一些问题:

我注意到在云运行中你无法通过 tcp 连接到 mysql 数据库(google sql 第二代),但我没有找到任何有关如何设置 keycloak 以使用套接字连接的文档。目前使用 keycloak 可以实现这一点吗?

google-cloud-platform keycloak google-cloud-run

5
推荐指数
1
解决办法
4603
查看次数

Cloud Run 中的共享缓存对象存储在哪里?

我正在使用 Cloud Run 创建数据提取管道。每次通过 Pub Sub 将文件放入 GCS 存储桶时,我的 Cloud Run api 都会被调用。我需要加载一些元数据,其中包含我正在摄取的数据的文本。此元数据很少更改。我显然不想在每次执行时将其重新加载到内存中。我最好的选择是什么?到目前为止我能够研究的是:

选项1

如果在每个服务请求上重新创建对象的成本很高,您还可以将对象缓存在内存中。将其从请求逻辑转移到全局范围会带来更好的性能。 https://cloud.google.com/run/docs/tips#run_tips_global_scope-java

在此链接给出的示例中,heavyComputation 函数仅在冷启动时调用一次吗?如果我需要在元数据更新时偶尔重新触发此功能怎么办?我还发现以下信息令人不安,因为它似乎说不能保证其他实例会重用该对象。

在 Cloud Run 中,您不能假设服务状态在请求之间保留。但是,Cloud Run 确实会重用各个容器实例来服务持续的流量,因此您可以在全局范围内声明一个变量,以允许在后续调用中重用其值。无法提前知道是否有任何单独的请求能够从这种重用中获益。

选项2

使用 Redis 或云内存存储之类的东西,只要有变化,云功能就会更新。所有云运行 api 的实例都从 Redis 中提取元数据信息。这会比选项 1 的性能更低还是更高吗?这还有其他缺点吗?

如果还有其他更好的方法可以做到这一点,我会很感兴趣。

更新 1:我更多地考虑了这一点,由于每个租户的元数据都会有所不同,并且每次调用云运行代码都会为一个租户摄取一个文件,因此加载所有租户是一个坏主意每次执行时的元数据,即使已缓存。不过,我可能会在每个租户的项目中运行单独的云。

shared-memory data-ingestion google-cloud-memorystore google-cloud-run

5
推荐指数
1
解决办法
5928
查看次数

如何确保您的 Google Cloud Run 应用不会因请求而过载?

我创建了一个简单的 Google Cloud Run 帮助程序(不处理任何个人数据,也不使用任何存储设施),并在网站内为其实现了一个公共界面(使用 HTML 请求)。我不打算添加任何用户身份验证,并且我还开源了 Cloud Run 容器中的代码。

我是否应该采取任何进一步的措施来保护容器免受恶意用户的侵害?有人可能会因为请求而使应用程序超载,从而超出容器的免费调用限制(导致我自己被计费)吗?我主要只是想确保我永远不会为 Cloud Run 应用程序付费,因为它只是充当有限数量用户的小型帮助工具。

谢谢。

google-cloud-platform google-cloud-billing google-cloud-run

5
推荐指数
1
解决办法
3315
查看次数

如何从 Cloud Run 提供预压缩文件?

我将 Cloud Run 与 Node 运行时结合使用。我的静态文件服务器将提供 gzip 和 brotli 压缩文件(如果存在),因此我已为所有资产预先生成了它们。在本地,这效果很好,但一旦部署,Cloud Run 就会剥离内容编码响应标头,以便浏览器误解响应并呈现垃圾。

我找不到任何有关使用 Cloud Run 进行标头过滤的文档,但我在 App Engine 上找到了一些文档,表明它会过滤掉 Accept-Encoding 请求标头和 Content-Encoding 响应标头。如果是这种情况,我认为我的应用程序将提供未压缩的资源。

有人知道这是怎么回事吗?

google-cloud-run

5
推荐指数
0
解决办法
1069
查看次数

DotNet 用户机密存储在 Google Secret Manager 中

我需要将 dotnet Web 应用程序部署到 Google Cloud Run,并希望使用用户机密文件来存储凭据。目前,它们位于不安全的应用程序设置中。有人使用 Google Secret Manager 完成过此操作吗?

  • 最好存储键值对(json blob)吗?
  • 我想在启动时而不是在构建期间提取值。

如果有现有的示例或片段,我们将不胜感激。

谢谢。

c# google-cloud-platform .net-core google-cloud-run google-secret-manager

5
推荐指数
1
解决办法
2536
查看次数

当内容长度在 4013-8092 个字符之间时,Google Cloud Run 网站会超时。到底是怎么回事?

此问题发生在 Nginx 和 PHP-FPM 提供的纯 PHP 文件上。我在使用 Symfony 开发网站时偶然发现了这个问题,但有问题的内容长度范围是 3702-15965 (我想知道为什么它与普通 PHP 不同)。

到目前为止我尝试过的:

  • 超时持续时间为 15 秒,但我尝试将其增加到 300 秒,但仍然超时。所以我猜这是无限循环的事情。
  • 它看起来与资源无关,因为即使内容长度为 500 万个字符它也能工作。
  • 使用不同的字符创建了各种测试,看看是否可以更改有问题的内容长度范围。答案是否定的,我所有的测试范围都保持不变。
  • 我尝试过禁用 gzip。它没有改变长度范围,但响应发生了变化。Gzip 启用响应:“上游请求超时”| Gzip 禁用响应:完全空白

笔记:

  • 我的本地主机上不存在此问题。
  • 很少能正常打开页面。我无法一致地重现这一点。
  • 除了“请求超时”行之外,Nginx、PHP 或 GCR 日志中没有任何错误。

任何帮助表示赞赏。谢谢。

php fastcgi nginx fpm google-cloud-run

5
推荐指数
1
解决办法
2062
查看次数

如何在 React 中使用 Google Cloud Run Dashboard 上声明的 ENV 变量

我正在使用 Dockerfile 将 create-react-app 服务部署到 Google Cloud Run 上,但我想不再在 .env 文件中声明环境变量,而是在 Google Cloud Run 的仪表板上声明它们,如下所示:

仪表板图像

但是,当我使用以下命令调用环境变量时

console.log("REDIRECT", process.env.REACT_APP_REDIRECT_URI)
Run Code Online (Sandbox Code Playgroud)

我尝试引用的任何环境变量都会返回 null。是否还有另一个步骤来访问我缺少的这些变量?

这是我的 Dockerfile:

FROM node:10-alpine as react-build
WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build

FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/configfile.template
ENV PORT 8080 
ENV HOST 0.0.0.0
RUN sh -c "envsubst '\$PORT'  < /etc/nginx/conf.d/configfile.template >      /etc/nginx/conf.d/default.conf"
COPY --from=react-build /app/build /usr/share/nginx/html
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)

environment-variables docker reactjs google-cloud-platform google-cloud-run

5
推荐指数
1
解决办法
2148
查看次数