

# 教程：使用 S3 对象 Lambda 转换应用程序的数据
<a name="tutorial-s3-object-lambda-uppercase"></a>

**注意**  
自 2025 年 11 月 7 日起，S3 对象 Lambda 仅可供当前在使用该服务的现有客户以及部分 AWS 合作伙伴网络（APN）合作伙伴使用。要了解与 S3 对象 Lambda 类似的功能，请在此处了解更多信息：[Amazon S3 Object Lambda availability change](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html)。

在 Amazon S3 中存储数据时，您可以轻松共享数据供多个应用程序使用。但是，每个应用程序可能具有独特的数据格式要求，可能需要针对特定用例修改或处理您的数据。例如，由电子商务应用程序创建的数据集可能包括个人识别信息（PII）。处理相同的数据以进行分析时，不需要此 PII，应该进行修订。但是，如果将同一数据集用于营销活动，可能需要使用其他详细信息来丰富数据，例如来自客户忠诚度数据库的信息。

采用 [S3 对象 Lambda](https://aws.amazon.com/s3/features/object-lambda)，可以添加自己的代码处理从 S3 检索的数据，然后再将其返回应用程序。具体来说，您可以配置 AWS Lambda 函数并将其附加到 S3 对象 Lambda 接入点。当应用程序通过 S3 对象 Lambda 接入点发送 [standard S3 GET requests](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 时，将调用指定的 Lambda 函数，以处理通过 S3 支持接入点从底层数据来源检索到的任何数据。然后，S3 对象 Lambda 接入点将转换后的结果返回给应用程序。您可以创作和执行自己的自定义 Lambda 函数，根据您的特定用例定制 S3 对象 Lambda 数据转换，所有这些都不需要更改您的应用程序。

![\[这是 S3 对象 Lambda 工作流示意图。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/ol-example-image-global.png)


**目标**  
在本教程中，您将了解如何将自定义代码添加到标准 S3 GET 请求中，修改从 S3 检索到的请求对象，从而使该对象适合请求客户端或应用程序的需要。具体而言，您将了解如何通过 S3 对象 Lambda，将存储在 S3 存储桶中的原始对象中的所有文本转换为大写。

**注意**  
本教程使用 Python 代码来转换数据，有关使用其它 AWS SDK 的示例，请参阅 AWS SDK 代码示例库中的 [Transform data for your application with S3 Object Lambda](https://docs.aws.amazon.com/code-library/latest/ug/lambda_example_cross_ServerlessS3DataTransformation_section.html)。

**Topics**
+ [先决条件](#ol-upper-prerequisites)
+ [步骤 1：创建 S3 存储桶](#ol-upper-step1)
+ [步骤 2：将文件上传到 S3 存储桶。](#ol-upper-step2)
+ [步骤 3：创建 S3 接入点](#ol-upper-step3)
+ [步骤 4：创建 Lambda 函数](#ol-upper-step4)
+ [步骤 5：为 Lambda 函数的执行角色配置 IAM 策略](#ol-upper-step5)
+ [步骤 6：创建 S3 对象 Lambda 接入点](#ol-upper-step6)
+ [步骤 7：查看转换的数据](#ol-upper-step7)
+ [步骤 8：清除](#ol-upper-step8)
+ [后续步骤](#ol-upper-next-steps)

## 先决条件
<a name="ol-upper-prerequisites"></a>

在开始本教程之前，您必须具有 AWS 账户，您可使用具有正确权限的 AWS Identity and Access Management（IAM）用户登录此账户。您还必须安装 Python 3.8 或更高版本。

**Topics**
+ [在您的 AWS 账户 中创建具有权限的 IAM 用户（控制台）](#ol-upper-prerequisites-account)
+ [在本地计算机上安装 Python 3.8 或更高版本](#ol-upper-prerequisites-python)

### 在您的 AWS 账户 中创建具有权限的 IAM 用户（控制台）
<a name="ol-upper-prerequisites-account"></a>

您可以为此教程创建 IAM 用户。要完成本教程，您的 IAM 用户必须附加以下 IAM 策略才能访问相关 AWS 资源并执行特定操作。有关如何创建 IAM 用户的更多信息，请参阅 *《IAM 用户指南》*中的[创建 IAM 用户（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

您的 IAM 用户需要以下策略：
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) - 授予对所有 Amazon S3 操作的权限，包括创建和使用对象 Lambda 接入点的权限。
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) - 对所有 Lambda 操作授予权限。
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) - 对所有 IAM 操作授予权限。
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) - 授予读取 IAM Access Analyzer 提供的所有访问信息的权限。
+ [CloudWatchLogsFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/CloudWatchLogsFullAccess$jsonEditor) – 授予对 CloudWatch Logs 的完全访问权限。

**注意**  
为简单起见，本教程创建并使用 IAM 用户。完成本教程后，请记住 [删除 IAM 用户](#ol-upper-step8-delete-user)。对于生产用途，我们建议您遵循《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。最佳实践要求人类用户将联合身份验证与身份提供商结合使用，以使用临时凭证访问 AWS。另一项最佳实践是要求工作负载使用带有 IAM 角色的临时凭证访问 AWS。要了解如何使用 AWS IAM Identity Center 创建具有临时凭证的用户，请参阅《AWS IAM Identity Center 用户指南》**中的[入门](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)。  
本教程还使用完全访问 AWS 托管式策略。对于生产用途，建议您根据[安全最佳实践](security-best-practices.md#security-best-practices-prevent)仅授予用例所需的最低权限。

### 在本地计算机上安装 Python 3.8 或更高版本
<a name="ol-upper-prerequisites-python"></a>

使用以下过程在本地计算机上安装 Python 3.8 或更高版本。有关安装说明的更多信息，请参阅 *《Python 初学者指南》*中的[下载 Python](https://wiki.python.org/moin/BeginnersGuide/Download) 页面。

1. 打开本地终端或 shell 并运行以下命令以确定是否已安装 Python，如果已安装，确定已安装的版本。

   ```
   python --version
   ```

1. 如果没有 Python 3.8 或更高版本，则下载适合您的本地计算机的[官方安装](https://www.python.org/downloads/)。

1. 双击下载的文件运行安装程序，然后按照步骤完成安装。

   对于 **Windows 用户**，在安装向导中选择**将 Python 3.X 添加到 PATH**，然后选择**立即安装**。

1. 通过关闭并重新打开终端来重新启动它。

1. 运行以下命令以验证是否正确安装了 Python 3.8或更高版本。

   对于** macOS 用户**，运行以下命令：

   ```
   python3 --version
   ```

   对于 **Windows 用户**，运行此命令：

   ```
   python --version
   ```

1. 运行以下命令验证是否安装了 pip3 包管理器。如果您在命令响应中看到 pip 版本号和 python 3.8 或更高版本，则意味着 pi3 软件包管理器已成功安装。

   ```
   pip --version
   ```

## 步骤 1：创建 S3 存储桶
<a name="ol-upper-step1"></a>

创建存储桶来存储您计划转换的原始数据。

**注意**  
可以为其它数据来源附加接入点，例如适用于 OpenZFS 的 Amazon FSx 卷，但本教程使用附加到 S3 存储桶的支持接入点。

**创建存储桶**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 选择**创建存储桶**。

   此时将打开**创建存储桶**页面。

1. 对于**存储桶名称**，输入您的存储桶名称（例如，**tutorial-bucket**）。

   有关 Amazon S3 存储桶命名的更多信息，请参阅 [通用存储桶命名规则](bucketnamingrules.md)。

1. 对于**区域**，选择要放置存储桶的 AWS 区域。

   有关存储桶区域的更多信息，请参阅 [通用存储桶概述](UsingBucket.md)。

1. 对于**此存储桶的屏蔽公共访问权限设置**，保留默认值（**屏蔽*所有*公共访问权限**已启用）。

   除非您需要为您的用例关闭一个或多个屏蔽公共访问权限设置，否则建议您将所有这些设置保持为启用状态。有关屏蔽公共访问权限的更多信息，请参阅 [阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)。

1. 对于其余设置，保留默认值。

   （可选）如果要为您的特定用例配置其他存储桶设置，请参阅 [创建通用存储桶](create-bucket-overview.md)。

1. 选择**创建存储桶**。

## 步骤 2：将文件上传到 S3 存储桶。
<a name="ol-upper-step2"></a>

将文本文件上传到 S3 存储桶。此文本文件包含本教程稍后将转换为大写的原始数据。

例如，您可以上传包含以下文本的 `tutorial.txt`文件：

```
Amazon S3 Object Lambda Tutorial:
You can add your own code to process data retrieved from S3 before 
returning it to an application.
```

**要上传文件到存储桶**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您在[步骤 1](#ol-upper-step1)中创建的存储桶名称（例如，**tutorial-bucket**）上传您的文件。

1. 在存储桶的**对象** 选项卡上，选择**上传**。

1. 在**上传**页面的**文件和文件夹**下，选择**添加文件**。

1. 选择要上传的文件，然后选择**打开**。例如，您可以上传之前提到的 `tutorial.txt` 文件示例。

1. 选择**上传**。

## 步骤 3：创建 S3 接入点
<a name="ol-upper-step3"></a>

要使用 S3 对象 Lambda 接入点访问和转换原始数据，您必须创建一个 S3 接入点，并将其与您在[步骤 1](#ol-upper-step1) 中创建的 S3 存储桶关联。接入点必须与要变换的对象位于同一 AWS 区域 位置。

在本教程的后面部分，您将使用此接入点作为对象 Lambda 接入点的支持接入点。

**创建接入点**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**接入点**。

1. 在**接入点**页面上，选择**创建接入点**。

1. 在**接入点名称**字段中输入接入点名称（例如，**tutorial-access-point**）。

   有关命名接入点的更多信息，请参阅[接入点的命名规则](access-points-restrictions-limitations-naming-rules.md#access-points-names)。

1. 在**数据来源**字段中，输入您在[步骤 1](#ol-upper-step1) 中创建的存储桶的名称（例如 **tutorial-bucket**）。S3 将接入点附加到存储桶。

   您也可以选择**浏览 S3** 浏览和搜索账户中的存储桶。如果选择**浏览 S3**，请选择所需的存储桶，然后选择**选择路径**使用该存储桶的名称填充**存储桶名称**字段。

1. 适用于**网络源**中，选择**互联网**。

   有关接入点的网络源的更多信息，请参阅[创建限制到 Virtual Private Cloud 的接入点](access-points-vpc.md)。

1. 默认情况下，为您的接入点启用所有屏蔽公共访问权限设置。我们建议您将**屏蔽*所有* 公共访问权限**保留为启用状态。

   有关更多信息，请参阅 [管理对通用存储桶的接入点的公共访问权限](access-points-bpa-settings.md)。

1. 对于所有其他接入点设置，保留默认设置。

   （可选）您可以修改接入点设置以支持您的用例。在本教程中，我们建议您保留默认设置。

   （可选）如果需要管理对接入点的访问，可以指定接入点策略。有关更多信息，请参阅 [接入点的策略示例](access-points-policies.md#access-points-policy-examples)。

1. 选择 **Create access point（创建接入点）**。

## 步骤 4：创建 Lambda 函数
<a name="ol-upper-step4"></a>

要转换原始数据，请创建 Lambda 函数以与 S3 对象 Lambda 接入点结合使用。

**Topics**
+ [编写 Lambda 函数代码并使用虚拟环境创建部署包](#ol-upper-step4-write-lambda)
+ [使用执行角色创建 Lambda 函数（控制台）](#ol-upper-step4-create-function)
+ [用 .zip 文件归档部署 Lambda 函数代码，并配置 Lambda 函数（控制台）](#ol-upper-step4-deploy-function)

### 编写 Lambda 函数代码并使用虚拟环境创建部署包
<a name="ol-upper-step4-write-lambda"></a>

1. 在本地计算机上，使用文件夹名称 `object-lambda` 创建一个文件夹，供本教程稍后使用。

1. 在 `object-lambda` 文件夹中，使用 Lambda 函数创建一个文件，该函数将原始对象中的所有文本更改为大写。例如，您可以使用 Python 编写的以下函数。将此函数保存在名为的文件 `transform.py` 中。

   ```
   import boto3
   import requests
   from botocore.config import Config
   
   # This function capitalizes all text in the original object
   def lambda_handler(event, context):
       object_context = event["getObjectContext"]
       # Get the presigned URL to fetch the requested original object 
       # from S3
       s3_url = object_context["inputS3Url"]
       # Extract the route and request token from the input context
       request_route = object_context["outputRoute"]
       request_token = object_context["outputToken"]
       
       # Get the original S3 object using the presigned URL
       response = requests.get(s3_url)
       original_object = response.content.decode("utf-8")
   
       # Transform all text in the original object to uppercase
       # You can replace it with your custom code based on your use case
       transformed_object = original_object.upper()
   
       # Write object back to S3 Object Lambda
       s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
       # The WriteGetObjectResponse API sends the transformed data
       # back to S3 Object Lambda and then to the user
       s3.write_get_object_response(
           Body=transformed_object,
           RequestRoute=request_route,
           RequestToken=request_token)
   
       # Exit the Lambda function: return the status code  
       return {'status_code': 200}
   ```
**注意**  
前面的示例 Lambda 函数将整个请求的对象加载到内存中，然后再将其转换为客户端。您还可以从 S3 流式传输对象，避免将整个对象加载到内存中。这种方法在处理大型对象时非常有用。有关使用对象 Lambda 接入点流式处理响应的详细信息，请参阅[在 Lambda 中处理 `GetObject` 请求](olap-writing-lambda.md#olap-getobject-response)中的流式处理示例。

   编写 Lambda 函数以用于 S3 对象 Lambda 接入点时，该函数基于 S3 对象 Lambda 提供给 Lambda 函数的输入事件上下文。事件上下文提供有关在从 S3 对象 Lambda 传递到 Lambda 的事件中发出请求的信息。它包含用于创建 Lambda 函数的参数。

   用于创建前面的 Lambda 函数的字段如下所示：

   字段 `getObjectContext` 表示与 Amazon S3 和 S3 对象 Lambda连接的输入和输出详细信息。它具有以下字段：
   + `inputS3Url` - Lambda 函数可用于从支持接入点下载原始对象的预签名 URL。通过使用预签名 URL，Lambda 函数无需具有 Amazon S3 读取权限即可检索原始对象，只能访问每次调用处理的对象。
   + `outputRoute` - 当 Lambda 函数调用 `WriteGetObjectResponse` 以发回转换后的对象时，添加到 S3 对象 Lambda URL 的路由令牌。
   + `outputToken` - S3 对象 Lambda 在发送回转换对象时用于将 `WriteGetObjectResponse` 调用与原始调用方匹配的令牌。

   有关事件上下文中所有字段的更多信息，请参阅 [事件上下文格式和用法](olap-event-context.md) 和 [为 S3 对象 Lambda 接入点编写 Lambda 函数](olap-writing-lambda.md)。

1. 在您的本地终端上，输入以下命令来安装 `virtualenv` 包：

   ```
   python -m pip install virtualenv
   ```

1. 在您的本地终端中，打开之前创建的 `object-lambda` 文件夹，然后输入以下命令创建并初始化名为的虚拟环境 `venv`。

   ```
   python -m virtualenv venv
   ```

1. 要激活虚拟环境，请输入以下命令，以执行环境的文件夹中的 `activate` 文件：

   对于** macOS 用户**，运行以下命令：

   ```
   source venv/bin/activate
   ```

   对于** Windows 用户**， 运行此命令：

   ```
   .\venv\Scripts\activate
   ```

   现在，命令提示符更改为显示 **(venv)**，表示虚拟环境处于活动状态。

1. 要安装所需的库，请在 `venv` 虚拟环境中运行下列命令行。

   这些命令会安装您 `lambda_handler` Lambda 函数依赖关系的更新版本。这些依赖关系是 AWS SDK for Python (Boto3) 和请求模块。

   ```
   pip3 install boto3
   ```

   ```
   pip3 install requests
   ```

1. 要停用虚拟环境，运行以下命令：

   ```
   deactivate
   ```

1. 要在 `object-lambda` 目录的根目录下，将已安装的库作为 `.zip` 文件（文件名为 `lambda.zip`）来创建部署程序包，请在本地终端中逐行运行以下命令。
**提示**  
可能需要调整以下命令才能在您的特定环境中工作。例如，库可能出现在 `site-packages` 或 `dist-packages` 中，第一个文件夹可能是 `lib` 或者 `lib64`。另外，`python` 文件夹可能会使用不同的 Python 版本命名。您可以使用 `pip show` 命令定位特定包。

   适用于** macOS 用户**，运行以下命令：

   ```
   cd venv/lib/python3.8/site-packages 
   ```

   ```
   zip -r ../../../../lambda.zip .
   ```

   对于 **Windows 用户**，运行以下命令：

   ```
   cd .\venv\Lib\site-packages\ 
   ```

   ```
   powershell Compress-Archive * ../../../lambda.zip
   ```

   最后一个命令将部署程序包保存到 `object-lambda` 目录的根目录中。

1. 将函数代码文件 `transform.py` 添加到部署程序包的根目录中。

   适用于** macOS 用户**，运行以下命令：

   ```
   cd ../../../../ 
   ```

   ```
   zip -g lambda.zip transform.py
   ```

   对于 **Windows 用户**，运行以下命令：

   ```
   cd ..\..\..\
   ```

   ```
   powershell Compress-Archive -update transform.py lambda.zip
   ```

   完成此步骤后，文件目录结构应如下：

   ```
   lambda.zip$
     │ transform.py
     │ __pycache__
     | boto3/
     │ certifi/
     │ pip/
     │ requests/
     ...
   ```

### 使用执行角色创建 Lambda 函数（控制台）
<a name="ol-upper-step4-create-function"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

   

1. 在左侧导航窗格中，选择**函数**。

1. 选择 **Create function (创建函数)**。

1. 选择**从头开始创作**。

1. 在**基本信息**中，执行以下操作：

   1. 对于 **Function name（函数名称）**，请输入 **tutorial-object-lambda-function**。

   1. 适用于**运行时间**中，选择** Python 3.8 **或更高版本。

1. 展开**更改默认执行角色**部分。在**执行角色**中，选择**创建具有基本 Lambda 权限的新角色**。

   在[步骤 5 ](#ol-upper-step5)中，在本教程的后面，您将** AmazonS3ObjectLambdaExecutionRolePolicy **附加到 Lambda 函数的执行角色上。

1. 对于其余设置，保留默认值。

1. 选择 **Create function（创建函数）**。

### 用 .zip 文件归档部署 Lambda 函数代码，并配置 Lambda 函数（控制台）
<a name="ol-upper-step4-deploy-function"></a>

1. 在 AWS Lambda 控制台位于[ https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 中，选择左侧导航窗格中的 **Functions**（函数）。

1. 选择您之前创建的 Lambda 函数（例如 **tutorial-object-lambda-function**）。

1. 在 Lambda 函数的详细信息页面上，选择**代码**选项卡。在**代码源**部分，选择**上传**，然后选择 **.zip 文件**。

1. 选择**上传**以选择本地 `.zip` 文件。

1. 选择您之前创建的 `lambda.zip` 文件，然后选择**打开**。

1. 选择**保存**。

1. 在**运行时间设置**部分，选择**编辑**。

1. 在存储库的**编辑运行时设置**页面上，确认**运行时**设置为** Python 3.8 **或更高版本。

1. 要告诉 Lambda 运行时要调用 Lambda 函数代码中的哪个处理程序方法，请输入 **transform.lambda\$1handler** 的**处理程序**。

   当您在 Python 中配置函数时，处理程序设置的值是文件名，也是处理程序模块的名称（由点分隔）。例如，`transform.lambda_handler` 调用在 `transform.py` 文件中定义的 `lambda_handler` 方法。

1. 选择**保存**。

1. （可选）在 Lambda 函数的详细信息页面上，选择**配置**选项卡。在左侧导航窗格中，选择**常规配置**，然后选择**编辑**。在**超时**字段中，输入 **1** 分钟 **0** 秒。对于其余设置，保留默认值，然后选择**保存**。

   **超时** –是 Lambda 允许函数在停止调用之前为调用运行的时长。默认值为 3 秒。S3 对象 Lambda 使用的 Lambda 函数的最大持续时间为 60 秒。定价基于配置的内存量和代码运行的时间量。

## 步骤 5：为 Lambda 函数的执行角色配置 IAM 策略
<a name="ol-upper-step5"></a>

要使 Lambda 函数能够提供自定义的数据和响应标头 `GetObject` 调用者，Lambda 函数的执行角色必须具有 IAM 权限才能调用 `WriteGetObjectResponse` API。

**将 IAM 策略附加到 Lambda 函数角色**



1. 在 AWS Lambda 控制台位于 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 中，选择左侧导航窗格中的 **Functions**（函数）。

1. 选择您在[步骤 4](#ol-upper-step4) 中创建的函数（例如，**tutorial-object-lambda-function**）。

1. 在 Lambda 函数的详细信息页面上，选择**配置**选项卡，然后选择**Permissions（权限）**在左侧导航窗格中。

1. Unts**执行角色**中，选择 **Role name（角色名称）**。打开 IAM 控制台。

1. 在 IAM 控制台上对应于 Lambda 函数的执行角色的 **Summary**（摘要）页面上，选择 **Permissions**（权限）选项卡。然后，从 **Add Permissions**（添加权限）菜单中选择 **Attach policies**（附加策略）。

1. **在附加权限策略**页的搜索字段中输入 **AmazonS3ObjectLambdaExecutionRolePolicy** 策略的名称。选中 **AmazonS3ObjectLambdaExecutionRolePolicy** 政策名称旁边的复选框。

1. 选择**附加策略**。

## 步骤 6：创建 S3 对象 Lambda 接入点
<a name="ol-upper-step6"></a>

S3 对象 Lambda 接入点提供了直接从 S3 GET 请求调用 Lambda 函数的灵活性，以便该函数可以处理从 S3 接入点检索的数据。创建和配置 S3 对象 Lambda 接入点时，必须指定 Lambda 函数以调用并提供 JSON 格式的事件上下文作为 Lambda 要使用的自定义参数。

**创建 S3 对象 Lambda 接入点**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择 **Object Lambda 接入点**。

1. 在**对象 Lambda 接入点**页面上，选择**创建对象 Lambda 接入点**。

1. 对于**对象 Lambda 接入点名称**，输入想要用于对象 Lambda 接入点的名称（例如 **tutorial-object-lambda-accesspoint**）。

1. 适用于**支持接入点**中，输入或浏览到您在[步骤 3](#ol-upper-step3)（例如，**tutorial-access-point**），然后选择**选择支持的接入点**。

1. 对于 **S3 APIs**（S3 API），要从 S3 存储桶中检索对象以便 Lambda 函数进行处理，请选择 **GetObject**。

1. 对于**调用 Lambda 函数**，您可以为本教程选择以下两个选项之一。
   + 选择**从您的账户中的函数中选择**，然后在 **Lambda 函数**下拉列表中，选择您在[步骤 4](#ol-upper-step4) 中创建的 Lambda 函数（例如 **tutorial-object-lambda-function**）。
   + 选择**输入 ARN**，然后输入您在[步骤 4](#ol-upper-step4) 中创建的 Lambda 函数的 Amazon 资源名称（ARN）。

1. 适用于**Lambda 函数版本**，选择**\$1LATEST**（您在[步骤 4](#ol-upper-step4)中创建的最新版 Lambda 函数)。

1. （可选）如果您需要 Lambda 函数识别和处理带有范围和分段编号标头的 GET 请求，请选择 **Lambda 函数支持使用范围的请求**和 **Lambda 函数支持使用零件编号的请求**。否则，请清除这两个复选框。

   有关如何将范围或分段编号与 S3 对象 Lambda 结合使用的更多信息，请参阅 [使用 Range 和 partNumber 标头](range-get-olap.md)。

1. （可选）在 **Payload（负载）- *可选***下，添加 JSON 文本，向 Lambda 函数提供其他信息。

   负载是可选 JSON 文本，您可以将其作为来自特定 S3 对象 Lambda 接入点的所有调用的输入提供给 Lambda 函数。要自定义调用同一 Lambda 函数的多个对象 Lambda 接入点的行为，您可以使用不同的参数配置负载，从而扩展 Lambda 函数的灵活性。

   更多有关路径模式的信息，请参阅 [事件上下文格式和用法](olap-event-context.md)。

1. （可选）对于**请求指标 – *可选***，选择**禁用**或**启用**，以便将 Amazon S3 监控添加到对象 Lambda 接入点。请求指标按标准 Amazon CloudWatch 费率计费。有关更多信息，请参阅 [CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

1. 在**对象 Lambda 接入点策略 - *可选***下，保留默认设置。

   （可选）您可以设置资源策略。此资源策略授予 `GetObject` API 权限，以便使用指定的对象 Lambda 接入点。

1. 对于其余设置，保留默认值，然后选择**创建对象 Lambda 接入点**。

## 步骤 7：查看转换的数据
<a name="ol-upper-step7"></a>

现在，S3 对象 Lambda 已准备好为您的使用案例转换您的数据。在本教程中，S3 对象 Lambda 将对象中的所有文本转换为大写。

**Topics**
+ [在 S3 对象 Lambda 接入点中查看转换后的数据](#ol-upper-step7-check-data)
+ [运行 Python 脚本以打印原始数据和转换数据](#ol-upper-step7-python-print)

### 在 S3 对象 Lambda 接入点中查看转换后的数据
<a name="ol-upper-step7-check-data"></a>

当您请求通过 S3 对象 Lambda 接入点检索文件时，您需要对 S3 对象 Lambda 进行 `GetObject` API 调用。S3 对象 Lambda 调用 Lambda 函数来转换您的数据，然后返回转换后的数据作为对标准 S3 的响应 `GetObject` API 调用。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**对象 Lambda 接入点**。

1. 在**对象 Lambda 接入点**页面上，选择您在[步骤 6](#ol-upper-step6) 中创建的 S3 对象 Lambda 接入点（例如，**tutorial-object-lambda-accesspoint**)。

1. 在 S3 对象 Lambda 接入点的**对象**选项卡中，选择具有相同名称的文件（例如 `tutorial.txt`）作为您在[步骤 2](#ol-upper-step2) 中上传到 S3 存储桶的文件。

   此文件应包含所有转换的数据。

1. 要查看转换后的数据，请选择**打开**或者**下载**。

### 运行 Python 脚本以打印原始数据和转换数据
<a name="ol-upper-step7-python-print"></a>

您可以将 S3 对象 Lambda 与现有应用程序结合使用。为此，请更新应用程序配置，以使用在[步骤 6](#ol-upper-step6) 中创建的新 S3 对象 Lambda 接入点 ARN 从 S3 检索数据。

以下示例 Python 脚本既打印来自 S3 存储桶的原始数据，也打印来自 S3 对象 Lambda 接入点的转换数据。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**对象 Lambda 接入点**。

1. 在**对象 Lambda 接入点**页面上，选择在[步骤 6](#ol-upper-step6) 中创建的 S3 对象 Lambda 接入点左侧的单选按钮（例如，**tutorial-object-lambda-accesspoint**)。

1. 选择**复制 ARN**。

1. 保存 ARN 以供稍后使用。

1. 在本地计算机上编写 Python 脚本，以从 S3 存储桶中打印原始数据（例如，`tutorial.txt`）并从 S3 对象 Lambda 接入点中打印转换后的数据（例如 `tutorial.txt`）。您可以使用以下示例脚本。

   ```
   import boto3
   from botocore.config import Config
   
   s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
   
   def getObject(bucket, key):
       objectBody = s3.get_object(Bucket = bucket, Key = key)
       print(objectBody["Body"].read().decode("utf-8"))
       print("\n")
   
   print('Original object from the S3 bucket:')
   # Replace the two input parameters of getObject() below with 
   # the S3 bucket name that you created in Step 1 and 
   # the name of the file that you uploaded to the S3 bucket in Step 2
   getObject("tutorial-bucket", 
             "tutorial.txt")
   
   print('Object transformed by S3 Object Lambda:')
   # Replace the two input parameters of getObject() below with 
   # the ARN of your S3 Object Lambda Access Point that you saved earlier and
   # the name of the file with the transformed data (which in this case is
   # the same as the name of the file that you uploaded to the S3 bucket 
   # in Step 2)
   getObject("arn:aws:s3-object-lambda:us-west-2:111122223333:accesspoint/tutorial-object-lambda-accesspoint",
             "tutorial.txt")
   ```

1. 使用自定义名称将 Python 脚本（例如，`tutorial_print.py`）保存您在[步骤 4](#ol-upper-step4)中本地计算机上中创建的文件夹中（例如，`object-lambda`）。

1. 在您的本地终端上，在[步骤 4](#ol-upper-step4)中创建的根目录下运行以下命令（例如，`object-lambda`）。

   ```
   python3 tutorial_print.py
   ```

   您应该通过终端同时看到原始数据和转换后的数据（所有文本均为大写）。如，您应看到类似于以下的文本。

   ```
   Original object from the S3 bucket:
   Amazon S3 Object Lambda Tutorial:
   You can add your own code to process data retrieved from S3 before 
   returning it to an application.
   
   Object transformed by S3 Object Lambda:
   AMAZON S3 OBJECT LAMBDA TUTORIAL:
   YOU CAN ADD YOUR OWN CODE TO PROCESS DATA RETRIEVED FROM S3 BEFORE 
   RETURNING IT TO AN APPLICATION.
   ```

## 步骤 8：清除
<a name="ol-upper-step8"></a>

如果您仅出于练习目的通过 S3 对象 Lambda 创建静态网站，则删除您所分配的 AWS 资源，使其不再产生费用。

**Topics**
+ [删除对象 Lambda 接入点](#ol-upper-step8-delete-olap)
+ [删除 S3 接入点](#ol-upper-step8-delete-ap)
+ [删除您的 Lambda 函数的执行角色。](#ol-upper-step8-delete-lambda-role)
+ [删除 Lambda 函数](#ol-upper-step8-delete-lambda-function)
+ [删除 CloudWatch 日志组](#ol-upper-step8-delete-cloudwatch)
+ [删除 S3 源存储桶中的原始文件](#ol-upper-step8-delete-file)
+ [删除 S3 源存储桶](#ol-upper-step8-delete-bucket)
+ [删除 IAM 用户](#ol-upper-step8-delete-user)

### 删除对象 Lambda 接入点
<a name="ol-upper-step8-delete-olap"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**对象 Lambda 接入点**。

1. 在**对象 Lambda 接入点**页面上，选择在[步骤 6](#ol-upper-step6) 中创建的 S3 对象 Lambda 接入点左侧的单选按钮（例如，**tutorial-object-lambda-accesspoint**)。

1. 选择**删除**。

1. 通过在显示的文本字段中输入对象 Lambda 接入点的名称，确认要删除的对象 Lambda 接入点，然后选择**删除**。

### 删除 S3 接入点
<a name="ol-upper-step8-delete-ap"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**接入点**。

1. 导航到您在[步骤 3](#ol-upper-step3)创建的接入点（例如，**tutorial-access-point**），然后选择接入点名称旁的单选按钮。

1. 选择**删除**。

1. 在显示的文本字段中输入接入点名称，然后选择**删除**，确认您要删除接入点。

### 删除您的 Lambda 函数的执行角色。
<a name="ol-upper-step8-delete-lambda-role"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 在左侧导航窗格中，选择**函数**。

1. 选择您在[步骤 4](#ol-upper-step4) 中创建的函数（例如，**tutorial-object-lambda-function**）。

1. 在 Lambda 函数的详细信息页面上，选择**配置**选项卡，然后选择**Permissions（权限）**在左侧导航窗格中。

1. Unts**执行角色**中，选择 **Role name（角色名称）**。打开 IAM 控制台。

1. 在 Lambda 函数的执行角色 IAM 控制台的**摘要**页面上，选择**删除角色**。

1. 在 **Delete role**（删除角色）对话框中，选择 **Yes, delete**（是的，删除）。

### 删除 Lambda 函数
<a name="ol-upper-step8-delete-lambda-function"></a>

1. 在 AWS Lambda 控制台（位于 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)）中，选择左侧导航窗格中的 **Functions**（函数）。

1. 选择您在[步骤4](#ol-upper-step4)中创建的函数名称左侧的复选框（例如，**tutorial-object-lambda-function**）。

1. 选择**操作**，然后选择**删除**。

1. 在**删除函数**对话框中，选择**删除**。

### 删除 CloudWatch 日志组
<a name="ol-upper-step8-delete-cloudwatch"></a>

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在左侧导航窗格中，选择**日志组**。

1. 查找名称以[步骤4](#ol-upper-step4)中创建的 Lambda 函数结尾的日志组（例如，**tutorial-object-lambda-function**）。

1. 选择日志组名称左侧的复选框。

1. 选择**操作**，然后选择**删除日志组**。

1. 在**删除日志组**对话框中，选择**删除**。

### 删除 S3 源存储桶中的原始文件
<a name="ol-upper-step8-delete-file"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶名称**列表中，选择您在[步骤 2](#ol-upper-step2)中将原始文件上传到的存储桶名称（例如，**tutorial-bucket**)。

1. 选中要删除的对象名称左侧的复选框（例如，`tutorial.txt`）。

1. 选择**删除**。

1. 在**永久删除对象？**的**删除对象**页面上，在文本框中输入 **permanently delete** 确认您希望删除此对象。

1. 选择**删除对象**。

### 删除 S3 源存储桶
<a name="ol-upper-step8-delete-bucket"></a>

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在**存储桶**列表中，选择您在[步骤 1](#ol-upper-step1)中创建的存储桶名称旁的单选按钮（例如，**tutorial-bucket**)。

1. 选择**删除**。

1. 在**删除存储桶**页面上，通过在文本字段中输入存储桶名称来确认要删除存储桶，然后选择**删除存储桶**。

### 删除 IAM 用户
<a name="ol-upper-step8-delete-user"></a>

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在左侧导航窗格中，选择**用户**，然后选中要删除的用户旁的复选框。

1. 在页面的顶部，选择**删除**。

1. 在**删除*用户名*?**对话框中，在文本输入字段中输入用户名以确认删除用户。选择**删除**。

## 后续步骤
<a name="ol-upper-next-steps"></a>

完成本教程后，您可以为您的用例自定义 Lambda 函数，以便修改标准 S3 GET 请求返回的数据。

以下是 S3 对象 Lambda 的常见用例列表：
+ 屏蔽敏感数据以确保安全性和合规性。

  有关更多信息，请参阅 [教程：使用 S3 对象 Lambda 和 Amazon Comprehend 检测和修订 PII 数据](tutorial-s3-object-lambda-redact-pii.md)。
+ 筛选某些数据行以提供特定信息。
+ 使用来自其他服务或数据库的信息增加数据。
+ 跨数据格式转换，例如将 XML 转换为 JSON 以实现应用程序兼容性。
+ 在下载文件时压缩或解压缩文件。
+ 调整图像大小和水印图像。

  有关更多信息，请参阅[教程：使用 S3 对象 Lambda 在检索图像时对其动态加水印](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/tutorial-s3-object-lambda-uppercase.html)。
+ 实施自定义授权规则以访问数据。

有关 S3 对象 Lambda 的更多信息，请参阅 [使用 S3 对象 Lambda 转换对象](transforming-objects.md)。