

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从亚马逊的 Amazon Lambda 功能 URLs 中接收 SaaS 事件 EventBridge
<a name="eb-saas-furls"></a>

**注意**  
为了让我们的合作伙伴能够访问入站 Webhook，我们正在 Amazon 您的账户中创建一个 Open Lambda，通过验证第三方合作伙伴发送的身份验证签名，在 Lambda 应用程序级别对其进行保护。请与您的安全团队一起检查此配置。有关更多信息，请参阅 [Lambda 函数 URLs的安全和身份验证模型](https://docs.amazonaws.cn/lambda/latest/dg/urls-auth.html#urls-auth-none)。

您的 Amazon EventBridge [事件总线](eb-event-bus.md)可以使用 Amazon CloudFormation 模板创建的[Amazon Lambda 函数 URL](https://docs.amazonaws.cn/lambda/latest/dg/lambda-urls.html) 来接收来自支持的 SaaS 提供商[的事件](eb-events.md)。使用函数 URLs，事件数据将发送到 Lambda 函数。然后，该函数将这些数据转换为事件，该事件可以由事件总线接收 EventBridge 并发送到事件总线进行处理。事件进入事件总线后，您可以使用规则来筛选事件，应用任何已配置的输入转换，然后将其路由到正确的目标。

**注意**  
创建 Lambda 函数 URLs 会增加您的每月费用。有关更多信息，请参阅[Amazon Lambda 定价](https://www.amazonaws.cn/lambda/pricing)。

要设置与的连接 EventBridge，首先要选择要与之建立连接的 SaaS 提供商。然后，提供您与该提供商一起创建的*签名密钥*，然后选择要向其发送 EventBridge 事件的事件总线。最后，使用 Amazon CloudFormation 模板并创建完成连接所需的资源。

以下 SaaS 提供商目前可用于 EventBridge 使用 Lambda 函数： URLs
+ GitHub
+ Twilio

**Topics**
+ [步骤 1：创建 Amazon CloudFormation 堆栈](#create-gh-cfn-stack)
+ [步骤 2：创建 GitHub Webhook](#create-gh-webhook)
+ [设置 Twilio 连接](#furls-connection-twilio)
+ [更新 Webhook 密钥或身份验证令牌](#furls-update-secret)
+ [更新 Lambda 函数](#furls-update-function)
+ [可用事件类型](#furls-event-types)
+ [配额、错误代码和传送重试](#furls-quotas-errors)

## 步骤 1：创建 Amazon CloudFormation 堆栈
<a name="create-gh-cfn-stack"></a>

 首先，使用 Amazon EventBridge 控制台创建 CloudFormation 堆栈：

1. 打开亚马逊 EventBridge 控制台，网址为[https://console.aws.amazon.com/events/](https://console.amazonaws.cn/events/)。

1. 从导航窗格中选择**快速入门**。

1. 在 “**使用 Lambda URLs f 的入站 Webhook**” 下，**选择**入门。

1. 在 **GitHub** 下，选择**设置**。

1. 在**步骤 1：选择事件总线**下，从下拉列表中选择一个事件总线。此事件总线从您提供给 GitHub 的 Lambda 函数 URL 接收数据。您也可以选择**新建事件总线**来创建事件总线。

1. 在 “**步骤 2：使用进行设置**” 下 CloudFormation，选择 “**新建 GitHub webhook**”。

1. 选择**我确认我创建的入站 Webhook 可以公开访问。**然后选择**确认**。

1. 输入堆栈的名称。

1. 在参数下，验证是否列出了正确的事件总线，然后为 **GitHubWebhookSecret** 指定安全令牌。有关创建安全令牌的更多信息，请参阅 GitHub 文档中的[设置您的密钥令牌](https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks#setting-your-secret-token)。

1. 在**功能和转换**下，选择以下各项：
   + **我承认这 Amazon CloudFormation 可能会创建 IAM 资源。**
   + **我承认这 Amazon CloudFormation 可能会创建带有自定义名称的 IAM 资源。**
   + **我承认这 Amazon CloudFormation 可能需要以下能力：`CAPABILITY_AUTO_EXPAND`**

1. 选择**创建堆栈**。

## 步骤 2：创建 GitHub Webhook
<a name="create-gh-webhook"></a>

接下来，在 GitHub 中创建 Webhook。要完成此步骤，您需要安全令牌和在步骤 2 中创建的 Lambda 函数 URL。有关更多信息，请参阅 GitHub 文档中的[创建 Webhook](https://docs.github.com/en/developers/webhooks-and-events/webhooks/creating-webhooks)。

## 设置 Twilio 连接
<a name="furls-connection-twilio"></a>

### 步骤 1：查找您的 Twilio 身份验证令牌
<a name="create-twilio-secret"></a>

要在Twilio和之间建立连接 EventBridge，请先Twilio使用Twilio账户的身份验证令牌或密钥将连接设置为。有关更多信息，请参阅 Twilio 文档中的[身份验证令牌及其更改方法](https://support.twilio.com/hc/en-us/articles/223136027-Auth-Tokens-and-How-to-Change-Them)。

### 步骤 2：创建 Amazon CloudFormation 堆栈
<a name="create-twilio-cfn-stack"></a>

1. 打开亚马逊 EventBridge 控制台，网址为[https://console.aws.amazon.com/events/](https://console.amazonaws.cn/events/)。

1. 在导航窗格中选择**快速入门**。

1. 在 “**使用 Lambda URLs f 的入站 Webhook**” 下，**选择**入门。

1. 在 **Twilio** 下，选择**设置**。

1. 在**步骤 1：选择事件总线**下，从下拉列表中选择一个事件总线。此事件总线从您提供给 Twilio 的 Lambda 函数 URL 接收数据。您也可以选择**新建事件总线**来创建事件总线。

1. 在 “**步骤 2：使用进行设置**” 下 CloudFormation，选择 “**新建 Twilio webhook**”。

1. 选择**我确认我创建的入站 Webhook 可以公开访问。**然后选择**确认**。

1. 输入堆栈的名称。

1. 在参数下，验证是否列出了正确的事件总线，然后输入您在步骤 1 中创建的 **TwilioWebhookSecret**。

1. 在**功能和转换**下，选择以下各项：
   + **我承认这 Amazon CloudFormation 可能会创建 IAM 资源。**
   + **我承认这 Amazon CloudFormation 可能会创建带有自定义名称的 IAM 资源。**
   + **我承认这 Amazon CloudFormation 可能需要以下功能：CAPABILITY\$1AUTO\$1EXPAND**

1. 选择**创建堆栈**。

### 步骤 3：创建 Twilio Webhook
<a name="create-twilio-webhook"></a>

设置 Lambda 函数 URL 后，您需要将其提供给 Twilio，以便发送事件数据。有关更多信息，请参阅 Twilio 文档中的[使用 Twilio 配置您的公共 URL](https://www.twilio.com/docs/usage/webhooks/getting-started-twilio-webhooks#configure-your-public-url-with-twilio)。

## 更新 Webhook 密钥或身份验证令牌
<a name="furls-update-secret"></a>

### 更新 GitHub 密钥
<a name="update-gh-secret"></a>

**注意**  
GitHub 不支持同时拥有两个密钥。当 Amazon CloudFormation 堆栈中的GitHub密钥和密钥不同步时，您可能会遇到资源停机情况。 GitHub由于签名不正确，在密钥不同步时发送的消息将失败。等到GitHub和 CloudFormation 密钥同步，然后重试。

1. 新建 GitHub 密钥。有关更多信息，请参阅 GitHub 文档中[加密机密](https://docs.github.com/en/actions/security-guides/encrypted-secrets)。

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.amazonaws.cn/cloudformation/) ion 上打开 Amazon CloudFormation 控制台。

1. 从导航窗格中，选择**堆栈**。

1. 为 Webhook 选择堆栈，其中包含要更新的密钥。

1. 选择**更新**。

1. 确保选中**使用当前模板**，然后选择**下一步**。

1. 在下方 **GitHubWebhookSecret**，清除 “**使用现有值**”，输入您在步骤 1 中创建的新GitHub密钥，然后选择**下一**步。

1. 选择**下一步**。

1. 选择**更新堆栈**。

密钥传播可能最多需要一个小时。为了缩短停机时间，您可以刷新 Lambda 执行上下文。

### 更新 Twilio 密钥
<a name="update-twilio-secret"></a>

**注意**  
Twilio 不支持同时拥有两个密钥。当 Amazon CloudFormation 堆栈中的Twilio密钥和密钥不同步时，您可能会遇到资源停机情况。 Twilio由于签名不正确，在密钥不同步时发送的消息将失败。等到Twilio和 CloudFormation 密钥同步，然后重试。

1. 新建 Twilio 密钥。有关更多信息，请参阅 Twilio 文档中的[身份验证令牌及其更改方法](https://support.twilio.com/hc/en-us/articles/223136027-Auth-Tokens-and-How-to-Change-Them)。

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.amazonaws.cn/cloudformation/) ion 上打开 Amazon CloudFormation 控制台。

1. 从导航窗格中，选择**堆栈**。

1. 为 Webhook 选择堆栈，其中包含要更新的密钥。

1. 选择**更新**。

1. 确保选中**使用当前模板**，然后选择**下一步**。

1. 在下方 **TwilioWebhookSecret**，清除 “**使用现有值**”，输入您在步骤 1 中创建的新Twilio密钥，然后选择**下一**步。

1. 选择**下一步**。

1. 选择**更新堆栈**。

密钥传播可能最多需要一个小时。为了缩短停机时间，您可以刷新 Lambda 执行上下文。

## 更新 Lambda 函数
<a name="furls-update-function"></a>

 CloudFormation 堆栈创建的 Lambda 函数创建基本的 webhook。如果您想针对特定用例（例如自定义日志）自定义 Lambda 函数，请使用 CloudFormation 控制台访问该函数，然后使用 Lambda 控制台更新 Lambda 函数代码。

**访问 Lambda 函数**

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.amazonaws.cn/cloudformation/) ion 上打开 Amazon CloudFormation 控制台。

1. 从导航窗格中，选择**堆栈**。

1. 为 Webhook 选择堆栈，其中包含要更新的 Lambda 函数。

1. 选择**资源**选项卡。

1. 要在 Lambda 控制台中打开 Lambda 函数，请在**物理 ID** 下选择 Lambda 函数的 ID。

现在您已获得了 Lambda 函数，请使用 Lambda 控制台更新函数代码。

**更新 Lambda 函数代码**

1. 在**操作**下，选择**导出函数**。

1. 选择**下载部署包**并将文件保存到您的计算机中。

1. 解压缩部署包 .zip 文件，更新 `app.py` 文件，然后压缩更新后的部署包，确保包含原始 .zip 文件中的所有文件。

1. 在 Lambda 控制台中，选择**代码**选项卡。

1. 在 **Code source**（代码源）下，选择 **Upload from**（上载自）。

1. 选择 **.zip file** (.zip 文件)，然后选择 **Upload file** (上载文件)。

   1. 在文件选择器中，选择您更新的文件，然后依次选择**打开**和**保存**。

1. 在**操作**下，选择**发布新版本**。

## 可用事件类型
<a name="furls-event-types"></a>

事件总线目前支持以下 CloudFormation 事件类型：
+ **GitHub**— 支持[所有事件类型](https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads)。
+ **Twilio** - 支持[事件后 Webhook](https://www.twilio.com/docs/chat/webhook-events)。

## 配额、错误代码和传送重试
<a name="furls-quotas-errors"></a>

### 配额
<a name="furls-quotas"></a>

Webhook 的传入请求数量受底层 Amazon 服务的限制。下表包括相关的配额。


| 服务 | 配额 | 
| --- | --- | 
|  Amazon Lambda  |  默认：10 个并发执行 有关配额的更多信息（包括如何请求增加配额），请参阅 [Lambda 配额](https://docs.amazonaws.cn/lambda/latest/dg/gettingstarted-limits.html)。  | 
|  Amazon Secrets Manager  |  默认：每秒 5,000 个请求 有关配额的更多信息（包括如何请求增加配额），请参阅 [Amazon Secrets Manager 配额](https://docs.amazonaws.cn/secretsmanager/latest/userguide/reference_limits.html)。 使用 [Amazon Secrets Manager Python 缓存客户端](https://github.com/aws/aws-secretsmanager-caching-python#cache-configuration)可以最大限度地减少每秒的请求数。  | 
|  Amazon EventBridge  |   PutEvents 操作的最大条目大小为 1 MB。 EventBridge 强制执行基于区域的费率配额。有关更多信息，请参阅 [EventBridge 活动总线配额](eb-quota.md#eb-limits)。  | 

### 错误代码
<a name="furls-errors"></a>

发生错误时，每项 Amazon 服务都会返回特定的错误代码。下表包括相关的错误代码。


| 服务 | 错误代码 | 说明 | 
| --- | --- | --- | 
|  Amazon Lambda  |  429 “” TooManyRequestsExption  |  超出并发执行配额。  | 
|  Amazon Secrets Manager  |  500 “Internal Server Error”  |  超出每秒请求数配额。  | 
|  Amazon EventBridge  |  500 “Internal Server Error”  |  超出该区域的费率配额。  | 

### 活动重新传送
<a name="furls-redelivery"></a>

发生错误时，您可以重试传送受影响的事件。每个 SaaS 提供商都有不同的重试步骤。

#### GitHub
<a name="furls-redelivery-github"></a>

可使用 GitHub Webhook API 检查任何 Webhook 调用的传送状态，并在需要时重新传送事件。有关更多信息，请参阅 GitHub 文档：
+ **组织** - [为组织 Webhook 重新传送](https://docs.github.com/en/rest/orgs/webhooks#redeliver-a-delivery-for-an-organization-webhook)
+ **存储库** - [为存储库 Webhook 重新传送](https://docs.github.com/en/rest/webhooks/repo-deliveries#redeliver-a-delivery-for-a-repository-webhook)
+ **应用** - [为应用 Webhook 重新传送](https://docs.github.com/en/rest/apps/webhooks#redeliver-a-delivery-for-an-app-webhook)

#### Twilio
<a name="furls-redelivery-twilio"></a>

Twilio 用户可以使用连接覆盖来自定义事件重试选项。有关更多信息，请参阅 Twilio 文档中的 [Webhook（HTTP 回调）：连接覆盖](https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides)。