Cloud 运行:运行函数作为后台作业的端点
Cloud Run: endpoint that runs a function as background job
我正在尝试在云 运行 中部署 rest api,其中一个端点启动异步作业。该作业在代码中的函数内定义。
似乎一种方法是使用 Cloud Task,但这意味着要对已部署的另一个端点进行自调用 api。具体来说,创建一个包含作业代码的辅助端点(例如 /run-my-function
)和另一个将队列设置为启动 /run-my-function
?
的云任务
这是正确的做法还是我误解了什么?如果这是正确的方法,如何指定 /run-my-function
端点的 url 而无需明确硬编码云 运行 部署的 uRL 名称?
使用 run-my-function
代码启动端点的端点代码为:
from google.cloud import tasks_v2
client = tasks_v2.CloudTasksClient()
project = 'myproject'
queue = 'myqueue'
location = 'mylocation'
url = 'https://cloudrunservice-abcdefg-ca.b.run.app/run-my-function'
service_account_email = '12345@cloudbuild.gserviceaccount.com'
parent = client.queue_path(project, location, queue)
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
'url': url,
"oidc_token": {"service_account_email": service_account_email},
}
}
response = client.create_task(parent=parent, task=task)
但是,这需要硬编码服务名称 https://cloudrunservice-abcdefg-ca.b.run.app
并定义可以通过 http
调用的辅助端点 /run-my-function
在您的代码中,您可以获取 Cloud 运行 URL 而无需对其进行硬编码或将其设置在环境变量中。
你可以看一下previous article that I wrote,在优美的结尾部分。我在 Go 中提供了一个工作代码,在 Python.
中重新实现并不难
原理在这里:
- 从地区Metadata server. Keep in mind that Cloud Run has specific metadata中获取地区和项目编号
- 获取 K_SERVICE 环境变量(这是一个标准的 Cloud 运行 环境变量)
- 调用 Cloud Run Rest API to get the service detail 并使用之前获取的数据自定义请求
- 从响应中提取
status.url
JSON 条目。
现在你拥有了!
如果您在实现该目标时遇到困难,请告诉我。我不擅长Python,但我一定能写出那段代码!
我正在尝试在云 运行 中部署 rest api,其中一个端点启动异步作业。该作业在代码中的函数内定义。
似乎一种方法是使用 Cloud Task,但这意味着要对已部署的另一个端点进行自调用 api。具体来说,创建一个包含作业代码的辅助端点(例如 /run-my-function
)和另一个将队列设置为启动 /run-my-function
?
这是正确的做法还是我误解了什么?如果这是正确的方法,如何指定 /run-my-function
端点的 url 而无需明确硬编码云 运行 部署的 uRL 名称?
使用 run-my-function
代码启动端点的端点代码为:
from google.cloud import tasks_v2
client = tasks_v2.CloudTasksClient()
project = 'myproject'
queue = 'myqueue'
location = 'mylocation'
url = 'https://cloudrunservice-abcdefg-ca.b.run.app/run-my-function'
service_account_email = '12345@cloudbuild.gserviceaccount.com'
parent = client.queue_path(project, location, queue)
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
'url': url,
"oidc_token": {"service_account_email": service_account_email},
}
}
response = client.create_task(parent=parent, task=task)
但是,这需要硬编码服务名称 https://cloudrunservice-abcdefg-ca.b.run.app
并定义可以通过 http
/run-my-function
在您的代码中,您可以获取 Cloud 运行 URL 而无需对其进行硬编码或将其设置在环境变量中。
你可以看一下previous article that I wrote,在优美的结尾部分。我在 Go 中提供了一个工作代码,在 Python.
中重新实现并不难原理在这里:
- 从地区Metadata server. Keep in mind that Cloud Run has specific metadata中获取地区和项目编号
- 获取 K_SERVICE 环境变量(这是一个标准的 Cloud 运行 环境变量)
- 调用 Cloud Run Rest API to get the service detail 并使用之前获取的数据自定义请求
- 从响应中提取
status.url
JSON 条目。
现在你拥有了!
如果您在实现该目标时遇到困难,请告诉我。我不擅长Python,但我一定能写出那段代码!