我正在尝试将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) 当该函数的入口设置设置为“仅允许内部”时,如何从云任务触发该云函数?
通过该设置,该函数将拒绝来自 Cloud Tasks 的传入 HTTP 流量。即使Cloud Tasks 与该函数位于同一项目中,也会出现此行为。
google-cloud-platform google-cloud-functions google-cloud-tasks
我正在尝试使用 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 令牌)具有以下角色:
所以我做了一个肮脏的伎俩:我为服务帐户创建了一个密钥文件,将其下载到本地,并通过使用密钥文件将帐户添加到我的 gcloud …
我开始使用 Cloud Tasks,正在执行一些测试,因此我从 GCP 控制台创建和删除了 Cloud Tasks 队列几次。每次我删除队列并尝试使用相同名称重新创建它时,都会收到此错误:
因此,要创建一个新队列,我每次都需要更改名称。该错误告诉我们“队列最近存在”,但我在一个多星期前创建了第一个队列,并且不断收到相同的错误。我对这个错误感到很困惑,对我来说这感觉就像一个错误。我想知道队列是否实际上已被删除,或者我是否正在将一堆无法访问的队列收集到我的项目中。
还有其他人遇到同样的错误吗?一周后我仍然收到此错误,这是预期的行为吗?我需要等待多长时间才能使 GCP Cloud 任务队列的命名空间再次可用(如果有)?
多谢
我正在尝试获取云函数来创建将调用云函数的云任务。简单的。
流程和用例与官方教程非常接近。
我还查看了 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
我正在使用 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
我正在使用云任务。仅当任务 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
我正在使用 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) 我正在关注这个教程: 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) 我创建了一个服务帐户电子邮件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