当前位置:网站首页>使用 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了!

边栏推荐
- arthas使用
- 微机原理与接口技术知识点整理复习–纯手打
- Understand the window query function of tdengine in one article
- 分布式事务简介(seata)
- 7. Icons
- Solution to 0xc000007b error when running the game [easy to understand]
- leetcode 322. Coin Change 零钱兑换(中等)
- 运行游戏时出现0xc000007b错误的解决方法[通俗易懂]
- spark源码阅读总纲
- 5. Use of ly tab plug-in of header component
猜你喜欢

App自动化测试开元平台Appium-runner

Enter the top six! Boyun's sales ranking in China's cloud management software market continues to rise

分布式事务简介(seata)

Anti fraud, refusing to gamble, safe payment | there are many online investment scams, so it's impossible to make money like this
![[安网杯 2021] REV WP](/img/98/ea5c241e2b8f3ae4c76e1c75c9e0d1.png)
[安网杯 2021] REV WP

The best landing practice of cave state in an Internet ⽹⾦ financial technology enterprise

Beidou communication module Beidou GPS module Beidou communication terminal DTU

【241. 为运算表达式设计优先级】

B站被骂上了热搜。。

刘对(火线安全)-多云环境的风险发现
随机推荐
3.4 data query in introduction to database system - select (single table query, connection query, nested query, set query, multi table query)
Camp division of common PLC programming software
Beidou communication module Beidou GPS module Beidou communication terminal DTU
用命令行 给 apk 签名
洞态在某互联⽹⾦融科技企业的最佳落地实践
机器学习总结(一):线性回归、岭回归、Lasso回归
AnimeSR:可学习的降质算子与新的真实世界动漫VSR数据集
【241. 为运算表达式设计优先级】
“国防七子”经费暴增,清华足足362亿元,甩第二名101亿 |全国高校2022预算大公开...
Detailed explanation of leetcode reconstruction binary tree [easy to understand]
spark源码(五)DAGScheduler TaskScheduler如何配合提交任务,application、job、stage、taskset、task对应关系是什么?
word2vec训练中文词向量
开源实习经验分享:openEuler软件包加固测试
Chen Yu (Aqua) - Safety - & gt; Cloud Security - & gt; Multicloud security
Self cultivation of open source programmers who contributed tens of millions of lines of code to shardingsphere and later became CEO
10. Page layout, guess you like it
spark源码阅读总纲
MySQL六十六问,两万字+五十图详解!复习必备
Global and Chinese silicone defoamer production and marketing demand and investment forecast analysis report Ⓨ 2022 ~ 2027
B站被骂上了热搜。。