使用 Amazon CloudFormation 模板以自动化 S3 对象 Lambda 设置 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Amazon CloudFormation 模板以自动化 S3 对象 Lambda 设置

您可以使用 Amazon CloudFormation 模板以快速创建对象 Lambda 访问点。Amazon CloudFormation 模板会自动创建相关资源、配置 IAM 角色并设置 Lambda 函数,该函数可通过对象 Lambda 访问点自动处理请求。使用 Amazon CloudFormation 模板,您可以实施最佳实践、改善安全状况并减少手动流程导致的错误。

GitHub repository(GitHub 存储库)包含 Amazon CloudFormation 模板和 Amazon Lambda 函数源代码。有关如何使用模板的说明,请参阅 Creating Object Lambda Access Points(创建对象 Lambda 访问点)。

模板中提供的 Lambda 函数不会运行任何转换,会按原样从 Amazon S3 存储桶返回对象。您可以克隆函数并添加自己的转换代码,以便在数据返回到应用程序时修改和处理数据。

修改模板。

创建新的支持访问点

您可以通过将以下参数作为部署模板时创建的 aws cloudformation deploy 命令的一部分来创建一个新的支持访问点。

CreateNewSupportingAccessPoint=true

配置函数有效负载

在部署模板时,可以通过将以下参数作为 aws cloudformation deploy 命令的一部分传递,配置有效负载为 Lambda 函数提供补充数据。

LambdaFunctionPayload="format=csv"

启用 Amazon CloudWatch 监控

您可以在部署模板时通过将以下参数作为 aws cloudformation deploy 命令的一部分来启用 CloudWatch 监视。

EnableCloudWatchMonitoring=true

这将启用 Amazon S3 请求指标的 Object Lambda 访问点,并创建两个 CloudWatch 告警来监控客户端和服务器端错误。

注意

Amazon CloudWatch 的使用将产生额外费用。有关 Amazon S3 请求指标的更多信息,请参阅 Monitoring and logging access points(监控和录入访问点)

配置预配置并发

要优化延迟,您可以通过编辑模板以包含 Resources 下面的以下行来为 Lambda 函数返回对象 Lambda 访问点配置预置的并发。

LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
注意

配置并发将产生额外费用。有关更多信息,请参阅 Amazon Lambda 开发人员指南中的管理 Lambda 预置并发

修改 Lambda 函数

更改标头值

默认情况下,Lambda 函数会将所有标头(Content-Length 和 ETag 除外)从预签名 URL 请求转发到 GetObject 客户端。根据 Lambda 函数中的转换代码,您可以选择向 GetObject 客户端发送新的标头值。

您可以更新 Lambda 函数,以通过在 WriteGetObjectResponse API 中传递来发送新的标头值。

例如,如果 Lambda 函数将 Amazon S3 对象中的文本转换为另一种语言,则可以在 Content-Language 标头中传递一个新值。您可以根据如下所示通过修改 writeResponse 函数来完成。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: 'my-new-language' }).promise(); }

有关受支持标头的完整列表,请参阅 Amazon Simple Storage Service API 参考中的 WriteGetObjectResponse

返回元数据标头

您可以更新 Lambda 函数,以通过在 WriteGetObjectResponse API 将其传递来发送新的标头值。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': 'my-new-value' }, ...headers }).promise(); }

返回新状态码

您可以通过在 WriteGetObjectResponse API 进行传递来将自定义状态代码返回至 GetObject 客户端。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode: Integer }).promise(); }

有关受支持的状态代码的完整列表,请参阅 Amazon Simple Storage Service API 参考中的 WriteGetObjectResponse

将范围和 partNumber 应用于源对象

预设情况下,由 Amazon CloudFormation 模板创建的对象 Lambda 访问点可以处理范围和段编号参数。Lambda 函数将请求的范围或段编号应用于转换后的对象。为此,它需要下载整个对象并运行转换。在某些情况下,转换后的对象范围可能会精确映射到源对象范围。这意味着在源对象上请求字节范围 A-B 并运行转换可能会产生与请求整个对象、运行转换以及在转换后的对象上返回字节范围 A-B 相同的结果。

在这种情况下,您可以更改 Lambda 函数实现,以便将范围或段编号直接应用于源对象。这改善了所需的整体功能延迟和内存。有关更多信息,请参阅 Working with Range and partNumber headers(与 Range 和 partNumber 标头结合使用)。

禁用范围和 partNumber 处理

预设情况下,由 Amazon CloudFormation 模板创建的对象 Lambda 访问点可以处理范围和段编号参数。如果不需要这个,可以通过从模板中移除以下行,以便禁用。

AllowedFeatures: - GetObject-Range - GetObject-PartNumber

转换大型对象

默认情况下,Lambda 函数会处理内存中的整个对象,然后才能开始将响应流式传输到 S3 对象 Lambda。您可以在执行转换时修改函数以流式传输响应。这有助于减少转换延迟和 Lambda 函数内存大小。有关实施示例,请参阅 Stream compressed content example(流式压缩内容示例)。