Cloud Task调用Cloud Run返回UNKNOWN状态问题(已解决:域名差异)
更新
生成的主机名与Google文档略有差异:
不是 https://SERVICE_IDENTIFIER.run.app
而是 https://SERVICE_IDENTIFIER.a.run.app
问题已关闭
问题描述
我有一个运行正常的Cloud Run服务,同时有一个能正常创建Cloud Task的类,所有请求外部资源的HTTP任务都能执行。但创建请求Cloud Run服务的HTTP任务时,任务创建成功,调度时却返回UNKNOWN响应状态。日志显示任务已运行(失败),但Cloud Run服务未收到任何请求。手动用相同负载请求同一URL可正常工作。
凭据/安全配置
- Cloud Run服务为公开访问
- Cloud Run服务与Cloud Task使用相同服务账号创建
- 服务账号拥有以下角色:
- Cloud Datastore User
- Cloud Run Invoker
- Cloud Run Service Agent
- Cloud Tasks Enqueuer
- Cloud Tasks Service Agent
- Service Account OpenID Connect Identity Token Creator
- Service Account User
创建Cloud Task的代码
protected async Task CreateTaskAsync( Uri uri, // 指向我的Cloud Run服务的URI,格式为https://SERVICE_IDENTIFIER.run.app/my/path DateTime runDate, string payload, // JSON数据 HttpMethod method = HttpMethod.Post ) { var task = new Google.Cloud.Tasks.V2.Task { HttpRequest = new HttpRequest { HttpMethod = method, Url = uri.ToString(), Body = ByteString.CopyFromUtf8(payload), Headers = { { "Content-Type", "application/json" } }, // 查资料后尝试添加OIDC token,但无效果 OidcToken = new OidcToken { ServiceAccountEmail = Constants.ServiceConfiguration.ServiceAccount , Audience = Constants.ServiceConfiguration.Host } }, ScheduleTime = Timestamp.FromDateTime(runDate), }; var projectId = Constants.ServiceConfiguration.ProjectId; _queueName = new QueueName(projectId, Location, BotQueueName); _tasksClient = CloudTasksClient.Create(); await _tasksClient.CreateTaskAsync(_queueName, task); }
Cloud Task日志
{ "insertId": $INSERT_ID$, "jsonPayload": { "task": $TASK_NAME$, "@type": "type.googleapis.com/google.cloud.tasks.logging.v1.TaskActivityLog", "taskCreationLog": { "targetType": "HTTP", "status": "OK", "scheduleTime": "2022-11-21T07:00:00Z", "targetAddress": "POST https://SERVICE_IDENTIFIER.run.app/my/path" } }, "resource": { "type": "cloud_tasks_queue", "labels": { ... } }, "timestamp": "2022-11-20T22:27:09.397470874Z", "severity": "INFO", "logName": $LOG_NAME$, "receiveTimestamp": "2022-11-20T22:27:10.010639079Z" }, { "insertId": $INSERT_ID$, "jsonPayload": { "attemptResponseLog": { "maxAttempts": 0, "attemptDuration": "0.031349s", "status": "UNKNOWN", "responseCount": "0", "targetAddress": "POST https://SERVICE_IDENTIFIER.run.app/my/path", "targetType": "HTTP", "dispatchCount": "1", "scheduleTime": "2022-11-21T07:00:00Z" }, "@type": "type.googleapis.com/google.cloud.tasks.logging.v1.TaskActivityLog", "task": $TASK_NAME$ }, "resource": { "type": "cloud_tasks_queue", "labels": { ... } }, "timestamp": "2022-11-20T22:33:10.367512625Z", "severity": "ERROR", "logName": $LOG_NAME$, "receiveTimestamp": "2022-11-20T22:33:11.022774614Z" }
我尝试为服务账号添加角色、为任务添加OIDC token、使用不同HTTP方法发送请求,但均无效果。使用相同负载请求外部URL的任务可正常执行。
内容的提问来源于stack exchange,提问作者Chernyshev Ivan
相关产品推荐
相关产品推荐

