发送 Webhook 通知

您可以使用以下外部系统提供的 Webhook 将 Snowflake 通知与这些系统集成:

  • Slack (https://api.slack.com/messaging/webhooks)

  • Microsoft Teams (https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook?tabs=newteams%2Cdotnet)

  • PagerDuty (https://developer.pagerduty.com/docs/ZG9jOjExMDI5NTgw-events-api-v2-overview)

备注

Snowflake 不会向上面列出的系统以外的外部系统发送 Webhook 通知。

要向这些系统之一发送通知,请执行以下步骤:

  1. 为外部系统的 Webhook URL 创建密钥

  2. 为外部系统创建 Webhook通知集成

  3. 使用 Webhook通知集成向外部系统发送通知

接下来的部分将提供有关如何设置和向这些外部系统发送通知的更多详细信息。

为 Webhook URL 创建密钥

大多数 Webhook 在传入 HTTP 请求中需要密钥或集成密钥。例如:

  • 当您 在 Slack 中创建传入 Webhook (https://api.slack.com/messaging/webhooks#create_a_webhook) 时,该 Webhook 的 URL 包括一个密钥:

    https://hooks.slack.com/services/<secret>
    
    Copy
  • 当您 在 Teams 中创建传入 Webhook (https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook) 时,该 Webhook 的 URL 包括一个密钥:

    https://<hostname>.webhook.office.com/webhookb2/<secret>
    
    Copy
  • 当您 为您的 PagerDuty 服务设置集成 (https://support.pagerduty.com/docs/services-and-integrations) 时,集成提供了一个集成密钥,您必须将其包含在 Webhook 请求中:

    {
       "routing_key" : "<integration_key>",
       ...
    
    Copy

对于此密钥或集成密钥,我们建议创建一个通用字符串类型的密钥对象。此密钥对象的使用方式如下:

  • 创建 Webhook通知集成时,您可以在 CREATE NOTIFICATION INTEGRATION 语句中指定此密钥对象。

  • 当您发送通知时,密钥对象用于构造 Webhook 的 HTTP 请求。

请注意以下事项:

  • 创建 Webhook 通知集成时,您必须使用对此密钥具有 USAGE 权限的角色。

  • 向此 Webhook 发送通知时,您必须使用对此密钥具有 READ 权限以及对包含密钥的数据库和架构具有 USAGE 的权限的角色。

要创建此对象,请使用 CREATE SECRET 命令,并指定 TYPE=GENERIC_STRING。您必须使用对您计划创建该对象的架构具有 CREATE SECRET 权限的角色。

接下来的部分提供创建密钥对象的示例。

示例 1:为 Slack Webhook 创建密钥

假设您想向具有 URL 的 Slack Webhook (https://api.slack.com/messaging/webhooks#create_a_webhook) 发送通知:

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
Copy

在此示例中,Webhook URL 包含密钥 T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

执行以下语句为该密钥创建一个密钥对象:

CREATE OR REPLACE SECRET my_slack_webhook_secret
  TYPE = GENERIC_STRING
  SECRET_STRING = 'T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX';
Copy

示例 2:为 Teams Webhook 创建密钥

假设您想向具有 URL 的 Teams Webhook (https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook) 发送通知:

https://mymsofficehost.webhook.office.com/webhookb2/xxxxxxxx
Copy

在此示例中,Webhook URL 包含密钥 xxxxxxxx

执行以下语句为该密钥创建一个密钥对象:

CREATE OR REPLACE SECRET my_teams_webhook_secret
  TYPE = GENERIC_STRING
  SECRET_STRING = 'xxxxxxxx';
Copy

示例 3:为 PagerDuty Webhook 创建密钥

假设您想向 PagerDuty Webhook (https://support.pagerduty.com/docs/services-and-integrations) 发送通知,并且您的集成密钥(您必须包含在请求中的 routing_key 字段中的值)是:

xxxxxxxx
Copy

执行以下语句为该密钥创建一个密钥对象:

CREATE OR REPLACE SECRET my_pagerduty_webhook_secret
  TYPE = GENERIC_STRING
  SECRET_STRING = 'xxxxxxxx';
Copy

创建 Webhook通知集成

要创建 Webhook 类型的通知集成,请使用 CREATE NOTIFICATION INTEGRATION 命令。

执行此命令时,设置以下属性以设置要为通知发送的 HTTP 请求。

  • 将 TYPE 设置为 WEBHOOK。

  • 如果您为要包含在 URL、HTTP 请求主体或标头中的密钥 创建了一个密钥对象,请将 WEBHOOK_SECRET 设置为该密钥对象的名称。

  • 将 WEBHOOK_URL 设置为 Webhook 的 URL。

    如果 Webhook URL 包含一个密钥,并且您为该密钥创建了一个密钥对象,请将 URL 中的密钥替换为 SNOWFLAKE_WEBHOOK_SECRET。

  • 如果 Webhook 的消息正文需要采用此外部系统的特定格式(例如,如果发送到此系统的所有消息都需要使用相同的格式),请将 WEBHOOK_BODY_TEMPLATE 设置为消息模板。在此模板中:

    • 在消息正文中应显示密钥的位置使用 SNOWFLAKE_WEBHOOK_SECRET 占位符。

    • 在应显示通知消息的位置使用 SNOWFLAKE_WEBHOOK_MESSAGE 占位符。

    当您调用 SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 并传入一条消息时,存储过程使用模板构造 Webhook 请求的主体。存储过程使用您传入的消息替换 SNOWFLAKE_WEBHOOK_MESSAGE 占位符。

  • 如果对 Webhook 的 HTTP 请求必须包含特定 HTTP 标头,请将 WEBHOOK_HEADERS 设置为标头名称和值的列表。

    在标头值中应显示密钥的位置使用 SNOWFLAKE_WEBHOOK_SECRET 占位符。

接下来的部分提供为不同类型的外部系统创建 Webhook通知集成的示例。

示例 1:为 Slack Webhook 创建通知集成

假设您想向具有 URL 的 Slack Webhook 发送通知:

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
Copy

假设您为 URL 中显示的密钥 T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX 创建了一个密钥对象,名为 my_slack_webhook_secret

执行以下语句来为该 Webhook 创建通知集成:

CREATE OR REPLACE NOTIFICATION INTEGRATION my_slack_webhook_int
  TYPE=WEBHOOK
  ENABLED=TRUE
  WEBHOOK_URL='https://hooks.slack.com/services/SNOWFLAKE_WEBHOOK_SECRET'
  WEBHOOK_SECRET=my_secrets_db.my_secrets_schema.my_slack_webhook_secret
  WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
  WEBHOOK_HEADERS=('Content-Type'='application/json');
Copy

示例 2:为 Teams Webhook 创建通知集成

假设您想向具有 URL 的 Teams Webhook 发送通知:

https://mymsofficehost.webhook.office.com/webhookb2/xxxxxxxx
Copy

假设您为 URL 中显示的密钥 xxxxxx 创建了一个密钥对象,名为 my_teams_webhook_secret

执行以下语句来为该 Webhook 创建通知集成:

CREATE OR REPLACE NOTIFICATION INTEGRATION my_teams_webhook_int
  TYPE=WEBHOOK
  ENABLED=TRUE
  WEBHOOK_URL='https://mymsofficehost.webhook.office.com/webhookb2/SNOWFLAKE_WEBHOOK_SECRET'
  WEBHOOK_SECRET=my_secrets_db.my_secrets_schema.my_teams_webhook_secret
  WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
  WEBHOOK_HEADERS=('Content-Type'='application/json');
Copy

示例 3:为 PagerDuty Webhook 创建通知集成

假设您想向具有 URL 的 PagerDuty Webhook 发送通知:

https://events.pagerduty.com/v2/enqueue
Copy

假设您为应包括在消息正文中的 routing_key 字段中的集成密钥 xxxxxx 创建了一个密钥对象,名为 my_pagerduty_webhook_secret

执行以下语句来为该 Webhook 创建通知集成:

CREATE OR REPLACE NOTIFICATION INTEGRATION my_pagerduty_webhook_int
  TYPE=WEBHOOK
  ENABLED=TRUE
  WEBHOOK_URL='https://events.pagerduty.com/v2/enqueue'
  WEBHOOK_SECRET=my_secrets_db.my_secrets_schema.my_pagerduty_webhook_secret
  WEBHOOK_BODY_TEMPLATE='{
    "routing_key": "SNOWFLAKE_WEBHOOK_SECRET",
    "event_action": "trigger",
    "payload": {
      "summary": "SNOWFLAKE_WEBHOOK_MESSAGE",
      "source": "Snowflake monitoring",
      "severity": "INFO"
    }
  }'
  WEBHOOK_HEADERS=('Content-Type'='application/json');
Copy

向 Webhook 发送通知

要向 Webhook 发送通知,请执行以下操作:

  1. 传递 SANITIZE_WEBHOOK_CONTENT 函数以移除消息中的任何占位符(如 SNOWFLAKE_WEBHOOK_SECRET)。

  2. 调用 SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 存储过程,传递清理后的消息并指定要使用的 Webhook通知集成的名称。

例如,以下语句使用您之前创建的通知集成,向 Slack Webhook 发送 JSON 消息:

CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION(
  SNOWFLAKE.NOTIFICATION.TEXT_PLAIN(
    SNOWFLAKE.NOTIFICATION.SANITIZE_WEBHOOK_CONTENT('my message')
  ),
  SNOWFLAKE.NOTIFICATION.INTEGRATION('my_slack_webhook_int')
);
Copy

在此示例中,该语句以纯文本形式传入一条消息 (my message)。从通知集成的 WEBHOOK_BODY_TEMPLATE 属性指定的模板构造 Webhook 请求的正文时,SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 将 SNOWFLAKE_WEBHOOK_MESSAGE 占位符替换为您传入的消息。

例如,假设您为请求正文指定了以下模板:

CREATE OR REPLACE NOTIFICATION INTEGRATION my_slack_webhook_int
  ...
  WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
  ...
Copy

SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 构造具有以下正文的请求:

{"text": "my message"}
Copy
语言: 中文