google-app-engine - Google Appengine 云任务 alpha 处理程序 http 404 错误

标签 google-app-engine go

当我将任务发送到任务队列时,它一直失败并在日志中显示 http 404(未找到)错误。

该项目已被列入灵活的云任务 alpha 白名单。

我可以在本地将 HTTP post 请求发送到/endpointpath 和/tasks/worker 而不会出现任何错误。

端点工作正常,并将任务添加到任务队列中。

 13:37:41.300 POST 200 0 B 422 ms curl/7.54.0 /endpointspath?key=keyremoved 0.0.0.0 - "POST endpointspath?key=keyremoved" 200 undefined "-" "curl/7.54.0"

该应用程序作为默认服务运行。

app.go 主要功能:

func main() {
    r := mux.NewRouter()

    r.HandleFunc("/", handler)

    r.HandleFunc("/_ah/health", healthCheckHandler)

    // Task handlers

    r.Path("/tasks/worker").Methods("POST", "GET", "PUT").HandlerFunc(workerTaskHandler)

    // Endpoints

    r.Path("/endpointpath").Methods("POST").HandlerFunc(searchHandler)

    http.Handle("/", r)

    port := 8080
    if portStr := os.Getenv("PORT"); portStr != "" {
        port, _ = strconv.Atoi(portStr)
    }
    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), nil))
}

缩写的 app.yaml:

runtime: go
env: flex

handlers:
- url: /tasks/.*
  script: _go_app
- url: /.*
  script: _go_app

当队列向 worker 发送请求时记录 HTTP 404 响应:

10.0.0.1 - "POST /tasks/worker" 404 200 "-" "AppEngine-Google; (+http://code.google.com/appengine)"
Expand all | Collapse all {
 httpRequest: {
  latency:  "0s"    
  referer:  "-"    
  remoteIp:  "10.0.0.1"    
  requestMethod:  "POST"    
  requestUrl:  "/tasks/worker"    
  responseSize:  "200"    
  status:  404    
  userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"    
 }
 insertId:  "......."   
 jsonPayload: {
  appLatencySeconds:  "-"    
  latencySeconds:  "0.000"    
  time:  null    
  trace:  "......."    
 }
 labels: {
  appengine.googleapis.com/instance_name:  "......"    
  appengine.googleapis.com/trace_id:  "......."    
  compute.googleapis.com/resource_id:  "......."    
  compute.googleapis.com/resource_name:  "......"    
  compute.googleapis.com/zone:  "us-central1-b"    
 }
 logName:  "projects/projectname/logs/appengine.googleapis.com%2Fnginx.request"   
 receiveTimestamp:  "2017-12-09T10:56:14.794726383Z"   
 resource: {
  labels: {
   module_id:  "default"     
   project_id:  "projectname"     
   version_id:  "....."     
  }
  type:  "gae_app"    
 }
 timestamp:  "2017-12-09T10:56:10.301Z"   
}

我可以让 GAE 找到任务/工作人员 url 的最接近方法是在 app.yaml 中设置 login:admin(即使 flex 不使用它进行身份验证)。这将返回 403 未经授权的错误。

handlers:
- url: /tasks/.*
  script: _go_app
  login: admin

这是日志中的 403 响应

{
 httpRequest: {
  latency:  "0s"    
  referer:  "-"    
  remoteIp:  "10.0.0.1"    
  requestMethod:  "POST"    
  requestUrl:  "/tasks/worker"    
  responseSize:  "162"    
  status:  403    
  userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"    
 }
 insertId:  "....."   
 jsonPayload: {
  appLatencySeconds:  "-"    
  latencySeconds:  "0.000"    
  time:  null    
  trace:  "....."    
 }
 labels: {
  appengine.googleapis.com/instance_name:  "...."    
  appengine.googleapis.com/trace_id:  "...."    
  compute.googleapis.com/resource_id:  "...."    
  compute.googleapis.com/resource_name:  "....."    
  compute.googleapis.com/zone:  "us-central1-b"    
 }
 logName:  "projects/projectname/logs/appengine.googleapis.com%2Fnginx.request"   
 receiveTimestamp:  "2017-12-09T13:35:59.986118082Z"   
 resource: {
  labels: {
   module_id:  "default"     
   project_id:  "projectname"     
   version_id:  "....."     
  }
  type:  "gae_app"    
 }
 timestamp:  "2017-12-09T13:35:54.764Z"   
}

不确定是否相关,但 projectname.appspot.com/_ah/health 返回此错误:

{
 "code": 5,
 "message": "Method does not exist.",
 "details": [
  {
   "@type": "type.googleapis.com/google.rpc.DebugInfo",
   "stackEntries": [],
   "detail": "service_control"
  }
 ]
}

最佳答案

事实证明,端点不能与任务处理程序在同一服务上运行。如果任务处理程序 url 请求在灵活环境中的同一服务上运行,并且该服务启用了端点服务,则 ESP 代理会阻止它们。

在单独的服务上运行任务处理程序,不要在任务处理程序服务 app.yaml 文件中设置“endpoints_api_service:”。

这样做会阻止队列在灵活的环境中分配给工作人员。

App Engine 文档中没有提到这有点奇怪。

“/_ah/health”问题是由于未在打开的 api 文件中设置此路径引起的。如果未设置此路径,则代理无法识别 url。

关于google-app-engine - Google Appengine 云任务 alpha 处理程序 http 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47729295/

相关文章:

python - Google App Engine 中的 cgi.test()

google-app-engine - 如何使用谷歌云数据存储从实体中删除属性/值

unit-testing - Google App Engine 数据存储 - 测试查询失败

mysql - 在 Go 中创建 MySql 接口(interface)的正确方法

sql - 戈朗 : Multiple SQL query generate extra empty {{range. }}

python - 为什么我从 App Engine 调用 Google API 时会收到 invalid_grant?

python-2.7 - GAE golang 模板停止工作

去不安装包 k8s-oidc-helper

html - golang html 模板不显示任何内容

iframe 在等待新页面加载时显示空白页面,而没有 iframe 则不会