当我将任务发送到任务队列时,它一直失败并在日志中显示 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/