使用 Amazon CloudFormation 模板以自动化 S3 对象 Lambda 设置
您可以使用 Amazon CloudFormation 模板以快速创建对象 Lambda 访问点。Amazon CloudFormation 模板会自动创建相关资源、配置 IAM 角色并设置 Lambda 函数,该函数可通过对象 Lambda 访问点自动处理请求。使用 Amazon CloudFormation 模板,您可以实施最佳实践、改善安全状况并减少手动流程导致的错误。
该 GitHub repository
模板中提供的 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(流式压缩内容示例)。