【问题标题】:Google Cloud Run or Cloud Function for one-time-task-job用于一次性任务作业的 Google Cloud Run 或 Cloud Function
【发布时间】:2021-10-20 09:21:03
【问题描述】:

我们有启动脚本,可以使用 Google API 创建监控警报。

为此,我们创建了一个邮递员集合,我们在其中捆绑了所有这些调用,然后我们希望运行一个 shell 脚本,我们将在其中使用服务帐户 json 文件并调用邮递员集合

export GOOGLE_APPLICATION_CREDENTIALS=/home/abc/sac-5f63.json
export TOKEN=$(gcloud auth application-default print-access-token)
echo $TOKEN
echo "Running postman collection start"
newman run /home/abc/API.postman_collection.json

我们为此任务创建了一个 docker 文件,其中包含所需的依赖项和 gcloud sdk 作为基础映像。

现在,我们还想为用户提供在 Google Cloud 中执行这项一次性工作的条件。为此,我们正在考虑 Cloud Run、Cloud Function、App Engine 等选项。但是,所有这些服务都暴露了一个端点,然后必须调用它,服务将执行操作。

我们的要求是一次性活动,因此我们不想让服务一直运行。还有,这不是这些服务支持的node js、java、go应用。

它更像是一个一次性的工作任务,应该触发它的工作然后停止。

谷歌云是否支持这样的用例。基本的 hello world docker 就是我们有这种要求的一个例子—— https://hub.docker.com/_/hello-world

我们尝试了云运行,但它希望存在一个端口号,否则它会失败

部署失败
错误:(gcloud.run.deploy)云运行错误:容器无法启动。 无法启动并监听 PORT 定义的端口 环境变量。此修订的日志可能包含更多 信息。

请分享一些想法。

谢谢, 阿卡什

【问题讨论】:

    标签: docker google-cloud-platform google-cloud-functions google-cloud-run


    【解决方案1】:

    我建议您使用GKE Autopilot。您构建容器并运行它,作为集群中的 pod 作业。无需公开端口或网络服务器。

    第一个集群在您的结算帐户中是免费的。您只需为正在运行的 pod 的 CPU 时间和内存时间付费。


    一个肮脏的解决方法是也使用 Cloud Build 来运行您的容器,它是无服务器的,无需配置。它没有完成,它是一个 hack,但它有效!

    【讨论】:

    • 感谢我们将检查 GKE Autopilot 和云构建以启动容器并完成工作
    【解决方案2】:

    您想要触发脚本的“事件”是什么?

    您列出的服务通常由一些用户触发的 HTTP 方法调用触发,但不一定是这种情况,您可以使用例如Eventarc 触发 Cloud Run 服务和各种 events|triggers 用于 Cloud Functions。

    Cloud Scheduler 可能会满足您的需求。这为作业提供了一个 cron 机制。

    注意 IIUC,你是邮递员脚本对云平台服务进行多次 REST API 调用。这是解决问题的一种方法,但正如您所发现的,它可以通过合并 Cloud SDK (gcloud) 来获取凭据,并希望 (!?) 在任何调用失败时包含一些错误处理。您可能希望考虑利用 Google 的 SDK 之一,而不是直接编写 REST API 脚本。 SDK 包含身份验证、日志记录、提供抽象并鼓励更好的错误处理。

    【讨论】:

    • 谢谢..我们将尝试查看 Google SDK 是否允许监控 api 创建。
    【解决方案3】:

    hello-world 容器没有监听任何端口。这解释了你得到的错误。如Container runtime contract 中所述,您的容器必须正在侦听传入的 HTTP 请求。默认情况下,Cloud Run 请求发送到 8080,但您可以将 Cloud Run 配置为将请求发送到您选择的端口。

    为了能够将 Cloud Run 用作解决方案,请将 Web 服务器添加到您的容器中。

    最后,请记住,云运行的最大超时为 1 小时。

    【讨论】:

    • 谢谢..这是一个引导任务..所以我们不想生成 Webserver,因为它只需要运行一次..只有在以后有特殊需要时才会再次运行。
    【解决方案4】:

    因为您的服务可能不支持云功能(检查functions-framework)或应用引擎标准原生,并且还希望实例缩减到零,所以我认为 Cloud Run 适合您。

    问题变成了“如何调用 Cloud Run 服务”

    您可以通过事件(firebase、gcs、pubsub...)或 HTTP 请求调用。 如果您将服务部署为 HTTP 服务,则无论您的程序语言是什么(即使在 shell 中),您都应该监听 PORT 环境。

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2020-11-05
      • 2023-01-08
      相关资源
      最近更新 更多