Tags: Infrastructure, Advanced

When a workflow completes, users can be notified by email, Pagerduty, or Slack.

The content of these notifications is configurable at the platform level.


When a workflow reaches a specified terminal workflow execution phase the flytekit.Email, flytekit.PagerDuty, or flytekit.Slack objects can be used in the construction of a flytekit.LaunchPlan.

For example

from flytekit import Email, LaunchPlan
from flytekit.models.core.execution import WorkflowExecutionPhase

# This launch plan triggers email notifications when the workflow execution it triggered reaches the phase `SUCCEEDED`.
my_notifiying_lp = LaunchPlan.create(
    default_inputs={"a": 4},

See detailed usage examples in the Notifications

Notifications can be combined with schedules to automatically alert you when a scheduled job succeeds or fails.

Future work#

Work is ongoing to support a generic event egress system that can be used to publish events for tasks, workflows and workflow nodes. When this is complete, generic event subscribers can asynchronously process these vents for a rich and fully customizable experience.

Platform Configuration Changes#

Setting Up Workflow Notifications#

The notifications top-level portion of the FlyteAdmin config specifies how to handle notifications.

As with schedules, the notifications handling is composed of two parts. One handles enqueuing notifications asynchronously and the second part handles processing pending notifications and actually firing off emails and alerts.

This is only supported for Flyte instances running on AWS.


To publish notifications, you’ll need to set up an SNS topic.

In order to process notifications, you’ll need to set up an AWS SQS queue to consume notification events. This queue must be configured as a subscription to your SNS topic you created above.

In order to actually publish notifications, you’ll need a verified SES email address which will be used to send notification emails and alerts using email APIs.

The role you use to run FlyteAdmin must have permissions to read and write to your SNS topic and SQS queue.

Let’s look at the following config section and explain what each value represents:

  # Because AWS is the only cloud back-end supported for executing scheduled
  # workflows in this case, only ``"aws"`` is a valid value. By default, the
  #no-op executor is used.
  type: "aws"

  # This specifies which region AWS clients will use when creating SNS and SQS clients.
  region: "us-east-1"

  # This handles pushing notification events to your SNS topic.

    # This is the arn of your SNS topic.
    topicName: "arn:aws:sns:us-east-1:{{ YOUR ACCOUNT ID }}:{{ YOUR TOPIC }}"

  # This handles the recording notification events and enqueueing them to be
  # processed asynchronously.

    # This is the name of the SQS queue which will capture pending notification events.
    queueName: "{{ YOUR QUEUE NAME }}"

    # Your AWS `account id, see:
    accountId: "{{ YOUR ACCOUNT ID }}"

  # This section encloses config details for sending and formatting emails
  # used as notifications.

    # Configurable subject line used in notification emails.
    subject: "Notice: Execution \"{{ }}\" has {{ phase }} in \"{{ domain }}\"."

    # Your verified SES email sender.
    sender:  ""

    # Configurable email body used in notifications.
    body: >
      Execution \"{{ }} [{{ name }}]\" has {{ phase }} in \"{{ domain }}\". View details at
      <a href=\{{ project }}/domains/{{ domain }}/executions/{{ name }}>{{ project }}/domains/{{ domain }}/executions/{{ name }}</a>. {{ error }}

The full set of parameters which can be used for email templating are checked into code.

Example config#

You can find the full configuration file here.

    durationMinutes: 3
  type: local
  region: "my-region"
    topicName: "foo"
    queueName: "queue"
    accountId: "bar"
    subject: "Notice: Execution \"{{ name }}\" has {{ phase }} in \"{{ domain }}\"."
    sender: ""
    body: >
      Execution \"{{ name }}\" has {{ phase }} in \"{{ domain }}\". View details at
      <a href=\{{ project }}/domains/{{ domain }}/executions/{{ name }}>