

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

# 启动 Step Functions 工作流以响应事件
<a name="tutorial-cloudwatch-events-s3"></a>

您可以执行 AWS Step Functions 状态机来响应由亚马逊 EventBridge 规则路由到 Step Functions 作为目标的事件。

以下教程向您展示如何将状态机配置为 Amazon EventBridge 规则的目标。每当向亚马逊简单存储服务 (Amazon S3) Simple Storage Service 存储桶中添加文件时， EventBridge 该规则都会启动状态机。

这种方法的实际应用示例是：创建一个状态机，对添加到存储桶中的图像文件运行 Amazon Rekognition 分析，以进行分类并分配关键字。

在本教程中，您通过将文件上传至 Amazon S3 存储桶来启动一个 `Helloworld` 状态机执行。然后，您可以查看该执行的示例输入，以确定发送到的 Amazon S3 事件通知的输入中包含的信息 EventBridge。

## 先决条件：创建状态机
<a name="tutorial-cloudwatch-events-s3-prereqs"></a>

在将状态机配置为 Amazon EventBridge 目标之前，必须先创建状态机。
+ 要创建基本状态机，请参阅[创建使用 Lambda 函数的状态机](tutorial-creating-lambda-state-machine.md)教程。
+ 如果您已有 `Helloworld` 状态机，请继续到下一个步骤。

## 第 1 步：在 Amazon S3 中创建一个存储桶
<a name="tutorial-cloudwatch-events-s3-bucket"></a>

现在您已有 `Helloworld` 状态机，则需要创建一个用于存储文件的 Amazon S3 存储桶。在本教程的步骤 3 中，您设置了一条规则，以便在文件上传到此存储桶时， EventBridge 触发状态机的执行。

1. 导航到 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)，然后选择**创建存储桶**，创建要在其中存储文件的存储桶并触发 Amazon S3 事件规则。

1. 输入**存储桶名称**，如 `{{username}}-sfn-tutorial`。
**注意**  
在 Amazon S3 中所有 AWS 区域的所有现有存储桶名称中，存储桶名称必须是唯一的。使用你自己的名字{{username}}来使这个名字独一无二。您需要在同一个 AWS 区域中创建所有资源。

1. 保留此页面上的所有默认选项，然后选择**创建存储桶**。

## 第 2 步：使用以下方式启用 Amazon S3 事件通知 EventBridge
<a name="tutorial-cloudwatch-events-s3-eb-notification"></a>

创建 Amazon S3 存储桶后，将其配置为在您的 S3 存储桶中发生某些事件（例如文件上传） EventBridge 时向其发送事件。

1. 导航到 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)。

1. 在**存储桶**列表中，请选择要为其启用事件的存储桶的名称。

1. 选择**属性**。

1. 向下滚动页面以查看 “**活动通知**” 部分，然后在 “**Amazon**” EventBridge 子部分中选择 **“编辑”**。

1. 在 “**向亚马逊 EventBridge 发送有关此存储桶中所有事件的通知**” 下，选择 “**开**”。

1. 选择**保存更改**。
**注意**  
启用后 EventBridge，更改大约需要五分钟才能生效。

## 第 3 步：创建 Amazon EventBridge 规则
<a name="tutorial-cloudwatch-events-s3-cwe"></a>

在您拥有状态机并创建 Amazon S3 存储桶并将其配置为向其发送事件通知后 EventBridge，创建 EventBridge 规则。

**注意**  
您必须在与 Amazon S3 存储桶相同的 AWS 区域中配置 EventBridge 规则。

### 创建规则
<a name="tutorial-cloudwatch-events-s3-create-rule"></a>

1. 导航至 [Amazon EventBridge 控制台](https://console.aws.amazon.com/events/)，选择**创建规则**。
**提示**  
或者，在 EventBridge 控制台的导航窗格中，选择 “**总线**” 下的 “**规则**”，然后选择 “**创建规则**”。

1. 输入规则的**名称**（例如 `{{S3Step Functions}}`），然后根据需要输入规则的**描述**。

1. 对于**事件总线**和**规则类型**，请保留默认选择。

1. 选择**下一步**。这将打开**构建事件模式**页面。

1. 向下滚动到**事件模式**部分，然后执行以下操作：

   1. 对于**事件源**，保留**AWS 事件或 EventBridge 合作伙伴事件**的默认选择。

   1. 对于 **AWS 服务**，选择 **Simple Storage Service (S3)**。

   1. 对于**事件类型**，选择 **Amazon S3 事件通知**。

   1. 选择**特定事件**，然后选择**已创建对象**。

   1. 选择**按名称的特定存储桶**，然后输入您在[第 1 步](#tutorial-cloudwatch-events-s3-bucket)中创建的存储桶名称 (`{{username}}-sfn-tutorial`)。

   1. 选择**下一步**。这将打开**选择目标**页面。

### 创建目标
<a name="tutorial-cloudwatch-events-s3-create-rule2"></a>

1. 在**目标 1** 中，保留 **AWS 服务**的默认选择。

1. 在**选择目标**下拉列表中，选择 **Step Functions 状态机**。

1. 在**状态机**列表中，选择您[之前创建](#tutorial-cloudwatch-events-s3-prereqs)的状态机（例如 `Helloworld`）。

1. 保留页面上的所有默认选项，然后选择**下一步**。这将打开**配置标签**页面。

1. 再次选择**下一步**。这将打开**查看并创建**页面。

1. 查看规则详细信息并选择**创建规则**。

   规则已创建并显示 “**规则**” 页面，其中列出了您的所有 Amazon EventBridge 规则。

## 第 4 步：测试规则
<a name="tutorial-cloudwatch-events-test-rule"></a>

现在一切就绪，试验将文件添加到 Amazon S3 存储桶，然后查看生成的状态机执行的输入。

1. 将一个文件添加到 Amazon S3 存储桶中。

   导航到 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)，选择您创建的存储文件的存储桶 (`{{username}}-sfn-tutorial`)，然后选择**上传**。

1. 添加文件，例如 `{{test.png}}`，然后选择**上传**。

   这将启动一个状态机执行，并以输入的形式传递来自 AWS CloudTrail 的信息。

1. 检查您的状态机的执行情况。

   导航到 [Step Functions 控制台，然后选择您的亚马逊 EventBridge 规则中使用的状态机 (`Helloworld`)](https://console.aws.amazon.com/states/)。

1. 选择最近的状态机执行并展开**执行输入**部分。

   此输入包含诸如存储桶名称和对象名称之类的信息。在真实使用案例中，状态机可以使用此输入对该对象执行操作。

## 执行输入的示例
<a name="tutorial-cloudwatch-events-example"></a>

下面的示例展示了状态机执行的一个典型输入。

```
{
    "version": "0",
    "id": "6c540ad4-0671-9974-6511-756fbd7771c3",
    "detail-type": "Object Created",
    "source": "aws.s3",
    "account": "123456789012",
    "time": "2023-06-23T23:45:48Z",
    "region": "us-east-2",
    "resources": [
      "arn:aws:s3:::{{username}}-sfn-tutorial"
    ],
    "detail": {
      "version": "0",
      "bucket": {
        "name": "{{username}}-sfn-tutorial"
      },
      "object": {
        "key": "test.png",
        "size": 800704,
        "etag": "f31d8546bb67845b4d3048cde533b937",
        "sequencer": "00621049BA9A8C712B"
      },
      "request-id": "79104EXAMPLEB723",
      "requester": "123456789012",
      "source-ip-address": "200.0.100.11",
      "reason": "PutObject"
    }
  }
```