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

d466c7e6c1959bef6f62c26685a5fbba.gif

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来实现“镜像回源”这一功能。

方案的总体架构图如下。

0da7e22dc83b3e34ecc38fc36e5ab0fc.png

其工作原理说明如下:

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函数

e0d4c4090666b742734ec1e4d21a8717.jpeg

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

62af7f0545362237470893f1018bf959.jpeg

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

4a5607b5a63a78d2b09f2a8a2421bead.png

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

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

b561084f3d1ce928633e31158d47f33d.png

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

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

22bbd7ba91affecdb6ef55c00294039b.jpeg

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

de3c87450c74006d4cab80b7a7b00984.png

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

877743ec7c637641a3946c486e39c8ac.png

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

34fc487c1b59c9ab848f453d36692428.png

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

f4aa06e08ce5dc78634bf1d194ec63a4.jpeg

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

87dd2e3aa50f8d1f26905956643fd226.png

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

f99ac4b08586a776bc8cfdc7d0daa111.png

2.2 CloudFront配置

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

3b3aacd80e7456817fb0813b9c5ef628.jpeg

65b37448f3dda072f3c108d5c9fb78ff.png

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

367ecae6082954d2161a58d9227ac77e.png

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

efa56ff912006bb518b41f52a8ff0afb.jpeg

4)点击“创建源组”

a01cba860667be61651ff98e37c4e3e8.png

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

bb175a3b92cb42af506b8841a60a8486.png

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

ca1ea430a58c5e8bed1006f63fb9bae7.png

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

a765f0bef80c7f135db4a911f13e98c6.png

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

c2330a009c5493a064f6dd920e5315ab.png

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

c535a9ec2a4ff524e4f49212e9f28d4a.png

3aa49b545cbca2ee6e47bba54f5ea669.png

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

154a5f9753db4530f9621897823e4c12.png

3. 总结

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

4. 参考资料

https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html

https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/

https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html

本篇作者

f1694aa30c4dc584ffba2723c98b89d5.jpeg

     李寅祥

亚马逊云科技解决方案架构师

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

c224b110e242b20724f134c7095b211e.gif

c8df306de798fd935a159821dd99f8c3.gif

听说,点完下面4个按钮

就不会碰到bug了!

ec9bc06a92d17d0d8bebb78e09aacd21.gif

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值