错误 302 在 Google App Engine 的 app.yaml 中运行 cron 和 login:admin



我添加了登录名:描述了类似文档的app.yaml管理员,但是在谷歌应用程序引擎中使用cron运行任务时,我仍然有一个302 erro。

我有这个应用程序.yaml

runtime: python27 
api_version: 1 
threadsafe: true
handlers:
- url: /.*   
script: main.app   
login: admin

而这个cron.yaml

cron:
- description: "Dashboard"
url: /processdate?from=2016-03-01&until=2016-03-31
schedule: every day 23:46
timezone: Europe/Madrid

我收到此错误

0.1.0.1 - - [26/Oct/2018:00:49:40 +0200] "GET /processdate?from=2016-03-01&until=2016-03-31 HTTP/1.1" 302 355 - "AppEngine-Google; (+http://code.google.com/appengine)" "p20000.appspot.com" ms=74 cpu_ms=12 cpm_usd=3.9674e-8 loading_request=0 instance=00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a app_engine_release=1.9.65 trace_id=3c92edad090b5a57d249bd92be246e58
httpRequest: {
status:  302   
}
insertId:  "5bd248840005a3aae7fa2111"  
labels: {
clone_id:  "00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a"   
}
logName:  "projects/p201309/logs/appengine.googleapis.com%2Frequest_log"  
operation: {
first:  true   
id:  "5bd2488400ff047fe69ec5d94d0001657e62692d70682d3230313330390001323031383130323674303033383339000100"   
last:  true   
producer:  "appengine.googleapis.com/request_id"   
}
protoPayload: {
@type:  "type.googleapis.com/google.appengine.logging.v1.RequestLog"   
appEngineRelease:  "1.9.65"   
appId:  "e~myappname"   
cost:  3.9674e-8   
endTime:  "2018-10-25T22:49:40.369327Z"   
finished:  true   
first:  true   
host:  "p200000.appspot.com"   
httpVersion:  "HTTP/1.1"   
instanceId:  "00c61b117c78f767097d6896daa1f8967a815c14a94d54578ac19efa9d50a5077d5a"   
instanceIndex:  -1   
ip:  "0.1.0.1"   
latency:  "0.074441s"   
megaCycles:  "12"   
method:  "GET"   
requestId:  "5bd2488400ff047fe69ec5d94d0001657e62692d70682d3230313330390001323031383130323674303033383339000100"   
resource:  "/processdate?from=2016-03-01&until=2016-03-31"   
responseSize:  "355"   
startTime:  "2018-10-25T22:49:40.294886Z"   
status:  302   
taskName:  "25ed634cde05b07d9a7906f2161d2b16"   
taskQueueName:  "__cron"   
traceId:  "3c92edad090b5a57d249bd92be246e58"   
traceSampled:  true   
urlMapEntry:  "main.app"   
userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"   
versionId:  "20181026t003839"   
}
receiveTimestamp:  "2018-10-25T22:49:40.376251430Z"  
resource: {
labels: {
module_id:  "default"    
project_id:  "myappname"    
version_id:  "20181026t003839"    
zone:  "eu2"    
}
type:  "gae_app"   
}
timestamp:  "2018-10-25T22:49:40.294886Z"  
trace:  "projects/myappname/traces/3c92edad090b5a57d249bd92be246e58"  
traceSampled:  true  
}

关于可能是什么问题或如何解决它的任何想法?

在本地机器上运行此脚本没有任何问题。

------更新了一个更简单的应用程序------

我测试了一些更简单的东西。当我运行 https://myappname.appspot.com/hellocron 和 http://myappname.appspot.com/hellocron 时,这是有效的

有了这个结果,这是预期的。

但是当我运行它并带有cron错误302时,它又回来了

----------- app.yaml

runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /hellocron
script: main.app
login: admin
secure: always

----------- cron.yaml

cron:
- description: "hellocron"
url: /hellocron
schedule: every day 23:46
timezone: Europe/Madrid

------------ 我有相同的错误结果

0.1.0.1 - - [01/Nov/2018:12:29:49 +0100] "GET /hellocron HTTP/1.1" 302 267 - "AppEngine-Google; (+http://code.google.com/appengine)" "myappname.appspot.com" ms=8 cpu_ms=9 cpm_usd=2.9839e-8 loading_request=0 instance=00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27 app_engine_release=1.9.65 trace_id=9b9fa8ad127ad41f7907529c3863a0a9
{
httpRequest: {
status:  302   
}
insertId:  "5bdae3ad0004cfe52d64d457"  
labels: {
clone_id:  "00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27"   
}
logName:  "projects/myappname/logs/appengine.googleapis.com%2Frequest_log"  
operation: {
first:  true   
id:  "5bdae3ad00ff04ac4decaecea60001657e62692d70682d3230313330390001323031383131303174313135363535000100"   
last:  true   
producer:  "appengine.googleapis.com/request_id"   
}
protoPayload: {
@type:  "type.googleapis.com/google.appengine.logging.v1.RequestLog"   
appEngineRelease:  "1.9.65"   
appId:  "e~myappname"   
cost:  2.9839e-8   
endTime:  "2018-11-01T11:29:49.315161Z"   
finished:  true   
first:  true   
host:  "myappname.appspot.com"   
httpVersion:  "HTTP/1.1"   
instanceId:  "00c61b117cb863320ce80ff59a2b5b4b20ee440529428f43d612baa0e980733727302b27"   
instanceIndex:  -1   
ip:  "0.1.0.1"   
latency:  "0.008908s"   
megaCycles:  "9"   
method:  "GET"   
requestId:  "5bdae3ad00ff04ac4decaecea60001657e62692d70682d3230313330390001323031383131303174313135363535000100"   
resource:  "/hellocron"   
responseSize:  "267"   
startTime:  "2018-11-01T11:29:49.306253Z"   
status:  302   
taskName:  "b0467e8a57f53a8ee2b827ca35db275f"   
taskQueueName:  "__cron"   
traceId:  "9b9fa8ad127ad41f7907529c3863a0a9"   
traceSampled:  true   
urlMapEntry:  "main.app"   
userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"   
versionId:  "20181101t115655"   
}
receiveTimestamp:  "2018-11-01T11:29:49.321937019Z"  
resource: {
labels: {
module_id:  "default"    
project_id:  "myappname"    
version_id:  "20181101t115655"    
zone:  "eu2"    
}
type:  "gae_app"   
}
timestamp:  "2018-11-01T11:29:49.306253Z"  
trace:  "projects/myappname/traces/9b9fa8ad127ad41f7907529c3863a0a9"  
traceSampled:  true  
}

python 中/hellocron 的代码基本上是这样的:

decorator = OAuth2DecoratorFromClientSecrets(
os.path.join(os.path.dirname(__file__), 'client_secrets.json'),
scope='https://www.googleapis.com/auth/bigquery')
class hellocron (webapp2.RequestHandler):
@decorator.oauth_required
def get(self):
self.response.write('hellocron')  
app = webapp2.WSGIApplication([
('/hellocron', hellocron),
(decorator.callback_path, decorator.callback_handler()) ], debug=True)

你想从 cron url 处理程序代码中删除@decorator.oauth_required

cron 服务没有任何用户凭据(它不以用户身份运行(,因此装饰器将导致重定向到登录服务 - 因此302响应。您应该能够通过重新尝试手动检查来验证这一点,但从隐身浏览器窗口。

要保护 cron 服务 URL,因此不能使用常规用户身份验证。但是,您可以在app.yaml文件中使用login: admin,如果需要,还可以检查X-Appengine-Cron: true标头或0.1.0.1源 IP 地址,请参阅保护 cron 的 URL。

同样,您可能需要从相应的app.yaml处理程序定义中删除secure: always(我没有为我的应用程序启用它(:我不确定 cron 服务是使用http还是https发出其GET请求。如果它使用httpsecure: always配置也会导致重定向到httpsURL。删除装饰器后,您可以轻松检查这是否正确或不遵循我之前的评论。

我的名字是Dan,我来自谷歌云支持。

据我了解,您在启动 Cron 作业时收到 302 响应。 您是否启用了 SSL 的自定义域?我问你这个问题,因为我们收到了一些使用HTTP而不是HTTPS的客户的报告。 您是否灵活地在 App Engine 上运行您的应用程序?此信息将帮助我更好地了解您当前的情况。

我将等待你的答复。

我想发布这个解决方案,因为我昨天正在拔头发,试图弄清楚为什么我的 GAE cron 作业一直失败,这个线程帮助我微调了有效的解决方案。

我正在使用Python,但想法似乎相同。在我的 cron 脚本(即使用 cron 逻辑访问的页面(中,我在成功执行报告后进行了重定向,因此 cron 会声明它在 GAE 中失败,但逻辑仍然可以正确执行。

为了解决这个问题,我所做的只是返回一个简单的 HTTP 响应,因此 cron 认为页面上的所有内容都正确加载,而不是重定向或不返回 HTTP 响应。

我试图从 gcloud 应用程序引擎执行 django 管理端点。似乎没有办法在运行之前使用任何凭据登录 gcloud crons,所以如果你发现自己处于这种情况(在你的 crons 执行中收到 302(,这就是你必须做的:

  1. 公开 url,这意味着:无需凭据即可运行它。
  2. Gcloud crons发送的请求包括X-AppEngine-Cron的标头。他们从所有标头中删除"X-",因此您可以信任这个特定的标头。您所要做的就是像这家伙一样检查端点请求中的此标头。

医生:https://cloud.google.com/appengine/docs/flexible/go/scheduling-jobs-with-cron-yaml?hl=es-419#validating_cron_requests

最新更新