

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

# 使用处理亚马逊 S3 事件 AWS SAM
<a name="serverless-example-s3"></a>

使用此示例应用程序，您可以在前面示例所学内容的基础上进行构建，然后安装更复杂的应用程序。此应用程序由一个 Lambda 函数组成，该函数由 Amazon S3 对象上传事件源调用。本练习向您展示如何通过 Lambda 函数访问 AWS 资源和进行 AWS 服务调用。

此示例无服务器应用程序处理 Amazon S3 中的对象创建事件。对于上传到存储桶的每个映像，Amazon S3 都会检测对象创建的事件并调用 Lambda 函数。Lambda 函数调用 Amazon Rekognition 以检测映像中的文本。然后，它将 Amazon Rekognition 返回的结果存储在 DynamoDB 表中。

**注意**  
使用此示例应用程序，执行步骤的顺序与前面的示例略有不同。其原因是，此示例要求先创建 AWS 资源并配置 IAM 权限，*然后才能在本地*测试 Lambda 函数。我们将利用 CloudFormation 来创建资源并为您配置权限。否则，您需要手动执行此操作，然后才能在本地测试 Lambda 函数。  
由于此示例更为复杂，因此在执行之前，请确保熟悉前面的示例应用程序的安装。

## 开始前的准备工作
<a name="serverless-example-s3-prereq"></a>

请确保您已完成 [安装 AWS SAM CLI](install-sam-cli.md) 中的所需设置。

## 第 1 步：初始化应用程序
<a name="serverless-example-s3-setup-local-app"></a>

在本节中，您将下载由 AWS SAM 模板和应用程序代码组成的示例应用程序。

**初始化应用程序**

1. 在 AWS SAM CLI 命令提示符处运行以下命令。

   ```
   sam init \
   --location https://github.com/aws-samples/cookiecutter-aws-sam-s3-rekognition-dynamodb-python \
   --no-input
   ```

1. 查看命令创建的目录的内容 (`aws_sam_ocr/`)：
   + `template.yaml`— 定义 Amazon S3 应用程序所需的三种 AWS 资源：一个 Lambda 函数、一个 Amazon S3 存储桶和一个 DynamoDB 表。模板还定义了这些资源之间的映射和权限。
   + `src/` 目录 – 包含 Amazon S3 应用程序代码。
   + `SampleEvent.json` – 示例事件源，用于本地测试。

## 第 2 步：打包应用程序
<a name="serverless-example-s3-package-serverless-app"></a>

在本地测试此应用程序之前，必须使用创建部署包，使用该程序包将应用程序部署到 AWS 云端。 AWS SAMCLI此部署创建了在本地测试应用程序所需的必要 AWS 资源和权限。

**要创建 Lambda 部署包**

1. 在要保存打包代码的位置创建 S3 存储桶。如果要使用现有 S3 存储桶，请跳过此步骤。

   ```
   aws s3 mb s3://bucketname
   ```

1. 通过在命令提示符处运行以下 `package` CLI 命令创建部署包。

   ```
   sam package \
       --template-file template.yaml \
       --output-template-file packaged.yaml \
       --s3-bucket bucketname
   ```

   在下一步部署应用程序时，您应指定新的模板文件 `packaged.yaml`。

## 第 3 步：部署应用程序
<a name="serverless-example-s3-deploy-serverless-app"></a>

现在，您已经创建了部署包，您可以使用它来将应用程序部署到 AWS 云端。然后，您可以通过在 AWS 云端调用应用程序来测试该应用程序。

**将无服务器应用程序部署到云端 AWS**
+ 在中 AWS SAMCLI，使用`deploy`命令部署您在模板中定义的所有资源。

  

  ```
  sam deploy \
      --template-file packaged.yaml \
      --stack-name aws-sam-ocr \
      --capabilities CAPABILITY_IAM \
      --region us-east-1
  ```

  在命令中，`--capabilities`参数 CloudFormation 允许创建 IAM 角色。

  CloudFormation 创建模板中定义的 AWS 资源。您可以在 CloudFormation 控制台中访问这些资源的名称。

**在云端测试无服务器应用程序 AWS**

1. 将映像上传到您为本示例应用程序创建的 Amazon S3 存储桶。

1. 打开 DynamoDB 控制台并找到已创建的表。有关 Amazon Rekognition 返回的结果，请参阅下表。

1. 验证 DynamoDB 表中是否包含新记录，其中包含 Amazon Rekognition 在上传的映像中找到的文本。

## 第 4 步：在本地测试应用程序
<a name="serverless-example-s3-test-locally"></a>

在本地测试应用程序之前，必须先检索由创建的 AWS 资源的名称 CloudFormation。
+ 从中检索 Amazon S3 密钥名称和存储桶名称 CloudFormation。通过替换对象密钥、存储桶名称和存储桶 ARN 的值来修改 `SampleEvent.json` 文件。
+ 检索 DynamoDB 表名称。此名称用于以下 `sam local invoke` 命令。

使用 AWS SAM CLI 生成示例 Amazon S3 事件并调用 Lambda 函数：

```
TABLE_NAME=Table name obtained from CloudFormation console sam local invoke --event SampleEvent.json
```

`TABLE_NAME=` 部分设置 DynamoDB 表名称。`--event` 参数指定包含要传递给 Lambda 函数的测试事件消息的文件。

现在，您可以根据 Amazon Rekognition 返回的结果验证是否创建了预期的 DynamoDB 记录。

## 后续步骤
<a name="serverless-example-s3-next-steps"></a>

要继续了解 AWS SAM，请参阅以下资源：
+ **[Serverless Land](https://serverlessland.com/patterns?framework=AWS+SAM)** — 该网站汇集了专门针对 S AWS AM 应用程序的无服务器模式、代码示例和学习资源。