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

时间:2018-10-25 22:54:54

标签: python-2.7 google-app-engine cron

我添加了登录名:已将app.yaml的管理员描述为类似documentation,但在Google App Engine中使用cron运行任务时,我仍然遇到302错误。

我有这个 app.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/hellocronhttp://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)

4 个答案:

答案 0 :(得分:1)

我的名字叫Dan,我来自Google云支持。

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

我将等待您的答复。

答案 1 :(得分:1)

您要从cron URL处理程序代码中删除@decorator.oauth_required

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

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

类似地,您可能需要从相应的secure: always处理程序定义中删除app.yaml(我的应用未启用它):我不确定如果cron服务使用GEThttp发出https请求。如果使用http进行配置,则secure: always的配置也将导致重定向到https URL。放下装饰器后,您可以轻松检查这是否正确。

答案 2 :(得分:0)

我想发布此解决方案,因为昨天我要拔头发,试图弄清为什么我的GAE cron工作一直失败,并且该线程帮助我微调了有效的解决方案。

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

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

答案 3 :(得分:0)

我正在尝试从gcloud应用程序引擎执行django管理端点。似乎没有办法让gcloud crons在运行之前使用任何凭据登录,因此,如果您在这种情况下(在crons执行中接收302),则必须执行以下操作:

  1. 将网址公开,这意味着:无需凭据即可运行它。
  2. Gcloud客户端发送的请求包括在其标头中的X-AppEngine-Cron。他们从所有标头中删除“ X-”,因此您可以信任这一特定标头。您要做的就是在端点请求中以this guy does的形式检查此标头。

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