标签: google-cloud-tasks

限速Google Cloud Tasks

我正在尝试将Google Cloud Tasks的速率限制为每秒不超过1个已处理任务。

我用以下方法创建了队列:

gcloud tasks queues create my-queue \
          --max-dispatches-per-second=1 \
          --max-concurrent-dispatches=1 \
          --max-attempts=2 \
          --min-backoff=60s
Run Code Online (Sandbox Code Playgroud)

描述它给我:

name: projects/my-project/locations/us-central1/queues/my-queue
rateLimits:
  maxBurstSize: 10
  maxConcurrentDispatches: 1
  maxDispatchesPerSecond: 1.0
retryConfig:
  maxAttempts: 2
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 60s
state: RUNNING
Run Code Online (Sandbox Code Playgroud)

创建了一堆任务之后,我可以在日志中看到许多任务在1秒的时间内被不希望地处理了:

2019-07-27 02:37:48 default[20190727t043306]  Received task with payload: {'id': 51}
2019-07-27 02:37:48 default[20190727t043306]  "POST /my_handler HTTP/1.1" 200
2019-07-27 02:37:49 default[20190727t043306]  Received task with payload: {'id': 52}
2019-07-27 02:37:49 default[20190727t043306]  "POST /my_handler HTTP/1.1" 200
2019-07-27 02:37:49 default[20190727t043306]  Received task with payload: {'id': 53} …
Run Code Online (Sandbox Code Playgroud)

google-cloud-tasks

11
推荐指数
1
解决办法
379
查看次数

Google Cloud 任务触发仅内部入口的 Cloud Function

当该函数的入口设置设置为“仅允许内部”时,如何从云任务触发该云函数?

通过该设置,该函数将拒绝来自 Cloud Tasks 的传入 HTTP 流量。即使Cloud Tasks 与该函数位于同一项目中,也会出现此行为。

google-cloud-platform google-cloud-functions google-cloud-tasks

10
推荐指数
1
解决办法
2473
查看次数

Google Cloud Tasks 无法通过 Cloud Run 进行身份验证

我正在尝试使用 Cloud Tasks 调用 Cloud Run 服务,如此处文档中所述。

我有一个正在运行的 Cloud Run 服务。如果我公开该服务,它就会按预期运行。

我创建了一个云队列,并使用本地脚本安排云任务。这个是用我自己的账号。脚本看起来像这样

from google.cloud import tasks_v2

client = tasks_v2.CloudTasksClient()

project = 'my-project'
queue = 'my-queue'
location = 'europe-west1'
url = 'https://url_to_my_service'

parent = client.queue_path(project, location, queue)

task = {
        'http_request': {
            'http_method': 'GET',
            'url': url,
            'oidc_token': {
               'service_account_email': 'my-service-account@my-project.iam.gserviceaccount.com'
            }
        }
}

response = client.create_task(parent, task)
print('Created task {}'.format(response.name))
Run Code Online (Sandbox Code Playgroud)

我看到该任务出现在队列中,但它失败并立即重试。其原因(通过检查日志)是 Cloud Run 服务返回 401 响应。

我自己的用户具有“服务帐户令牌创建者”和“服务帐户用户”角色。它没有明确的“云任务入队”,但由于我能够在队列中创建任务,我想我已经继承了所需的权限。服务帐户“my-service-account@my-project.iam.gserviceaccount.com”(我在任务中使用它来获取 OIDC 令牌)具有以下角色:

  • 云任务入队(尽管我认为它不需要这个,因为我正在使用自己的帐户创建任务)
  • 云任务任务运行器
  • 云任务查看器
  • 服务帐户令牌创建者(我不确定是否应将其添加到我自己的帐户(安排任务的帐户)或应添加到应执行对 Cloud Run 的调用的服务帐户)
  • 服务帐户用户(此处相同)
  • 云运行调用者

所以我做了一个肮脏的伎俩:我为服务帐户创建了一个密钥文件,将其下载到本地,并通过使用密钥文件将帐户添加到我的 gcloud …

service-accounts google-cloud-tasks google-cloud-run

9
推荐指数
2
解决办法
5995
查看次数

GCP - 创建队列时出错:googleapi:错误 400:无法创建队列,因为具有此名称的队列最近存在

我开始使用 Cloud Tasks,正在执行一些测试,因此我从 GCP 控制台创建和删除了 Cloud Tasks 队列几次。每次我删除队列并尝试使用相同名称重新创建它时,都会收到此错误:

  • 创建队列时出错:googleapi:错误 400:无法创建队列,因为具有此名称的队列最近存在。

因此,要创建一个新队列,我每次都需要更改名称。该错误告诉我们“队列最近存在”,但我在一个多星期前创建了第一个队列,并且不断收到相同的错误。我对这个错误感到很困惑,对我来说这感觉就像一个错误。我想知道队列是否实际上已被删除,或者我是否正在将一堆无法访问的队列收集到我的项目中。

还有其他人遇到同样的错误吗?一周后我仍然收到此错误,这是预期的行为吗?我需要等待多长时间才能使 GCP Cloud 任务队列的命名空间再次可用(如果有)?

多谢

google-cloud-platform google-cloud-tasks

9
推荐指数
1
解决办法
3185
查看次数

云函数/云任务未经身份验证错误

我正在尝试获取云函数来创建将调用云函数的云任务。简单的。

流程和用例与官方教程非常接近。

我还查看了 Doug Stevenson 的这篇文章,特别是其中的安全部分。

16 (UNAUTHENTICATED)不幸的是,我在 Cloud Task 中不断收到错误。

在此输入图像描述

如果我可以相信我在控制台中看到的内容,那么 Cloud Task 似乎没有将 OIDC 令牌附加到请求中:

在此输入图像描述

然而,在我的代码中我确实有这个oidcToken对象:

const { v2beta3, protos } = require("@google-cloud/tasks");
import {
  PROJECT_ID,
  EMAIL_QUEUE,
  LOCATION,
  EMAIL_SERVICE_ACCOUNT,
  EMAIL_HANDLER,
} from "./../config/cloudFunctions";


export const createHttpTaskWithToken = async function (
  payload: {
    to_email: string;
    templateId: string;
    uid: string;
    dynamicData?: Record<string, any>;
  },
  {
    project = PROJECT_ID,
    queue = EMAIL_QUEUE, 
    location = LOCATION, 
    url = EMAIL_HANDLER, 
    email = EMAIL_SERVICE_ACCOUNT,
  } = {} …
Run Code Online (Sandbox Code Playgroud)

service-accounts google-cloud-platform google-cloud-functions google-iam google-cloud-tasks

8
推荐指数
1
解决办法
913
查看次数

如何手动指定 X-Cloud-Trace-Context 标头值并关联和跟踪单独的 Cloud Run 请求中的日志?

我正在使用 Cloud Run 和 Cloud Tasks 对 Webhooks 进行一些异步处理。当我收到对 Cloud Run 服务的请求时,我会在 Cloud Tasks 队列中对任务进行排队,并立即从服务返回响应。然后,云任务将再次触发我的服务(不同的端点)并进行一些处理。我想使用相同的跟踪 ID 关联这些步骤中的所有日志,但它不起作用。

在 Cloud Tasks 中创建任务时,我请求它发送X-Cloud-Trace-Context标头,并用原始请求的标头值填充它X-Cloud-Trace-Context。理论上,当请求从 Cloud Tasks 发送到我的 Cloud Run 服务时,它应该具有此标头值,并且我的所有日​​志都将正确关联。但是,当第二个请求到来时,Cloud Run 似乎正在使用新的跟踪 ID 覆盖标头。

有没有办法防止这种情况发生?如果不是,那么在上述步骤中关联所有日志(由服务代码生成以及 GCP 自动生成的日志)的推荐解决方案是什么?

谢谢您的帮助!

google-cloud-platform google-cloud-trace google-cloud-logging google-cloud-tasks google-cloud-run

7
推荐指数
1
解决办法
2287
查看次数

云任务条件执行

我正在使用云任务。仅当任务 A 和任务 B 成功完成时,我才需要触发任务 C 的执行。所以我需要某种方式来读取/通知触发的任务的状态。但我在 GCP 的文档中看不到这样做的方法。使用 Node.js SDK 创建任务并使用 Cloud Functions 作为任务处理程序(如果有帮助的话)。

编辑:

根据要求,以下是有关我们正在做的事情的更多信息:

任务 1 - 10 每个发出 HTTP 请求、获取数据、根据此数据更新 Firestore 中的各个集合。这 10 个任务可以并行运行,并且没有特定的顺序,因为它们彼此之间没有任何依赖性。所有这些任务实际上都是在 GCF 内部实现的。

任务 11 实际上依赖于任务 1 - 10 更新的 Firestore 收集数据。因此它只能在任务 1 - 10 成功完成后才能运行。

我们确实发布 RunID 作为通用标识符来对所有任务 (1 - 11) 的特定运行进行分组。

google-cloud-platform google-cloud-functions google-cloud-tasks

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

您可以运行可从公共IP访问的/host firebase模拟器吗?

我正在使用 firebase 模拟器在我的计算机上托管一些 GCF 功能。它们被配置为在 localhost:5001 上运行/托管。这很好用。

我现在在我的应用程序中使用 Google Tasks,并且我的任务需要调用 GCF 函数。任务不在本地运行,因此我将我的计算机设置为通过公共 IP 地址访问,并打开端口 5001 以允许该端口上的流量进入。这个想法是Google任务可以调用我机器上的函数,这样我就可以正确测试。

我似乎无法让模拟器与任何外部公共 IP 地址一起工作。这是不可能的吗?如果可以,我该如何配置?

已更新,这里没有太多代码可供查看...我只是想知道您是否可以将模拟器配置为侦听公共端口。这是默认的 firebase.json 文件

   {
     "functions": {
        "predeploy": [
         "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": "functions"
  },
  "emulators": {
    "functions": {
      "port": 5001
    },
    "pubsub": {
      "port": 8085
    },
    "ui": {
      "enabled": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的研究中,我发现你可以添加“host”属性来允许你的本地网络使用“host”:“0.0.0.0”访问模拟器,所以它看起来像这样:这可以允许通过我的本地IP进行访问,例如http://192.168.1.216:5001

{
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ],
    "source": "functions"
  },
  "emulators": {
    "functions": {
      "port": 5001,
      "host": "0.0.0.0"
    }, …
Run Code Online (Sandbox Code Playgroud)

firebase-tools google-cloud-functions google-cloud-tasks

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

云任务创建:错误:3 INVALID_ARGUMENT:请求包含无效参数

我正在关注这个教程: https://cloud.google.com/tasks/docs/tutorial-gcf

创建一个将调用云函数的任务。

我已经做了很多尝试,但仍然收到此错误:

在此输入图像描述

如果我将正文编码更改为其他内容,则会收到有关序列化方法的另一个错误。

这可能不是许可问题,因为我之前得到了一些并摆脱了它。

传递给 createTask() 的对象如下:

task: {
  httpRequest: {
    url: "https://europe-west1-project_id.cloudfunctions.net/FunctionName"
    httpMethod: "POST"
    oidcToken: {
      serviceAccountEmail: "cf-targetFunctionSA@project_id.gserviceaccount.com"
    }
  body: ""
  headers: {
    Content-Type: "application/json"
  }
}
Run Code Online (Sandbox Code Playgroud)

(或使用 body:base64 编码的 json 字符串。)

我使用的代码如下:

'use strict';
const common            = require('./common');
const {v2beta3}         = require('@google-cloud/tasks');
const cloudTasksClient  = new v2beta3.CloudTasksClient();

let projectName = common.getProjectName();
let location    = "europe-west3";
let queue       = "compute-stats-on-mysql";
const parent    = cloudTasksClient.queuePath(projectName, location, queue);

async function createTask(url, serviceAccount, data)
{
  const dataBuffer  = Buffer.from(JSON.stringify(data)).toString('base64');
  const …
Run Code Online (Sandbox Code Playgroud)

grpc google-cloud-tasks

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

Google Cloud Platform:云功能和云任务不适用于授权服务帐户电子邮件

我创建了一个服务帐户电子邮件cloudfunctions.invoker并向该电子邮件添加了角色,以便我可以确保只有云任务可以触发云功能,然后我删除了AllUsers角色。但是当云任务尝试运行云函数时,状态码为UNAUTHENTICATED(16): HTTP status code 401,执行失败。

我当前的代码和控制台是这样的。

index.ts

export const addTasks = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError('failed-precondition', 'You are not authenticated.')
  }

  const client = new tasks.CloudTasksClient()

  const projectId = functions.config().project.id
  const queue = 'queue'
  const location = functions.config().project.location
  const parent = client.queuePath(projectId, location, queue)
  const url = `https://${location}-${projectId}.cloudfunctions.net/executeSomething`
  const serviceAccountEmail = functions.config().project.email

  const task: tasks.protos.google.cloud.tasks.v2.ITask = {
    httpRequest: {
      httpMethod: 'POST',
      url: url,
      oidcToken: {
        serviceAccountEmail: serviceAccountEmail,
      },
    }, …
Run Code Online (Sandbox Code Playgroud)

firebase google-cloud-platform google-cloud-functions google-cloud-tasks

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