当前位置:网站首页>使用 Lambda 函数URL + CloudFront 实现S3镜像回源
使用 Lambda 函数URL + CloudFront 实现S3镜像回源
2022-07-01 13:47:00 【亚马逊云开发者】

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

11)选择函数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. 参考资料
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
本篇作者

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


听说,点完下面4个按钮
就不会碰到bug了!

边栏推荐
- Use of shutter SQLite
- Some summary of pyqt5 learning (overview of the general meaning of some signals and methods)
- C语言订餐管理系统
- GET请求如何传递数组参数
- [安网杯 2021] REV WP
- 新手准备多少钱可以玩期货?农产品可以吗?
- Blind box NFT digital collection platform system development (build source code)
- 程序设计的基本概念
- 玩转gRPC—不同编程语言间通信
- Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its
猜你喜欢

What is the future development direction of people with ordinary education, appearance and family background? The career planning after 00 has been made clear

A new book by teacher Zhang Yujin of Tsinghua University: 2D vision system and image technology (five copies will be sent at the end of the article)

【NLP】预训练模型——GPT1

焱融看 | 混合云时代下,如何制定多云策略

2022上半年英特尔有哪些“硬核创新”?看这张图就知道了!

Self cultivation of open source programmers who contributed tens of millions of lines of code to shardingsphere and later became CEO

Flow management technology

研发效能度量框架解读

建立自己的网站(21)

清华章毓晋老师新书:2D视觉系统和图像技术(文末送5本)
随机推荐
研发效能度量框架解读
Machine learning summary (I): linear regression, ridge regression, Lasso regression
[machine learning] VAE variational self encoder learning notes
Terminal identification technology and management technology
佩服,阿里女程序卧底 500 多个黑产群……
【NLP】预训练模型——GPT1
2.15 summary
Fiori applications are shared through the enhancement of adaptation project
spark源码阅读总纲
04 redis source code data structure dictionary
Explain IO multiplexing, select, poll, epoll in detail
Introduction to distributed transactions (Seata)
Yan Rong looks at how to formulate a multi cloud strategy in the era of hybrid cloud
Sign APK with command line
用命令行 给 apk 签名
【机器学习】VAE变分自编码器学习笔记
单工,半双工,全双工区别以及TDD和FDD区别
Understand the window query function of tdengine in one article
GET请求如何传递数组参数
[Jianzhi offer] 54 The k-th node of binary search tree