亚马逊AWS官方博客

使用Lambda函数URL + CloudFront实现S3镜像回源

1. 背景说明

亚马逊云科技S3是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。各种规模和行业的客户都可以在S3存储和保护任意量的数据。为提高数据安全性,很多客户会选择将现有数据迁移至S3。在迁移存储于第三方的数据至S3时,某些时候需要以“镜像回源”的方式完成以减少业务中断时间。“镜像回源”通常是指从S3获取的文件不存在时,需要从第三方源获取该文件并存放至S3。由于S3本身不提供“镜像回源”的功能,因此需要考虑自行实现。

一般情况下存储在S3的文件会通过CloudFront供外部使用,而CloudFront源组支持故障转移功能。一个可行的方案是借助CloudFront源组故障转移时利用备用源从第三方同步文件并保存至S3再返回给客户端。在Lambda函数URL发布之前,通常需要在EC2部署一个简单的应用来作为备用源。这需要对“镜像回源”数据量有准确的估算否则会造成回源异常或者EC2资源浪费,借助Lambda则可以有效降避免这些问题。Lambda函数URL是Lambda在4月份新发布的一个特性,允许直接通过函数的URL断点调用Lambda函数。借用此特性,可以在不使用API Gateway或者ALB的情况下使用Lambda完成一些类似webhook、表单校验之类的简单功能,并且不会产生额外的Lambda费用。后文将介绍如何通过Lambda函数URL+CloudFront来实现“镜像回源”这一功能。方案的总体架构图如下。

其工作原理说明如下:

1)终端设备向CloudFront请求文件

2)CloudFront向S3(主源站)请求文件

3)文件不存在则返回403至CloudFront

4)CloudFront根据源站组配置尝试请求Lambda函数URL(备用源站)

5)Lambda从第三方源获取文件

6)Lambda将文件保存至S3桶

7)Lambda返回302至CloudFront,附带地址为原始文件从而使客户端重新请求该文件

8)CloudFront再次向S3(主源站)请求文件

9)S3返回文件至CloudFront,CloudFront边缘节点根据缓存策略配置缓存文件

10)CloudFront返回文件至终端设备

2. 配置指引

本方案总体配置流程为:

  1. 创建S3桶
  2. 创建并配置Lambda函数
  3. 创建并配置CloudFront分发

S3桶创建较为简单,本文略过,Lambda函数、CloudFront分发配置说明如下文。

2.1 Lambda函数配置

1)进入Lambda控制台,点击“创建函数”开始创建Lambda函数

2)按截图所示设置Lambda函数名、运行环境

3)展开“高级设置”,选择启用函数URL,为了方便演示将授权类型设置为“NONE”,实际生产环境可根据需要配置

4)函数代码可从如下地址复制。注意,链接中的示例代码使用了Python Requests库,因此需要为Lambda添加层以包含该库,操作方式如下图

https://github.com/ensean/lambda_sync_from_3rd_origin/blob/master/lambda_hanlder.py

5)添加层时层类型为“指定ARN”,同时指定ARN值。ARN可从如下链接根据区域、Python库类型查询

https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9

6)进入Lambda函数配置界面,编辑常规配置。例如根据需要同步的文件大小调整超时时限

7)选择左侧权限菜单,点击执行角色,为角色配置S3桶访问权限

8)进入角色权限配置页面,点击“添加权限” → “附加策略”

9)为方便演示在弹出的策略中根据搜索选择“AmazonS3FullAccess”策略,后续生产环境可根据需要调整

10)选择环境变量菜单,如图所示添加环境变量external_endpoint, s3_bucket, service_endpoint

10)选择函数URL菜单,复制函数URL备用

2.2 CloudFront配置

1)创建CloudFront分发,源域选择S3桶,并配置CloudFront通过OAI访问S3桶。其他保持默认配置,创建CloudFront分发

2)进入CloudFront分发配置,切换至“源”标签页,点击“创建源”

3)在源域配置界面填入Lambda函数URL域名,其余保持默认配置,点击创建源

4)点击“创建源组”

5)根据提示选择S3源为主,Lambda函数URL源为备,故障转移条件选择403、404

6)在CloudFront控制台选择左侧“策略”菜单,在“缓存”标签页点击“创建缓存策略”

7)在缓存策略配置界面录入缓存策略名,同时调整最短TTL至0,其余TTL值可保持默认,然后创建缓存策略

8)进入CloudFront分发“行为”标签页,选择默认行为并编辑

9)在行为编辑界面设置“源和源组”为步骤5)创建的源组,同时调整缓存策略为步骤7)创建的缓存策略,然后保存更改

10)通过CloudFront访问类似如下文件,观察浏览器控制台网络请求情况。若出现类似下图结果,且文件正常保存至S3桶“file/2022/03/18/ea27cb786ffb474682a8feb5.jpg”则说明镜像回源配置成功 https://d281txxxxxxxx.cloudfront.net/file/2022/03/18/ea27cb786ffb474682a8feb5.jpg

3. 总结

Lambda函数URL作为新发布的功能,允许用户直接通过互联网访问Lambda,而且本功能没有额外的计费。本文提供示例借助CloudFront源组的故障转移功能和Lambda函数URL可快速实现S3“镜像回源”功能。读者还可以根据自身业务需要通过Lambda函数URL来实现一些轻量级的微服务应用。

4. 参考资料

  1. https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html
  2. https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/
  3. https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html

本篇作者

李寅祥

AWS 解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,在国内推广AWS云平台技术和各种解决方案。曾就职于IBM,负责企业私有云方案咨询和架构设计,在基础架构方面有丰富经验。