--- title: "Triggers" slug: "dev-dataengine-guides-triggers" description: "Learn to create element and schedule triggers in VAST Cluster 5.5, optimizing event handling for S3 and NFS files with CLI commands." tags: ["DataEngine"] updated: 2026-10-28T02:14:59Z published: 2026-10-28T02:14:59Z canonical: "docs.vastdata.com/dev-dataengine-guides-triggers" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.vastdata.com/llms.txt > Use this file to discover all available pages before exploring further. # Triggers *Applies to VAST Cluster 5.5.* A trigger is what starts a pipeline: it turns something that happens into an event on a topic. This guide shows how to create the two kinds with the CLI: **element triggers**, which fire when objects or files change in a bucket, and **schedule triggers**, which fire on a cron schedule. It shows the filters and event types the cluster accepts, and how the schedule syntaxes behave on a 5.5 cluster. Commands use the environment variables from the [quickstart](/develop/docs/dev-dataengine-quickstart#before-you-start). The outputs come from a lab cluster running VAST Cluster 5.5.0-SP6 with `vastde` v5.5.0-sp2, where the bucket is `docs-src` and the tenant's broker is the VAST Event Broker view `docs-kafka`. Your names, GUIDs, addresses and times will differ. Every field and flag is in [function and trigger files](/develop/docs/dev-dataengine-reference-function-and-trigger-files). ## Element triggers An element trigger watches one bucket (a view set up as a trigger source by your platform team) and sends one event per matching change. This one fires for every object created under `photos/`: ``` vastde triggers create element --name docs-src-uploads --description "New objects under photos/ in docs-src" --source-bucket "$BUCKET" --event "ObjectCreated:*" --name-prefix photos/ ``` ``` Trigger created: docs-src-uploads Name: docs-src-uploads Description: New objects under photos/ in docs-src Tags: [] GUID: 11f2e798-f6c6-427f-b30f-0f20bdb8172a Owner: {4294967295 vid 0xc0002da020 map[]} CreatedAt: 2026-10-08T12:24:39Z UpdatedAt: 2026-10-08T12:24:39Z VRN: vast:dataengine:triggers:docs-src-uploads Type: Element Events: -: ObjectCreated:* Topic: vast:dataengine:topics:docs-kafka/default SourceBucket: docs-src ``` `vastde triggers get <name> -o yaml` shows the stored configuration, the broker and topic it publishes to, and its status: ``` vastde triggers get docs-src-uploads -o yaml ``` ``` broker: is_accessible_to_data_engine: true name: docs-kafka type: Internal url: 15.0.0.1:9092 config: events: - ObjectCreated:* name_filters: prefixes: - photos/ suffixes: null source_bucket_name: docs-src tag_filters: null created_at: "2026-10-08T12:24:39.524Z" description: New objects under photos/ in docs-src events: - ObjectCreated:* guid: 11f2e798-f6c6-427f-b30f-0f20bdb8172a id: 7.513937404856631e+18 name: docs-src-uploads owner: id: "4294967295" id_type: vid name: root source_bucket_name: docs-src status: Ready tenant_guid: da47bae0-aefd-4e85-a5a9-2020d6a2cb91 topic: vast:dataengine:topics:docs-kafka/default topic_name: default type: Element updated_at: "2026-10-08T12:24:39.524Z" vrn: vast:dataengine:triggers:docs-src-uploads ``` ### Choose the events `--event` takes the S3-style event names, and you can repeat it. The CLI lists the ones it accepts if you give another: ``` vastde triggers create element --name bad-event --source-bucket "$BUCKET" --event "ObjectCreated:Put" ``` ``` invalid arguments: - --event list invalid: 'ObjectCreated:Put' not allowed. Available events: - ObjectCreated:* - ObjectRemoved:* - ObjectTagging:Put - ObjectTagging:Delete ``` | `--event` | Fires when | Delivered event type | | --- | --- | --- | | `ObjectCreated:*` | An object or file is created | `vastdata.com:Element.ElementCreated` | | `ObjectRemoved:*` | An object or file is deleted | `vastdata.com:Element.ElementDeleted` | | `ObjectTagging:Put` | A tag is added to an S3 object | `vastdata.com:Element.ElementTagCreated` | | `ObjectTagging:Delete` | A tag is removed from an S3 object | `vastdata.com:Element.ElementTagDeleted` | So the name you configure and the event type your handler sees differ: test `event.subtype == "ElementCreated"`, not `ObjectCreated`. The S3-style name appears only inside the event's data (`Records[0].eventName`, for example `ObjectCreated:Put`). See [element events](/develop/docs/dev-dataengine-reference-events#element-events). At least one event is required: ``` vastde triggers create element --name no-event --source-bucket "$BUCKET" ``` ``` invalid arguments: - events are required ``` ### Filter by name `--name-prefix` and `--name-suffix` limit the trigger to objects whose key (or, for NFS, file path) starts or ends with a string. Use a prefix per pipeline, so that pipelines sharing a bucket don't see each other's objects: the lab used `photos/`, `fail/` and `env/` prefixes on one bucket for three pipelines. Filtering in the trigger is cheaper than filtering in your handler, because events that don't match are never sent. Tag events have their own tag filters (`--tag-prefix`, `--tag-suffix`), allowed only on a trigger whose only event is `ObjectTagging:Put`. See [tag filters](/develop/docs/dev-dataengine-reference-function-and-trigger-files#tag-filters). ### S3 objects and NFS files `--source-types` selects `S3`, `NFS4` or both. The lab's triggers didn't set it and reported S3 uploads; for NFS the source view needs NFSv4 set up for triggers by your platform team. See [source types](/develop/docs/dev-dataengine-reference-function-and-trigger-files#source-types). ### What the cluster checks The bucket must exist, and trigger names are unique in the tenant: ``` vastde triggers create element --name bad-bucket --source-bucket no-such-bucket --event "ObjectCreated:*" ``` ``` 400 Bad Request: Failed to create trigger: Bucket not found ``` ``` vastde triggers create element --name docs-src-uploads --source-bucket "$BUCKET" --event "ObjectCreated:*" ``` ``` 409 Conflict: Trigger with (name=docs-src-uploads) already exists! ``` ## Schedule triggers A schedule trigger sends an event each time its schedule comes due. `--cron-schedule` takes either a standard 5-field cron expression or a Quartz expression with 6 or 7 fields (seconds first, and an optional year). All four of these were accepted: ``` vastde triggers create schedule --name every-2-min --description "Every 2 minutes (crontab)" --cron-schedule "*/2 * * * *" ``` ``` Trigger created: every-2-min Name: every-2-min Description: Every 2 minutes (crontab) Tags: [] GUID: f846c90c-cbf4-4efa-9af8-1c9e546d7a75 Owner: {4294967295 vid 0xc000996520 map[]} CreatedAt: 2026-10-08T12:57:56Z UpdatedAt: 2026-10-08T12:57:56Z VRN: vast:dataengine:triggers:every-2-min Type: Schedule Topic: vast:dataengine:topics:docs-kafka/default Cron Schedule: */2 * * * * ``` ``` vastde triggers create schedule --name every-3-min-quartz --description "Every 3 minutes (Quartz)" --cron-schedule "0 0/3 * * * ?" ``` ``` Trigger created: every-3-min-quartz Name: every-3-min-quartz Description: Every 3 minutes (Quartz) Tags: [] GUID: b4ec4c44-ae64-449e-9864-03307089e071 Owner: {4294967295 vid 0xc0006187c0 map[]} CreatedAt: 2026-10-08T12:58:05Z UpdatedAt: 2026-10-08T12:58:05Z VRN: vast:dataengine:triggers:every-3-min-quartz Type: Schedule Topic: vast:dataengine:topics:docs-kafka/default Cron Schedule: 0 0/3 * * * ? ``` ``` vastde triggers create schedule --name quartz-7-field --cron-schedule "0 0 12 ? * MON-FRI 2027" ``` ``` Trigger created: quartz-7-field Name: quartz-7-field Description: N/A Tags: [] GUID: 68289b69-7eb4-4546-9bbc-8884fe14a5f8 Owner: {4294967295 vid 0xc00045e8c0 map[]} CreatedAt: 2026-10-08T12:58:08Z UpdatedAt: 2026-10-08T12:58:08Z VRN: vast:dataengine:triggers:quartz-7-field Type: Schedule Topic: vast:dataengine:topics:docs-kafka/default Cron Schedule: 0 0 12 ? * MON-FRI 2027 ``` ``` vastde triggers create schedule --name six-field-no-q --cron-schedule "0 */5 * * * *" ``` ``` Trigger created: six-field-no-q Name: six-field-no-q Description: N/A Tags: [] GUID: e299a8c7-b206-488b-974c-21d9f66f195e Owner: {4294967295 vid 0xc00069a5d0 map[]} CreatedAt: 2026-10-08T12:58:15Z UpdatedAt: 2026-10-08T12:58:15Z VRN: vast:dataengine:triggers:six-field-no-q Type: Schedule Topic: vast:dataengine:topics:docs-kafka/default Cron Schedule: 0 */5 * * * * ``` | Expression | Syntax | Fires | | --- | --- | --- | | `*/2 * * * *` | Cron, 5 fields (minute first) | Every 2 minutes, on even minutes | | `0 0/3 * * * ?` | Quartz, 6 fields (second first) | Every 3 minutes, at second 0 | | `0 0 12 ? * MON-FRI 2027` | Quartz, 7 fields (with year) | At noon on weekdays in 2027 | | `0 */5 * * * *` | 6 fields, no `?` | Every 5 minutes, at second 0 | Watch the field count: with six fields, the first field is seconds, so `0 */5 * * * *` is every five minutes, not every five hours. In files, use the 5-field form unless you need seconds or a year, and say which syntax you used in the trigger's description. The VAST Web UI's Advanced schedule takes Quartz syntax. An expression neither syntax accepts is rejected. The message comes from the 5-field parser, so it says `expected 5` even though 6 and 7 fields are fine: ``` vastde triggers create schedule --name bad-cron --cron-schedule "every 5 minutes" ``` ``` 400 Bad Request: Invalid cron schedule: Wrong number of fields; got 3, expected 5 ``` ``` vastde triggers create schedule --name bad-cron --cron-schedule "61 * * * *" ``` ``` 400 Bad Request: Invalid cron schedule: Error validating expression '61': the last value (61) is higher than the maximum value (59) ``` ### Run a function on a schedule In the pipeline file, a schedule trigger is used like an element trigger. One link can take events from several triggers: ``` name: ticks description: Log what schedule triggers deliver kubernetes_cluster_vrn: vast:dataengine:kubernetes-clusters:test-cluster namespace: dataengine-ns-da47bae0-aefd-4e85-a5a9-2020d6a2cb91 manifest: triggers: - name: crontab vrn: vast:dataengine:triggers:every-2-min - name: quartz vrn: vast:dataengine:triggers:every-3-min-quartz - name: six-field vrn: vast:dataengine:triggers:six-field-no-q function_deployments: - name: ticker function_vrn: vast:dataengine:functions:ticker links: - source: [crontab, quartz, six-field] destination: [ticker] ``` `ticker` is the handler from [write a function](/develop/docs/dev-dataengine-guides-write-a-function#schedule-events), which logs each event. The runtime's `START` line for each call shows which trigger fired and when: ``` vastde logs get ticks --since 15m | grep START ``` ``` 2026-10-08 13:08:01.59 [ticker] [INFO] [vast-runtime] START EventId: 17914648800015842651, TraceId: 17914648-8000-1584-0ed0-ef1c462b4c2c, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-2-min.f846c90c-cbf4-4efa-9af8-1c9e546d7a75, Timestamp: 1791464881.598185 2026-10-08 13:09:01.48 [ticker] [INFO] [vast-runtime] START EventId: 17914649400006828057, TraceId: 17914649-4000-0682-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-3-min-quartz.b4ec4c44-ae64-449e-9864-03307089e071, Timestamp: 1791464941.4875693 2026-10-08 13:10:01.31 [ticker] [INFO] [vast-runtime] START EventId: 17914650000017996932, TraceId: 17914650-0000-1799-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-2-min.f846c90c-cbf4-4efa-9af8-1c9e546d7a75, Timestamp: 1791465001.3172526 2026-10-08 13:10:06.67 [ticker] [INFO] [vast-runtime] START EventId: 17914650000010471173, TraceId: 17914650-0000-1047-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:six-field-no-q.e299a8c7-b206-488b-974c-21d9f66f195e, Timestamp: 1791465006.6712043 2026-10-08 13:12:01.82 [ticker] [INFO] [vast-runtime] START EventId: 17914651200009328570, TraceId: 17914651-2000-0932-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-3-min-quartz.b4ec4c44-ae64-449e-9864-03307089e071, Timestamp: 1791465121.8212316 2026-10-08 13:12:01.86 [ticker] [INFO] [vast-runtime] START EventId: 17914651200014305951, TraceId: 17914651-2000-1430-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-2-min.f846c90c-cbf4-4efa-9af8-1c9e546d7a75, Timestamp: 1791465121.8693445 2026-10-08 13:14:01.41 [ticker] [INFO] [vast-runtime] START EventId: 17914652400056088553, TraceId: 17914652-4000-5608-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-2-min.f846c90c-cbf4-4efa-9af8-1c9e546d7a75, Timestamp: 1791465241.4175737 2026-10-08 13:15:01.21 [ticker] [INFO] [vast-runtime] START EventId: 17914653000009301541, TraceId: 17914653-0000-0930-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-3-min-quartz.b4ec4c44-ae64-449e-9864-03307089e071, Timestamp: 1791465301.2132173 2026-10-08 13:15:06.45 [ticker] [INFO] [vast-runtime] START EventId: 17914653000022038797, TraceId: 17914653-0000-2203-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:six-field-no-q.e299a8c7-b206-488b-974c-21d9f66f195e, Timestamp: 1791465306.459798 2026-10-08 13:16:02.62 [ticker] [INFO] [vast-runtime] START EventId: 17914653600008216970, TraceId: 17914653-6000-0821-bd29-322d7bfe46f1, EventType: vastdata.com:Schedule.TimerElapsed, EventSource: vastdata.com:every-2-min.f846c90c-cbf4-4efa-9af8-1c9e546d7a75, Timestamp: 1791465362.6236463 ``` Things to notice: - **Each trigger kept its own schedule**: `every-2-min` on even minutes, `every-3-min-quartz` every three minutes, `six-field-no-q` at 13:10 and 13:15. - **Delivery takes a few seconds.** The handler ran one to six seconds after the scheduled time. When your code needs the scheduled time, read `event.timer_elapsed_timestamp`, not the clock. - **`event.trigger` tells you which one fired**, from the event's `source` (`vastdata.com:<trigger name>.<trigger GUID>`). - When two schedules come due together, their events are separate calls. Schedule triggers don't fire while the cluster's management service (VMS) is unavailable, for example during an upgrade. Don't use one where a missed run matters without a check in your code. ## Brokers and topics With no broker or topic flags, a trigger publishes to your tenant's default topic on the tenant's default broker: `Topic: vast:dataengine:topics:docs-kafka/default` above. Several triggers can share a topic. To give a trigger its own topic (for example, so that a busy bucket doesn't delay other pipelines), pass `--broker-type`, `--broker-name` and `--topic-name` together; the topic is created if it doesn't exist. See [broker and topic](/develop/docs/dev-dataengine-reference-function-and-trigger-files#broker-and-topic), and for partitions and retention, the VAST Event Broker [topics](/develop/docs/dev-event-broker-guides-topics) guide. ## List, change and delete triggers `vastde triggers list` shows every trigger in the tenant with its status and type: ``` vastde triggers list ``` ``` Trigger Name Status Type Description GUID Updated at -------------------------------------------------------------------------------------------- docs-src-cre... Ready Element new objects ... 7d5e6227-d1bf-4bf... 2026-10-08 ... docs-src-upl... Ready Element New objects ... 11f2e798-f6c6-427... 2026-10-08 ... docs-src-fail Ready Element a17df233-c00b-4d3... 2026-10-08 ... every-2-min Ready Schedule Every 2 minu... f846c90c-cbf4-4ef... 2026-10-08 ... every-3-min-... Ready Schedule Every 3 minu... b4ec4c44-ae64-449... 2026-10-08 ... quartz-7-field Ready Schedule 68289b69-7eb4-454... 2026-10-08 ... six-field-no-q Ready Schedule e299a8c7-b206-488... 2026-10-08 ... docs-src-env Ready Element ea98d94f-cb34-4e1... 2026-10-08 ... ``` A trigger exists on its own, whether or not a pipeline uses it, and one trigger can feed several pipelines. `vastde triggers update <name>` changes a trigger in place (you can't rename it), and `vastde triggers delete <name>` removes it; remove it from the pipelines that use it first. See [updating a trigger](/develop/docs/dev-dataengine-reference-function-and-trigger-files#updating-a-trigger). Keep trigger definitions in Git with your pipeline file, as files for `vastde triggers create element --from-file` (see [element trigger file](/develop/docs/dev-dataengine-reference-function-and-trigger-files#element-trigger-file)) or as the commands in a script. ## See also - [Events](/develop/docs/dev-dataengine-reference-events): what each trigger's events contain. - [Function and trigger files](/develop/docs/dev-dataengine-reference-function-and-trigger-files): every trigger field and flag. - [Pipelines as code](/develop/docs/dev-dataengine-guides-pipelines-as-code): linking triggers to functions. - KB: [Creating a Trigger](/docs-5-5/docs/creating-a-trigger), and [provisioning source views for element type triggers](/docs-5-5/docs/provisioning-source-views-for-element-type-triggers) (admin task: send to your platform team).