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

亚马逊云科技
Amazon Lambda
0
0
{"value":"### **1.背景说明**\n\n**亚马逊云科技 S3是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能**。各种规模和行业的客户都可以在 S3存储和保护任意量的数据。为提高数据安全性,很多客户会选择将现有数据迁移至 S3。\n\n在迁移存储于第三方的数据至 S3时,某些时候需要以“镜像回源”的方式完成以减少业务中断时间。“镜像回源”通常是指从 S3获取的文件不存在时,需要从第三方源获取该文件并存放至 S3。由于 S3本身不提供“镜像回源”的功能,因此需要考虑自行实现。\n\n一般情况下存储在S3的文件会通过 CloudFront 供外部使用,而 CloudFront 源组支持故障转移功能。一个可行的方案是借助 CloudFront 源组故障转移时利用备用源从第三方同步文件并保存至S3再返回给客户端。\n\n在 Lambda 函数 URL 发布之前,通常需要在 EC2 部署一个简单的应用来作为备用源。这需要对“镜像回源”数据量有准确的估算否则会造成回源异常或者 EC2 资源浪费,借助 Lambda 则可以有效避免这些问题。\n\nLambda 函数 URL 是 Lambda 在4月份新发布的一个特性,**允许直接通过函数的URL断点调用 Lambda 函数** 。借用此特性,可以在不使用 API Gateway 或者 ALB 的情况下使用 Lambda 完成一些类似 webhook、表单校验之类的简单功能,并且不会生额外的 Lambda 费用。后文将介绍如何通过 Lambda 函数 URL+CloudFront 来实现“镜像回源”这一功能。\n\n方案的总体架构图如下。\n\n![image.png](https://dev-media.amazoncloud.cn/8bfe353bee6841ea9a5747c47a9e8d84_image.png)\n\n其工作原理说明如下:\n1)终端设备向 CloudFront 请求文件\n2)CloudFront 向 S3(主源站)请求文件\n3)文件不存在则返回403至 CloudFront\n4)CloudFron t根据源站组配置尝试请求 Lambda 函数 URL (备用源站)\n5)Lambda 从第三方源获取文件\n6)Lambda 将文件保存至S3桶\n7)Lambda 返回302至 CloudFront,附带地址为原始文件从而使客户端重新请求该文件\n\n8)CloudFront 再次向 S3(主源站)请求文件\n\n9)S3 返回文件至 CloudFront,CloudFront 边缘节点根据缓存策略配置缓存文件\n\n10)CloudFront 返回文件至终端设备\n\n### **2.配置指引**\n本方案总体配置流程为:\n\n1.创建 S3桶\n\n2.创建并配置 Lambda 函数\n\n3.创建并配置 CloudFront 分发\n\nS3桶创建较为简单,本文略过,Lambda 函数、CloudFront 分发配置说明如下文。\n\n**2.1 Lambda 函数配置**\n\n1)进入 Lambda 控制台,点击“创建函数”开始创建Lambda函数\n\n![image.png](https://dev-media.amazoncloud.cn/e6209930a82e4a44a03c342e0f4dfd36_image.png)\n\n2)按截图所示设置 Lambda 函数名、运行环境\n\n![image.png](https://dev-media.amazoncloud.cn/d2c00f1c3770414a86810f1375893141_image.png)\n\n3)展开“高级设置”,选择启用函数 URL,为了方便演示将授权类型设置为 “NONE”,实际生产环境可根据需要配置\n\n![image.png](https://dev-media.amazoncloud.cn/26ef7cdb369e49428d7bdb14fe2a29ae_image.png)\n\n4)函数代码可从如下地址复制。注意,链接中的示例代码使用了 Python Requests 库,因此需要为 Lambda 添加层以包含该库,操作方式如下图\n\n[https://github.com/ensean/lambda_sync_from_3rd_origin/blob/master/lambda_hanlder.py](https://github.com/ensean/lambda_sync_from_3rd_origin/blob/master/lambda_hanlder.py)\n\n![image.png](https://dev-media.amazoncloud.cn/09bcf004b06b456ea8ad0da8ad6e32d2_image.png)\n\n5)添加层时层类型为“指定 ARN”,同时指定ARN值。ARN可从如下链接根据区域、Python 库类型查询\n[https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9](https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9)\n\n![image.png](https://dev-media.amazoncloud.cn/c0c4205886b14755a81d6f174178c7ca_image.png)\n\n6)进入 Lambda 函数配置界面,编辑常规配置。例如根据需要同步的文件大小调整超时时限\n\n![image.png](https://dev-media.amazoncloud.cn/2a45d95c96be44df879ce402a9722522_image.png)\n\n7)选择左侧权限菜单,点击执行角色,为角色配置 S3桶访问权限\n\n![image.png](https://dev-media.amazoncloud.cn/e595438252be49fb8f46658e8877c23d_image.png)\n\n8)进入角色权限配置页面,点击“添加权限” → “附加策略”\n\n![image.png](https://dev-media.amazoncloud.cn/e2a4ecd808cc4210970224699f813810_image.png)\n\n9)为方便演示在弹出的策略中根据搜索选择“ AmazonS3FullAccess ”策略,后续生产环境可根据需要调整\n\n![image.png](https://dev-media.amazoncloud.cn/2932b112e31443ee90212a05e6928225_image.png)\n\n10)选择环境变量菜单,如图所示添加环境变量 external_endpoint, s3_bucket, service_endpoint\n\n![image.png](https://dev-media.amazoncloud.cn/43cb85a1c40c4064acb4c3501724ea8d_image.png)\n\n11)选择函数 URL 菜单,复制函数 URL 备用\n\n![image.png](https://dev-media.amazoncloud.cn/bdbc41e3a67144bcbaca4d637b383d59_image.png)\n\n**2.2 CloudFront配置**\n1)创建 CloudFront 分发,源域选择 S3桶,并配置 CloudFront 通过 OAI 访问 S3桶。其他保持默认配置,创建 CloudFront 分发\n\n![image.png](https://dev-media.amazoncloud.cn/4cb65a01757244e7bb0550fd57f8ffe1_image.png)\n\n2)进入 CloudFront 分发配置,切换至“源”标签页,点击“创建源”\n\n![image.png](https://dev-media.amazoncloud.cn/15582a7349e24332af1d11adfab70233_image.png)\n\n3)在源域配置界面填入 Lambda 函数 URL 域名,其余保持默认配置,点击创建源\n\n![image.png](https://dev-media.amazoncloud.cn/3733d37307044f03a9b244613e36e507_image.png)\n\n4)点击“创建源组”\n\n![image.png](https://dev-media.amazoncloud.cn/e2df523e4f2943939136de5c90594327_image.png)\n\n5)根据提示选择 S3源为主,Lambda 函数 URL 源为备,故障转移条件选择403、404\n\n![image.png](https://dev-media.amazoncloud.cn/886af2e70f3c44899efb80f7204c60c6_image.png)\n\n6)在 CloudFront 控制台选择左侧“策略”菜单,在“缓存”标签页点击“创建缓存策略”\n\n![image.png](https://dev-media.amazoncloud.cn/b5ec5bfb35fe4df8b868adbc8fc3b151_image.png)\n\n7)在缓存策略配置界面录入缓存策略名,同时调整最短 TTL 至0,其余 TTL 值可保持默认,然后创建缓存策略\n\n![image.png](https://dev-media.amazoncloud.cn/dfbbd5d501184d9396c8579e9be704c3_image.png)\n\n8)进入 CloudFront 分发“行为”标签页,选择默认行为并编辑\n\n![image.png](https://dev-media.amazoncloud.cn/362fdbd362984e5bb3fa3264e0ce1d8b_image.png)\n\n9)在行为编辑界面设置“源和源组”为步骤5)创建的源组,同时调整缓存策略为步骤7)创建的缓存策略,然后保存更改\n\n![image.png](https://dev-media.amazoncloud.cn/646bfa1e48b44c9dbfe66404a39afb8f_image.png)\n![image.png](https://dev-media.amazoncloud.cn/a8ef7f2da26b43d9bb5443e9bd458cdf_image.png)\n\n10)通过 CloudFront 访问类似如下文件,观察浏览器控制台网络请求情况。若出现类似下图结果,且文件正常保存至S3桶“file/2022/03/18/ea27cb786ffb474682a8feb5.jpg”则说明镜像回源配置成功 https://d281txxxxxxxx.cloudfront.net/file/2022/03/18/ea27cb786ffb474682a8feb5.jpg\n\n![image.png](https://dev-media.amazoncloud.cn/58c632ed513e42c181762201cf889a9c_image.png)\n\n### **3. 总结**\nLambda 函数 URL 作为新发布的功能,允许用户直接通过互联网访问 Lambda,而且本功能没有额外的计费。本文提供示例借助 CloudFront 源组的故障转移功能和 Lambda 函数 UR L可快速实现 S3“镜像回源”功能。读者还可以根据自身业务需要通过 Lambda 函数 URL 来实现一些轻量级的微服务应用。\n\n### **4. 参考资料**\n[https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html](https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html)\n[https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/](https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/)\n[https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html](https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html)\n\n##### **本篇作者**\n**李寅祥**\n亚马逊云科技解决方案架构师\n\n负责基于亚马逊云科技云计算方案架构的咨询和设计,在国内推广亚马逊云科技云平台技术和各种解决方案。曾就职于 IBM,负责企业私有云方案咨询和架构设计,在基础架构方面有丰富经验。\n\n[阅读原文](https://github.com/yuhuiaws/ML-study/tree/main/)","render":"<h3><a id=\"1_0\"></a><strong>1.背景说明</strong></h3>\n<p><strong>亚马逊云科技 S3是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能</strong>。各种规模和行业的客户都可以在 S3存储和保护任意量的数据。为提高数据安全性,很多客户会选择将现有数据迁移至 S3。</p>\n<p>在迁移存储于第三方的数据至 S3时,某些时候需要以“镜像回源”的方式完成以减少业务中断时间。“镜像回源”通常是指从 S3获取的文件不存在时,需要从第三方源获取该文件并存放至 S3。由于 S3本身不提供“镜像回源”的功能,因此需要考虑自行实现。</p>\n<p>一般情况下存储在S3的文件会通过 CloudFront 供外部使用,而 CloudFront 源组支持故障转移功能。一个可行的方案是借助 CloudFront 源组故障转移时利用备用源从第三方同步文件并保存至S3再返回给客户端。</p>\n<p>在 Lambda 函数 URL 发布之前,通常需要在 EC2 部署一个简单的应用来作为备用源。这需要对“镜像回源”数据量有准确的估算否则会造成回源异常或者 EC2 资源浪费,借助 Lambda 则可以有效避免这些问题。</p>\n<p>Lambda 函数 URL 是 Lambda 在4月份新发布的一个特性,<strong>允许直接通过函数的URL断点调用 Lambda 函数</strong> 。借用此特性,可以在不使用 API Gateway 或者 ALB 的情况下使用 Lambda 完成一些类似 webhook、表单校验之类的简单功能,并且不会生额外的 Lambda 费用。后文将介绍如何通过 Lambda 函数 URL+CloudFront 来实现“镜像回源”这一功能。</p>\n<p>方案的总体架构图如下。</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/8bfe353bee6841ea9a5747c47a9e8d84_image.png\" alt=\"image.png\" /></p>\n<p>其工作原理说明如下:<br />\n1)终端设备向 CloudFront 请求文件<br />\n2)CloudFront 向 S3(主源站)请求文件<br />\n3)文件不存在则返回403至 CloudFront<br />\n4)CloudFron t根据源站组配置尝试请求 Lambda 函数 URL (备用源站)<br />\n5)Lambda 从第三方源获取文件<br />\n6)Lambda 将文件保存至S3桶<br />\n7)Lambda 返回302至 CloudFront,附带地址为原始文件从而使客户端重新请求该文件</p>\n<p>8)CloudFront 再次向 S3(主源站)请求文件</p>\n<p>9)S3 返回文件至 CloudFront,CloudFront 边缘节点根据缓存策略配置缓存文件</p>\n<p>10)CloudFront 返回文件至终端设备</p>\n<h3><a id=\"2_31\"></a><strong>2.配置指引</strong></h3>\n<p>本方案总体配置流程为:</p>\n<p>1.创建 S3桶</p>\n<p>2.创建并配置 Lambda 函数</p>\n<p>3.创建并配置 CloudFront 分发</p>\n<p>S3桶创建较为简单,本文略过,Lambda 函数、CloudFront 分发配置说明如下文。</p>\n<p><strong>2.1 Lambda 函数配置</strong></p>\n<p>1)进入 Lambda 控制台,点击“创建函数”开始创建Lambda函数</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e6209930a82e4a44a03c342e0f4dfd36_image.png\" alt=\"image.png\" /></p>\n<p>2)按截图所示设置 Lambda 函数名、运行环境</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/d2c00f1c3770414a86810f1375893141_image.png\" alt=\"image.png\" /></p>\n<p>3)展开“高级设置”,选择启用函数 URL,为了方便演示将授权类型设置为 “NONE”,实际生产环境可根据需要配置</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/26ef7cdb369e49428d7bdb14fe2a29ae_image.png\" alt=\"image.png\" /></p>\n<p>4)函数代码可从如下地址复制。注意,链接中的示例代码使用了 Python Requests 库,因此需要为 Lambda 添加层以包含该库,操作方式如下图</p>\n<p><a href=\"https://github.com/ensean/lambda_sync_from_3rd_origin/blob/master/lambda_hanlder.py\" target=\"_blank\">https://github.com/ensean/lambda_sync_from_3rd_origin/blob/master/lambda_hanlder.py</a></p>\n<p><img src=\"https://dev-media.amazoncloud.cn/09bcf004b06b456ea8ad0da8ad6e32d2_image.png\" alt=\"image.png\" /></p>\n<p>5)添加层时层类型为“指定 ARN”,同时指定ARN值。ARN可从如下链接根据区域、Python 库类型查询<br />\n<a href=\"https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9\" target=\"_blank\">https://github.com/keithrozario/Klayers/tree/master/deployments/python3.9</a></p>\n<p><img src=\"https://dev-media.amazoncloud.cn/c0c4205886b14755a81d6f174178c7ca_image.png\" alt=\"image.png\" /></p>\n<p>6)进入 Lambda 函数配置界面,编辑常规配置。例如根据需要同步的文件大小调整超时时限</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2a45d95c96be44df879ce402a9722522_image.png\" alt=\"image.png\" /></p>\n<p>7)选择左侧权限菜单,点击执行角色,为角色配置 S3桶访问权限</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e595438252be49fb8f46658e8877c23d_image.png\" alt=\"image.png\" /></p>\n<p>8)进入角色权限配置页面,点击“添加权限” → “附加策略”</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e2a4ecd808cc4210970224699f813810_image.png\" alt=\"image.png\" /></p>\n<p>9)为方便演示在弹出的策略中根据搜索选择“ AmazonS3FullAccess ”策略,后续生产环境可根据需要调整</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/2932b112e31443ee90212a05e6928225_image.png\" alt=\"image.png\" /></p>\n<p>10)选择环境变量菜单,如图所示添加环境变量 external_endpoint, s3_bucket, service_endpoint</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/43cb85a1c40c4064acb4c3501724ea8d_image.png\" alt=\"image.png\" /></p>\n<p>11)选择函数 URL 菜单,复制函数 URL 备用</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/bdbc41e3a67144bcbaca4d637b383d59_image.png\" alt=\"image.png\" /></p>\n<p><strong>2.2 CloudFront配置</strong><br />\n1)创建 CloudFront 分发,源域选择 S3桶,并配置 CloudFront 通过 OAI 访问 S3桶。其他保持默认配置,创建 CloudFront 分发</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/4cb65a01757244e7bb0550fd57f8ffe1_image.png\" alt=\"image.png\" /></p>\n<p>2)进入 CloudFront 分发配置,切换至“源”标签页,点击“创建源”</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/15582a7349e24332af1d11adfab70233_image.png\" alt=\"image.png\" /></p>\n<p>3)在源域配置界面填入 Lambda 函数 URL 域名,其余保持默认配置,点击创建源</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/3733d37307044f03a9b244613e36e507_image.png\" alt=\"image.png\" /></p>\n<p>4)点击“创建源组”</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/e2df523e4f2943939136de5c90594327_image.png\" alt=\"image.png\" /></p>\n<p>5)根据提示选择 S3源为主,Lambda 函数 URL 源为备,故障转移条件选择403、404</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/886af2e70f3c44899efb80f7204c60c6_image.png\" alt=\"image.png\" /></p>\n<p>6)在 CloudFront 控制台选择左侧“策略”菜单,在“缓存”标签页点击“创建缓存策略”</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/b5ec5bfb35fe4df8b868adbc8fc3b151_image.png\" alt=\"image.png\" /></p>\n<p>7)在缓存策略配置界面录入缓存策略名,同时调整最短 TTL 至0,其余 TTL 值可保持默认,然后创建缓存策略</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/dfbbd5d501184d9396c8579e9be704c3_image.png\" alt=\"image.png\" /></p>\n<p>8)进入 CloudFront 分发“行为”标签页,选择默认行为并编辑</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/362fdbd362984e5bb3fa3264e0ce1d8b_image.png\" alt=\"image.png\" /></p>\n<p>9)在行为编辑界面设置“源和源组”为步骤5)创建的源组,同时调整缓存策略为步骤7)创建的缓存策略,然后保存更改</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/646bfa1e48b44c9dbfe66404a39afb8f_image.png\" alt=\"image.png\" /><br />\n<img src=\"https://dev-media.amazoncloud.cn/a8ef7f2da26b43d9bb5443e9bd458cdf_image.png\" alt=\"image.png\" /></p>\n<p>10)通过 CloudFront 访问类似如下文件,观察浏览器控制台网络请求情况。若出现类似下图结果,且文件正常保存至S3桶“file/2022/03/18/ea27cb786ffb474682a8feb5.jpg”则说明镜像回源配置成功 https://d281txxxxxxxx.cloudfront.net/file/2022/03/18/ea27cb786ffb474682a8feb5.jpg</p>\n<p><img src=\"https://dev-media.amazoncloud.cn/58c632ed513e42c181762201cf889a9c_image.png\" alt=\"image.png\" /></p>\n<h3><a id=\"3__133\"></a><strong>3. 总结</strong></h3>\n<p>Lambda 函数 URL 作为新发布的功能,允许用户直接通过互联网访问 Lambda,而且本功能没有额外的计费。本文提供示例借助 CloudFront 源组的故障转移功能和 Lambda 函数 UR L可快速实现 S3“镜像回源”功能。读者还可以根据自身业务需要通过 Lambda 函数 URL 来实现一些轻量级的微服务应用。</p>\n<h3><a id=\"4__136\"></a><strong>4. 参考资料</strong></h3>\n<p><a href=\"https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html\" target=\"_blank\">https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/high_availability_origin_failover.html</a><br />\n<a href=\"https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/\" target=\"_blank\">https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/</a><br />\n<a href=\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html\" target=\"_blank\">https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html</a></p>\n<h5><a id=\"_141\"></a><strong>本篇作者</strong></h5>\n<p><strong>李寅祥</strong><br />\n亚马逊云科技解决方案架构师</p>\n<p>负责基于亚马逊云科技云计算方案架构的咨询和设计,在国内推广亚马逊云科技云平台技术和各种解决方案。曾就职于 IBM,负责企业私有云方案咨询和架构设计,在基础架构方面有丰富经验。</p>\n<p><a href=\"https://github.com/yuhuiaws/ML-study/tree/main/\" target=\"_blank\">阅读原文</a></p>\n"}
0
目录
关闭
contact-us