在将数据存储在Amazon Simple Storage Service(S3)中时,您可以方便地共享这些数据以供多个应用程序使用。
Amazon Simple Storage Service(S3)
https://aws.amazon.com/cn/s3/
但是,每个应用程序的要求不同,可能需要不同的数据视图。例如,电子商务应用程序创建的数据集可能包含个人身份信息(PII),而在处理这个数据集进行分析时无需这些个人信息,并且应编辑这些个人信息。另一方面,如果同一数据集用于营销活动,则可能需要其他详细信息(例如来自客户忠诚度数据库的信息)来丰富数据。
为了向多个应用程序提供不同的数据视图,目前有两种选择。您可以创建、存储和维护数据的其他衍生副本,以便每个应用程序都有自己的自定义数据集,或者在Amazon S3前以代理层的形式构建基础设施并进行管理,以便在请求时拦截和处理数据。这两种选项都会增加复杂性和成本,因此Amazon S3团队决定构建更好的解决方案。
???? 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~
近期,我非常高兴地宣布推出Amazon S3 Object Lambda新功能,这项功能让您可以添加自己的代码来处理从Amazon S3检索的数据,然后再将其返回到应用程序。Amazon S3 Object Lambda可与现有应用程序配合使用,利用Amazon Lambda函数在从S3检索数据时自动处理和转换数据。Lambda 函数是通过标准Amazon S3 GET请求内联调用的,因此您无需更改应用程序代码。
Amazon Lambda
https://aws.amazon.com/cn/lambda/
Amazon S3 GET请求
https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
通过这种方式,您可以轻松地呈现同一数据集中的多个视图,并且可以更新Lambda函数以便随时修改这些视图。
这种方法可以简化许多用例,例如:
1.编辑个人身份信息用于分析或非生产环境。
2.转换数据格式,例如将XML转换为JSON。
3.使用来自其他服务或数据库的信息增强数据。
4.在下载文件时压缩或解压缩文件。
5.使用发起人特定的详细信息(例如请求对象的用户)动态调整图像大小和水印图像。
6.实施访问数据的自定义授权规则。
您可以通过几个简单的步骤开始使用Amazon S3 Object Lambda:
1.创建一个Lambda函数来转换用例中的数据。
2.从Amazon S3管理控制台创建Amazon S3 Object Lambda接入点。
Amazon S3管理控制台
https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fhome%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&forceMobileApp=0&code_challenge=S3_ZXQ8nbZth3sY6OE2Cjtj6Utzj0sV6YUK6r-77dtw&code_challenge_method=SHA-256
3.选择已在上面创建的Lambda函数。
4.提供一个支持Amazon S3接入点,让Amazon S3 Object Lambda访问原始对象。
Amazon S3接入点
https://aws.amazon.com/cn/s3/features/access-points/
5.更新应用程序配置,使用新的Amazon S3 Object Lambda接入点从S3检索数据。
让我们开始使用这一功能,从而更好地了解Amazon S3 Object Lambda。
如何为Amazon S3 Object Lambda
创建 Lambda 函数
要创建函数,首先查看Lambda 函数从Amazon S3 Object Lambda接收的输入事件的语法:
{
"xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a",
"getObjectContext": {
"inputS3Url": "https://myap-123412341234.s3-accesspoint.us-east-1.amazonaws.com/s3.txt?X-Amz-Security-Token=...",
"outputRoute": "io-iad-cell001",
"outputToken": "..."
},
"configuration": {
"accessPointArn": "arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap",
"supportingAccessPointArn": "arn:aws:s3:us-east-1:123412341234:accesspoint/myap",
"payload": "test"
},
"userRequest": {
"url": "/s3.txt",
"headers": {
"Host": "myolap-123412341234.s3-object-lambda.us-east-1.amazonaws.com",
"Accept-Encoding": "identity",
"X-Amz-Content-SHA256": "e3b0c44297fc1c149afbf4c8995fb92427ae41e4649b934ca495991b7852b855"
}
},
"userIdentity": {
"type": "IAMUser",
"principalId": "...",
"arn": "arn:aws:iam::123412341234:user/myuser",
"accountId": "123412341234",
"accessKeyId": "..."
},
"protocolVersion": "1.00"
}
getObjectContext属性包含一些Lambda函数最有用的信息:
inputS3Url是预签名的URL,函数可将其用于从支持接入点下载原始对象。
这样,Lambda函数不需要拥有Amazon S3读取权限即可检索原始对象,而且只能访问每次调用处理的对象。
预签名的URL
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
outputRoute和outputToken是两个参数,用于使用新WriteGetObjectResponseAPI
来将修改的对象发送回。
新WriteGetObjectResonpe API
https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html
configuration包含Object Lambda接入点和支持接入点的Amazon资源名称(ARN)。
Amazon资源名称(ARN)
https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
userRequest属性提供了关于原始请求的更多信息,例如URL中的路径和HTTP标头。
最后,userIdentity将发出原始请求的发起者的详细信息返回,可用于对数据的访问权限进行自定义设定。
了解了事件的语法后,可以创建Lambda函数了。考虑到简便性,这里有一个用Python编写的函数,它将原始对象中的所有文本更改为大写:
import boto3
import requests
def lambda_handler(event, context):
print(event)
object_get_context = event["getObjectContext"]
request_route = object_get_context["outputRoute"]
request_token = object_get_context["outputToken"]
s3_url = object_get_context["inputS3Url"]
# Get object from S3
response = requests.get(s3_url)
original_object = response.content.decode('utf-8')
# Transform object
transformed_object = original_object.upper()
# Write object back to S3 Object Lambda
s3 = boto3.client('s3')
s3.write_get_object_response(
Body=transformed_object,
RequestRoute=request_route,
RequestToken=request_token)
return {'status_code': 200}
查看函数的代码,主要有三个部分:
首先,使用输入事件的inputS3Url属性来下载原始对象。由于该值是预签名URL,因此函数不需要从Amazon S3读取的权限。
然后,将文本转换为全部大写。如要根据您的使用案例自定义函数的行为,这是您需要更改的部分。例如,要检测和编辑个人身份信息 (PII),可以通过DetectPiiEntitiesAPI来使用Amazon Comprehen到locate PII entities,并用星号或编辑实体类型的描述替换它们。
Amazon Comprehend
https://aws.amazon.com/cn/comprehend/
locate PII entities
https://docs.aws.amazon.com/comprehend/latest/dg/how-pii.html
最后,用新WriteGetObjectResponseAPI将转换结果发送回至Amazon S3 Object Lambda。
通过这种方式,转换后的对象可能远大于 Lambda函数返回的最大响应大小。对于较大的对象,WriteGetObjectResponseAPI可支持分块传输编码来实施流式数据传输。Lambda函数只需要返回状态码(在这种情况下为200 OK)、最终错误,并可选择性地自定义Amazon S3 GetObject API中所述的返回对象的元数据。
新WriteGetObjectRespnse API
https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html
分块传输编码
https://en.wikipedia.org/wiki/Chunked_transfer_encoding
Amazon S3 GetObject API
https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
我打包了函数,包括依赖项,然后将其上传到Lambda。请注意,Amazon S3 Object Lambda使用的Lambda函数的最长持续时间为 60 秒,而且Lambda函数需要Amazon Identity and Access Management(IAM)权限调用WriteGetObjectResponseAPI。
Amazon Identity and Access Management (IAM)
https://aws.amazon.com/cn/iam/
如何从控制台创建
Amazon S3 Object Lambda接入点
在Amazon S3控制台,在其中一个Amazon S3存储桶上创建了Amazon S3接入点:
Amazon S3控制台
https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fs3.console.aws.amazon.com%2Fs3%2Fhome%3Fregion%3Dus-east-1%26state%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fs3&forceMobileApp=0&code_challenge=bofHgrddCmUGqI3u7R3frfSgS8-ddTgZMP2YU2KpqAQ&code_challenge_method=SHA-256
然后,使用刚创建的支持接入点创建Amazon S3 Object Lambda接入点。Lambda函数将使用支持接入点下载原始对象。
在配置Amazon S3 Object Lambda接入点(如下所示)期间,我选择了之前创建的Lambda函数的最新版本。或者,也可以使用字节范围,或者使用零件编号为请求启用支持。现在,我将其禁用。如需了解如何在Amazon S3 Object Lambda中使用字节范围和零件编号,请参阅相关文档。
字节范围
https://docs.aws.amazon.com/whitepapers/latest/s3-optimizing-performance-best-practices/use-byte-range-fetches.html
零件编号
https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html#API_GetObject_RequestSyntax
如何在Amazon S3 Object Lambda中使用字节规范和零件编号相关文档
相关文档
https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-writing-lambda.html#range-get-olap
配置Amazon S3 Object Lambda接入点时,可将字符串设置为来自该接入点的所有调用中传递给Lambda函数的有效载荷,正如之前所述的示例事件配置属性中所示。通过这种方式,可以为多个Amazon S3 Object Lambda接入点配置同一个Lambda函数,然后使用有效载荷值来自定义每个接入点的行为。
最后,我可以设置类似于如何使用标准Amazon S3接入点的策略,为可通过此Object Lambda接入点访问的对象提供访问权限。目前,我将策略保留为空。然后,我保留默认选项阻止所有公共访问并创建Object Lambda接入点。
Amazon S3 Object Lambda接入点已准备就绪,让我们看看如何使用它。
如何使用Amazon S3
Object Lambda接入点
在 Amazon S3 控制台中,选择新创建的Object Lambda接入点。在属性中,复制ARN以便稍后可用。
通过Amazon命令行界面(CLI),将一个包含几个句段的文本文件上传到Amazon S3 Object Lambda接入点后面的S3存储桶:
aws cp s3.txt s3://danilop-data/
命令行界面(CLI)
https://aws.amazon.com/cn/cli/
在现有的应用程序中使用Amazon S3 Object Lambda非常简单。只需要用Amazon S3 Object Lambda接入点的ARN替换S3存储桶,然后更新Amazon开发工具包来使用Amazon S3 Object Lambda ARN接受新语法。
开发工具包
https://aws.amazon.com/cn/tools/
例如,这是一个用于下载刚上传的文本文件的Python脚本:首先,直接从S3存储桶下载,然后从Amazon S3 Object Lambda接入点下载。两次下载的唯一区别是存储桶参数值。
import boto3
s3 = boto3.client('s3')
print('Original object from the S3 bucket:')
original = s3.get_object(
Bucket='danilop-data',
Key='s3.txt')
print(original['Body'].read().decode('utf-8'))
print('Object processed by S3 Object Lambda:')
transformed = s3.get_object(
Bucket='arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap',
Key='s3.txt')
print(transformed['Body'].read().decode('utf-8'))
我在笔记本电脑上启动脚本:
python3 read_original_and_transformed_object.py
这就是我得到的结果:
S3 上的原始对象:
Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,可提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和来自各个行业的客户都可以使用这项服务存储和保护各种使用案例任意数量的数据,例如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、物联网设备和大数据分析等。
S3 Object Lambda 处理的对象:
AMAZON SIMPLE STORAGE SERVICE (AMAZON S3) 是一种对象存储服务,可提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和来自各个行业的客户都可以使用这项服务存储和保护各种使用案例任意数量的数据,例如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、物联网设备和大数据分析等。
第一个输出是直接从源存储桶下载的,我会按预期看到原始内容。第二次,该对象在检索时由Lambda函数处理,因此,所有文本都是大写!
Amazon S3 Object Lambda
的更多使用案例
使用Amazon S3 Object Lambda检索对象时,S3存储桶中不需要存在同名的对象。Lambda函数可以使用文件名称或HTTP标头中的信息来生成自定义对象。
例如,如果您要求将Amazon S3 Object Lambda接入点用于名称为sunset_600x400.jpg的图像,Lambda函数将先查找名为sunset.jpg的图像,然后调整图像的大小以适应文件名中所述的最大宽度和高度。在这种情况下,Lambda函数需要访问权限才能读取原始图像,因为对象密钥与预签名URL中使用的密钥不同。
另一个令人关注的使用案例是检索JSON或CSV文档,例如order.json或items.csv,它们是根据数据库的内容动态生成的。请求HTTP标头中的元数据可用于传递orderId以供使用。通常,我认为客户的创造力将远远超过此处描述的情况。
以下的简短视频描述了Amazon S3 Object Lambda的工作原理以及使用方法:
可用性和定价
Amazon S3 Object Lambda今天在所有亚马逊云科技区域中均可用,但亚太地区(大阪)、Amazon GovCloud(美国东部)、Amazon GovCloud(美国西部)、中国(北京)以及中国(宁夏)地区除外。
您可以将Amazon S3 Object Lambda与亚马逊云科技管理控制台、亚马逊云科技命令行界面(CLI)以及亚马逊云科技开发工具包配合使用。目前,Amazon CLI的高级别Amazon S3命令,例如amazon s3 cp,不支持Amazon S3 Object Lambda接入点的对象,但是您可以使用低级别Amazon S3 API命令,例如 aws s3api get-object
亚马逊云科技管理控制台
https://console.aws.amazon.com
亚马逊云科技命令行界面 (CLI)
https://aws.amazon.com/cn/cli/
亚马逊云科技开发工具包
https://aws.amazon.com/cn/tools/
使用Amazon S3 Object Lambda,您可以为处理数据所需的Amazon Lambda计算和请求费用以及Amazon S3 Object Lambda返回到您的应用程序的数据付费。您还需要为Lambda函数调用的S3请求付费。有关定价的更多信息,请参阅Amazon S3定价页面。
Amazon S3定价页面
https://aws.amazon.com/cn/s3/pricing/
这种新功能让在多个应用程序之间共享和转换数据变得更加容易。
立即开始使用Amazon S3 Object Lambda简化存储架构。
立即开始使用Amazon S3 Object Lambda简化存储架构。
https://aws.amazon.com/cn/s3/features/object-lambda/
本篇作者
Danilo Poccia
Danilo与不同规模的初创公司及大型企业合作,努力提供各类创新支持。在担任亚马逊云科技首席布道师(欧洲、非洲与中东市场)期间,他利用自己的丰富经验帮助客户将创意灵感转化为现实。他主要关注无服务器架构与事件驱动编程,以及机器学习与边缘计算对于技术及业务的重大影响。他的论著《Amazon Lambda in Action》由曼宁出版社出版发行。
听说,点完下面4个按钮
就不会碰到bug了!