The App Engine Cron Service allows you to configure regularly scheduled tasks that operate at defined times or regular intervals. These tasks are commonly known as cron jobs. These cron jobs are automatically triggered by the App Engine Cron Service. For instance, you might use a cron job to send out an email report on a daily basis, or to update some cached data every 10 minutes, or refresh summary information once an hour.
A cron job makes an HTTP
GET request to a URL as scheduled. The handler for
that URL executes the logic when it is called.
A cron job request is subject to the same limits as those for
push task queues.
Creating a cron job
- Create the
cron.yamlfile in the root directory of your application (alongside
Add one or more
<cron>entries to your file and define the necessary elements for your job, including the required
The following example creates a basic cron job that runs daily:
cron: - description: daily summary job url: /tasks/summary target: beta schedule: every 24 hours
The target specification is optional and is the name of a service/version. If present, the target is prepended to your app's hostname, causing the job to be routed to that service/version. If no target is specified, the job will run in the versions of the
defaultservice that are configured for traffic.
Create a handler for the cron job's URL. The handler should execute any tasks that you want scheduled. The handler should respond with an HTTP status code between 200 and 299 (inclusive) to indicate success. Other status codes can be returned and can be used to trigger.
The handler can be as simple as a Servlet in the app. The Servlet's URL mapping in the web.xml file should be the same as the cron job's URL.
retrying the job.
For more information about the syntax and parameters of the cron.yaml, see the cron.yaml reference.
Testing cron jobs in the development server
The local development server (dev_appserver) doesn't automatically run your cron jobs. You can make requests directly to your cron job's URL to test your functionality. You can use your local cron or scheduled tasks interface to trigger the URLs of your jobs with curl or a similar tool.
You can use the admin interface of the local development server to
view your cron jobs at
Uploading cron jobs
You can use the
tool to upload your cron jobs to App Engine.
To upload the cron jobs specified in your
cron.yaml configuration file, you
run the following command:
gcloud app deploy cron.yaml
If you install the original App Engine SDK, you can run:
appcfg.py update_cron [YOUR_APP_DIR]
Deleting all cron jobs
To delete all cron jobs:
Edit the contents of the
Retrying cron jobs that fail
If a cron job's request handler returns a status code that is not in the range 200–299 (inclusive) App Engine considers the job to have failed. By default, failed jobs are not retried.
To set failed jobs to be retried:
- Include a
retry_parametersblock in your
Choose and set the retry parameters in the
For example, this sample
cron.yamlfile contains a single cron job that is configured to retry up to five times (the default) with a starting backoff of 2.5 seconds that doubles each time.
cron: - description: retry demo url: /retry schedule: every 10 mins retry_parameters: min_backoff_seconds: 2.5 max_doublings: 5
Securing URLs for cron
A cron handler is just a normal handler defined in
app.yaml. You can prevent
users from accessing URLs used by scheduled tasks by restricting access to
administrator accounts. Scheduled tasks can access admin-only URLs. You can
restrict a URL by adding
login: admin to the handler configuration in
An example might look like this in
For more information see how to require login or admin status in the app.yaml reference.
runtime: python27 api_version: 1 handlers: - url: /report/weekly script: reports.app login: admin
To test a cron job, sign in as an administrator and visit the URL of the handler in your browser.
Requests from the Cron Service will also contain a HTTP header:
X-Appengine-Cron header is set internally by Google App Engine. If your
request handler finds this header it can trust that the request is a cron
request. If the header is present in an external user request to your app, it
is stripped, except for requests from logged in administrators of the
application, who are allowed to set the header for testing purposes.
Google App Engine issues Cron requests from the IP address
Calling Google Cloud Endpoints
You cannot specify a Google Cloud Endpoint in
url field of a cron job.
If you want your cron job to call a Google Cloud Endpoint,
issue a request to a target that is served by a handler in
your app, and call the endpoint class and method from the handler code.
Viewing cron jobs in the GCP Console
The GCP Console Task queues page has a tab that shows the tasks that are running cron jobs.
You can also visit the Logs page see when cron jobs were added or removed.