Appearance
Scheduled Tasks
A type: scheduled service combines an ECS task definition with an EventBridge Scheduler schedule. It does not create a continuously running ECS service. Between runs, the dashboard reports it as healthy with the SCHEDULED status.
yaml
services:
nightly-report:
type: scheduled
command: ["bundle", "exec", "rake", "reports:nightly"]
cpu: 512
memory: 1024
schedule:
expression: cron(0 3 * * ? *)
timezone: America/New_York
# enabled: false # PAUSED: schedule exists but does not fire
# retries: 3 # retries of a failed *invocation*, not a non-zero exit
# dead_letter: job-failures # an sqs resource from the resources blockbash
keel jobs list # configured vs live state, and when each next runs (--json)
keel jobs run nightly-report # fire one now, without waiting (--timeout, default 15m)Schedule syntax
cron(...), rate(...), and at(...) are EventBridge Scheduler syntax:
- Expressions use six fields, including a year field.
- Use
?for the day-of-month or day-of-week field you are not specifying. For example, daily at 03:00 iscron(0 3 * * ? *). Keel rejects five-field crontab expressions. - Day-of-week uses 1–7, where 1 is Sunday. This differs from standard crontab numbering.
timezoneis an IANA name (validated against real tzdata), defaulting to UTC.
Unsupported service fields
Keel rejects port, health_check, desired_count, and autoscaling for scheduled services because they do not create an ECS service. Deploy and rollback still operate on the task-definition family, and keel exec works while a task is running.
retries applies when the RunTask invocation fails, not when a task starts and exits with a non-zero status. Use keel logs nightly-report for application failures or configure dead_letter with an SQS resource.
Statuses
SCHEDULED— the schedule exists and is enabled. Keel treats the service as healthy between runs.PAUSED— the schedule exists but is disabled withenabled: false. Editkeel.ymlto enable it.
Use type: worker for a process that should run continuously.