AWS Step Functions
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

启动状态机执行以响应 Amazon S3 事件

您可以使用 Amazon CloudWatch Events 来执行 Step Functions 状态机以响应事件,或按计划执行状态机。

本教程演示如何将状态机配置作为 CloudWatch Events 规则的目标。这将在有文件添加到 Amazon S3 存储桶时启动执行。

对于实际应用程序,您可以启动状态机,该状态机会对添加到存储桶的文件执行操作,例如创建缩略图或者对图像和视频文件运行 Amazon Rekognition 分析。

在本教程中,您将通过将文件添加到 Amazon S3 存储桶来启动一个简单的 Helloworld 状态机执行。然后我们将检查该执行的示例输入,以显示来自 CloudTrail 的输入中包含哪些信息。

先决条件:创建状态机

在您配置 CloudWatch Events 目标之前,必须创建状态机。

  • 要创建基本状态机,请使用入门教程。

  • 如果您已有 Helloworld 状态机,请继续到下一个步骤。

步骤 1:在 Amazon S3 中创建存储桶

现在您有一个 Helloworld 状态机,您需要使用 Amazon S3 存储桶。在本教程中的步骤 3 中,您将设置一个规则,这样当有文件添加到此存储桶时,CloudWatch Events 会触发状态机执行。

  1. 导航到 Amazon S3 控制台,然后选择创建存储桶

  2. 输入存储桶名称,如 username-sfn-tutorial

    注意

    存储桶名称在 Amazon S3 的所有 AWS 区域中的所有现有存储桶名称之间必须唯一。使用您自己的用户名以使此名称唯一。您必须在相同的 AWS 区域中创建所有资源。

  3. 选择 Create

步骤 2:在 AWS CloudTrail 中创建跟踪

在创建 Amazon S3 存储桶之后,在 CloudTrail 中创建一个跟踪。

要使 Amazon S3 中的 API 事件匹配您的 CloudWatch Events 规则,必须在 CloudTrail 中配置一个跟踪以接收这些事件。

  1. 导航到 AWS CloudTrail 控制台,选择查看跟踪,然后选择创建跟踪

  2. 对于跟踪名称,输入 S3Event

  3. S3 选项卡上,选择 Add S3 bucket (添加 S3 存储桶)

  4. 对于存储桶名称,输入您在之前创建的 Amazon S3 存储桶的名称:username-sfn-tutorial (步骤 1:在 Amazon S3 中创建存储桶)。

  5. 存储位置下,选择创建新的 S3 存储桶旁边的

  6. 对于S3 存储桶,输入新的存储桶名称,以用于存储有关您之前创建的 Amazon S3 存储桶的操作的信息。

    注意

    此存储桶名称在所有 Amazon S3 区域中必须是唯一的。在存储桶名称中包含您的用户名,以使该名称唯一:username-sfn-tutorial-storage

  7. 选择 Create

步骤 3:创建 CloudWatch Events 规则

在您拥有状态机并且创建了 Amazon S3 存储桶以及在 AWS CloudTrail 中创建了跟踪后,创建您的 Amazon CloudWatch Events 规则。

注意

必须在与 Amazon S3 存储桶相同的 AWS 区域中配置 CloudWatch Events。

创建规则

  1. 导航到 CloudWatch 控制台,选择事件,然后选择创建规则

    此时将显示 Step 1: Create rule 页面。

  2. 事件源中,选择事件模式

  3. 对于服务名称,选择 Simple Storage Service (S3)

  4. 对于事件类型,选择 Object Level Operations

  5. 选择 Specific operation(s) (特定操作),然后选择 PutObject

    注意

    如果对象大小超过 PutObject 操作中使用的分段阈值,则所记录的 AWS CloudTrail API 将为 CompleteMultipartUpload,而不是 PutObject。请参阅 AWS CloudTrail User Guide 中的分段上传概述

  6. 选择 Specific bucket(s) by name (按名称的特定存储桶),然后输入您在步骤 1 中创建的存储桶名称 (username-sfn-tutorial)。

事件源页面应与以下内容类似。


                    创建规则

创建目标

  1. 目标部分中,选择添加目标

  2. 从列表中选择 Step Functions 状态机,然后在状态机列表中,选择步骤 1 中创建的状态机 (Helloworld)。

  3. CloudWatch Events 可以创建您的事件在运行时所需的 IAM 角色:

    • 若要自动创建 IAM 角色,请选择为此特定资源创建新角色

    • 要使用您之前创建的 IAM 角色,请选择使用现有角色

  4. 选择 Configure details

    此时将显示 Step 2: Configure rule details 页面。

  5. 为您的规则输入名称(例如,S3StepFunctions),对于状态,选择已启用,然后选择创建规则

    配置规则详细信息部分应与以下内容类似。

    
                            配置规则详细信息

    此时将创建规则并显示 Rules (规则) 页面,其中列出您的所有 CloudWatch Events 规则。

步骤 4:测试 CloudWatch 规则

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

  1. 将文件添加到您的 Amazon S3 存储桶。

    导航到 Amazon S3 控制台,选择您创建的存储桶 (username-sfn-tutorial),然后选择上传

  2. 添加文件(以下示例中的 test.png),然后选择上传

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

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

    导航到 Step Functions 控制台,然后选择在您的 CloudWatch Events 规则中使用的状态机 (Helloworld)

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

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

执行输入的示例

下面的示例说明了状态机执行的典型输入。

{ "version": "0", "id": "8d6f9246-b781-44f8-a026-f1c1ab2c61f0", "detail-type": "AWS API Call via CloudTrail", "source": "aws.s3", "account": "123456789012", "time": "2018-09-12T00:25:10Z", "region": "us-east-2", "resources": [], "detail": { "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AKIAIOSFODNN7EXAMPLE", "arn": "arn:aws:iam::123456789012:user/username", "accountId": "123456789012", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "username", "sessionContext": { "attributes": { "creationDate": "2018-09-11T20:10:38Z", "mfaAuthenticated": "true" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2018-09-12T00:25:10Z", "eventSource": "s3.amazonaws.com", "eventName": "PutObject", "awsRegion": "us-east-2", "sourceIPAddress": "203.0.113.34", "userAgent": "signin.amazonaws.com", "requestParameters": { "X-Amz-Date": "20180912T002509Z", "bucketName": "username-sfn-tutorial", "X-Amz-Algorithm": "AWS4-HMAC-SHA256", "x-amz-acl": "private", "X-Amz-SignedHeaders": "content-type;host;x-amz-acl;x-amz-storage-class", "X-Amz-Expires": "300", "key": "test.png", "x-amz-storage-class": "STANDARD" }, "responseElements": null, "additionalEventData": { "x-amz-id-2": "IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km" }, "requestID": "79104EXAMPLEB723", "eventID": "cdc4b7ed-e171-4cef-975a-ad829d4123e8", "readOnly": false, "resources": [ { "type": "AWS::S3::Object", "ARN": "arn:aws:s3:::username-sfn-tutorial-2/test.png" }, { "accountId": "123456789012", "type": "AWS::S3::Bucket", "ARN": "arn:aws:s3:::username-sfn-tutorial" } ], "eventType": "AwsApiCall", "recipientAccountId": "123456789012" } }