firebase/snippets-node

Error code 204 - Cron job is deployed successfully but fails to run.

adam-hurwitz opened this issue · 6 comments

Expected

Defined Firebase Cloud Storage directory gs://my-project-name.appspot.com/ to be populated with all of the collections in the my-project-name's Firestore database when the deployed Cron job is ran on GCP with the implementation followed by the Schedule data exports documentation.

Observed

Cron job is deployed successfully, but fails to run. The logs are showing Error code 204.

screen shot 2019-01-24 at 11 24 13 am

Logs

2019-01-24 11:19:47.818 PST GET 500 0 B 998 ms AppEngine-Google; (+http://code.google.com/appengine) /cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups/ 0.1.0.1 - - [24/Jan/2019:11:19:47 -0800] "GET /cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups/ HTTP/1.1" 500 - - "AppEngine-Google; (+http://code.google.com/appengine)" "cloud-firestore-admin.[my-project-name].appspot.com" ms=998 cpu_ms=482 cpm_usd=0 loading_request=1 instance=00c61b117c5fba456c9edcc5f075ccacb339b96d0bc7a8e35beb60cd3fd50a149d4c2f296b app_engine_release=1.9.71 trace_id=65811179272fc9c721d10e6cab7cdf70

{
    httpRequest: {
    status:  500   
}
insertId:  "5c4a0fd4000c78b4e510bd7a"  
labels: {
    clone_id:  "00c61b117c5fba456c9edcc5f075ccacb339b96d0bc7a8e35beb60cd3fd50a149d4c2f296b"   
}
logName:  "projects/[my-project-name]/logs/appengine.googleapis.com%2Frequest_log"  
operation: {
    first:  true   
    id:  "5c4a0fd300ff0c7e86eb62e71c0001737e636f696e76657273652d6d656469612d73746167696e670001323031393031323474313130333331000100"   
    last:  true   
    producer:  "appengine.googleapis.com/request_id"   
}
protoPayload: {
    @type:  "type.googleapis.com/google.appengine.logging.v1.RequestLog"   
    appEngineRelease:  "1.9.71"   
    appId:  "s~[my-project-name]"   
    endTime:  "2019-01-24T19:19:48.816961Z"   
    finished:  true   
    first:  true   
    host:  "cloud-firestore-admin.[my-project-name].appspot.com"   
    httpVersion:  "HTTP/1.1"   
    instanceId:  "00c61b117c5fba456c9edcc5f075ccacb339b96d0bc7a8e35beb60cd3fd50a149d4c2f296b"   
    instanceIndex:  -1   
    ip:  "0.1.0.1"   
    latency:  "0.998139s"   
    line: [
        0: {
            logMessage:  "This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application."     
            severity:  "INFO"     
            time:  "2019-01-24T19:19:48.816504Z"     
        }
    1: {
        logMessage:  "A problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. (Error code 204)"      
        severity:  "ERROR"     
        time:  "2019-01-24T19:19:48.816507Z"     
    }
]
    megaCycles:  "482"   
    method:  "GET"   
    pendingTime:  "0.010711670s"   
    requestId:  "5c4a0fd300ff0c7e86eb62e71c0001737e636f696e76657273652d6d656469612d73746167696e670001323031393031323474313130333331000100"   
    resource:  "/cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups/"   
    startTime:  "2019-01-24T19:19:47.818822Z"   
    status:  500   
    taskName:  "6c799fe7c1a404ec22117967738fcca9"   
    taskQueueName:  "__cron"   
    traceId:  "65811179272fc9c721d10e6cab7cdf70"   
    traceSampled:  true   
    urlMapEntry:  "auto"   
    userAgent:  "AppEngine-Google; (+http://code.google.com/appengine)"   
    versionId:  "20190124t110331"   
    wasLoadingRequest:  true   
 }
 receiveTimestamp:  "2019-01-24T19:19:48.824360342Z"  
     resource: {
         labels: {
             module_id:  "default"    
             project_id:  "my-project-name"    
             version_id:  "20190124t110331"    
             zone:  "us17"    
        }
        type:  "gae_app"   
    }
        severity:  "ERROR"  
        timestamp:  "2019-01-24T19:19:47.818822Z"  
        trace:  "projects/[my-project-name]/traces/65811179272fc9c721d10e6cab7cdf70"  
        traceSampled:  true  
    }

2019-01-24 11:19:48.816 PST
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.
2019-01-24 11:19:48.816 PST
A problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. (Error code 204)

Configuration

  1. Billing is enabled for both the GCP and Firebase project.
  2. A Firebase Storage bucket is currently created and in use to store mp3 and txt files under a directory named content with a new empty directory named backups created to store the results of the export Cron job.

screen shot 2019-01-24 at 10 20 20 am

  1. The following permissions have been enabled as recommended in the section Configure access permissions.

screen shot 2019-01-24 at 10 17 02 am

  1. The GCP project is defined as default.
    screen shot 2019-01-24 at 12 05 35 pm

  2. The app.yaml, and app.js code has been copied as is.

  3. For the package.json the name, version, and description attributes have been changed specific to the project.

  4. In the cron.yaml the description and url attributes are customized. For url the following has been attempted in order to export all collections:

    • /cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups

Attempted Solutions

  1. Version code: Incrementing the version code on subsequent deploys.
  2. cron.yaml url:
    • Adding / after directory: /cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups/
    • Adding collections query but leaving it empty: /cloud-firestore-export?outputUriPrefix=gs://[my-project-name].appspot.com/backups&collections
  3. IAM Permissions:
    • Adding Cloud Datastore Import Export Admin permission to my user account my-name@domain.com since that is the email account associated to the project under gcloud config configurations list.
    • Adding the Storage Admin to @appspot.gserviceaccount.com in addition to the Owner permission.

Update: I just re-implemented the Schedule data exports from scratch without changing the packcage.json name, version, or description or cron.yaml's description and the Cron runs successfully.

I'm attempting to isolate what element caused the Cron not to run in the initial implementation.

The issue is that the package.json version cannot be lower than 1.0.0. I was attempting to use 0.16.0. I'm sending a note to the documentation team as well as this should be included in the docs to save people time.

@AdamSHurwitz that's really interesting, how did you figure that out?

@samtstern For the first implementation yesterday morning I changed the packcage.json name, version, description and the cron.yaml's description and worked backwards to debug why the app was deploying but not running. After hours of tinkering around I decided to start from scratch and implement 100% based on the documentation and then customize each attribute in order to isolate that when the version was changed the running of the Cron Job broke.

This is something the team may want to investigate at as a P3 as it is non-blocking.

@AdamSHurwitz thanks for the very thorough investigation, I have filed this internally as bug 123426378

Awesome, thank you for filing @samtstern!