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

0
0
{"value":"\n\n#### **1. 背景说明**\n\n\n亚马逊云科技 S3是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。各种规模和行业的客户都可以在 S3存储和保护任意量的数据。为提高数据安全性,很多客户会选择将现有数据迁移至 S3。在迁移存储于第三方的数据至 S3时,某些时候需要以“镜像回源”的方式完成以减少业务中断时间。“镜像回源”通常是指从 S3获取的文件不存在时,需要从第三方源获取该文件并存放至 S3。由于 S3本身不提供“镜像回源”的功能,因此需要考虑自行实现。\n\n一般情况下存储在 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 来实现“镜像回源”这一功能。方案的总体架构图如下。\n\n![image.png](https://dev-media.amazoncloud.cn/9fe2b9a474814dbbabd42842a33714ca_image.png)\n\n其工作原理说明如下:\n\n1)终端设备向 CloudFront 请求文件\n\n2)CloudFront 向 S3(主源站)请求文件\n\n3)文件不存在则返回403至 CloudFront\n\n4)CloudFront 根据源站组配置尝试请求 Lambda 函数 URL(备用源站)\n\n5)Lambda 从第三方源获取文件\n\n6)Lambda 将文件保存至 S3桶\n\n7)Lambda 返回302至 CloudFront,附带地址为原始文件从而使客户端重新请求该文件\n\n8)CloudFront 再次向 S3(主源站)请求文件\n\n9)S3返回文件至 CloudFront,CloudFront 边缘节点根据缓存策略配置缓存文件\n\n10)CloudFront 返回文件至终端设备\n\n\n#### **2. 配置指引**\n\n\n本方案总体配置流程为:\n\n1. 创建 S3桶\n2. 创建并配置 Lambda 函数\n3. 创建并配置 CloudFront 分发\n\nS3桶创建较为简单,本文略过,Lambda 函数、CloudFront 分发配置说明如下文。\n\n\n##### **2.1 Lambda 函数配置**\n\n\n1)进入 Lambda 控制台,点击“创建函数”开始创建 Lambda 函数\n\n![image.png](https://dev-media.amazoncloud.cn/348f1c7bbb9344fba9332639b9233bf1_image.png)\n\n2)按截图所示设置 Lambda 函数名、运行环境\n\n![image.png](https://dev-media.amazoncloud.cn/e64af28b5a62470598d69527ad256870_image.png)\n\n3)展开“高级设置”,选择启用函数 URL,为了方便演示将授权类型设置为 “NONE”,实际生产环境可根据需要配置\n\n![image.png](https://dev-media.amazoncloud.cn/c3850c030123413eabd4bd54b5ba9d3e_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/d7be25ff916943fa8c5fae99e840d1b5_image.png)\n\n5)添加层时层类型为“指定 ARN”,同时指定 ARN 值。ARN 可从如下链接根据区域、Python 库类型查询\n\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/870b498d26b745ccab7436bce7ca3725_image.png)\n\n6)进入 Lambda 函数配置界面,编辑常规配置。例如根据需要同步的文件大小调整超时时限\n\n![image.png](https://dev-media.amazoncloud.cn/a35d44f15b8749cda2f8bb90f4457bb7_image.png)\n\n7)选择左侧权限菜单,点击执行角色,为角色配置 S3桶访问权限\n\n![image.png](https://dev-media.amazoncloud.cn/88c803619f1c460581d498dd8a5efce1_image.png)\n\n8)进入角色权限配置页面,点击“添加权限” → “附加策略”\n\n![image.png](https://dev-media.amazoncloud.cn/5f635592689e45b59ae4ef3eba799922_image.png)\n\n9)为方便演示在弹出的策略中根据搜索选择 “AmazonS3FullAccess” 策略,后续生产环境可根据需要调整\n\n![image.png](https://dev-media.amazoncloud.cn/98fe2d19e59d4ccea5f06347c0da9dfc_image.png)\n\n10)选择环境变量菜单,如图所示添加环境变量 external_endpoint, s3_bucket, service_endpoint\n\n![image.png](https://dev-media.amazoncloud.cn/a881f1fee7d24620b4386854d92b1c20_image.png)\n\n11)选择函数 URL 菜单,复制函数 URL 备用\n\n![image.png](https://dev-media.amazoncloud.cn/a7e7048fec8843ddb293f6ccec2e5282_image.png)\n\n\n##### **2.2 CloudFront 配置**\n\n\n1)创建 CloudFront 分发,源域选择 S3桶,并配置 CloudFront 通过 OAI 访问 S3桶。其他保持默认配置,创建 CloudFront 分发\n\n![image.png](https://dev-media.amazoncloud.cn/03d9408380814460b83a631df89543cc_image.png)\n\n2)进入 CloudFront 分发配置,切换至“源”标签页,点击“创建源”\n\n![image.png](https://dev-media.amazoncloud.cn/77bd315267344387819cae1b0bf7f579_image.png)\n\n3)在源域配置界面填入 Lambda 函数 URL 域名,其余保持默认配置,点击创建源\n\n![image.png](https://dev-media.amazoncloud.cn/3293b488d34643fea2379c88e12eeb1b_image.png)\n\n4)点击“创建源组”\n\n![image.png](https://dev-media.amazoncloud.cn/55baa2c52980475299533d4da30ff99c_image.png)\n\n5)根据提示选择 S3源为主,Lambda 函数 URL 源为备,故障转移条件选择403、404\n\n![image.png](https://dev-media.amazoncloud.cn/41e66098cdaf49eab4c2d3943a64861e_image.png)\n\n6)在 CloudFront 控制台选择左侧“策略”菜单,在“缓存”标签页点击“创建缓存策略”\n\n![image.png](https://dev-media.amazoncloud.cn/cbd1df20559d45d7a7be70bc0f669747_image.png)\n\n7)在缓存策略配置界面录入缓存策略名,同时调整最短 TTL 至0,其余 TTL 值可保持默认,然后创建缓存策略\n\n![image.png](https://dev-media.amazoncloud.cn/222f7123db3846bb8fd38c3b3c5281dc_image.png)\n\n8)进入 CloudFront 分发“行为”标签页,选择默认行为并编辑\n\n![image.png](https://dev-media.amazoncloud.cn/cd315eb597b84c5a9f64bbc96c2bb9fc_image.png)\n\n9)在行为编辑界面设置“源和源组”为步骤5)创建的源组,同时调整缓存策略为步骤7)创建的缓存策略,然后保存更改\n\n![image.png](https://dev-media.amazoncloud.cn/42eebe13fb0745b6beba1938ed783260_image.png)\n\n![image.png](https://dev-media.amazoncloud.cn/57a94ce480a74d1aa53be749a4250f32_image.png)\n\n10)通过 CloudFront 访问类似如下文件,观察浏览器控制台网络请求情况。若出现类似下图结果,且文件正常保存至 S3桶 [“file/2022/03/18/ea27cb786ffb474682a8feb5.jpg” ](https://d281t76geo18u8.cloudfront.net/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/f133cdc73c5b4c01a5dc880aa915313a_image.png)\n\n\n#### **3. 总结**\n\n\nLambda 函数 URL 作为新发布的功能,允许用户直接通过互联网访问 Lambda,而且本功能没有额外的计费。本文提供示例借助 CloudFront 源组的故障转移功能和 Lambda 函数 URL 可快速实现 S3“镜像回源”功能。读者还可以根据自身业务需要通过 Lambda 函数 URL 来实现一些轻量级的微服务应用。\n\n\n#### **4. 参考资料**\n\n\n1. [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)\n2. [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/)\n3. [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)\n\n\n#### **本篇作者**\n\n\n![image.png](https://dev-media.amazoncloud.cn/ed5bd4c819ed438dbbd1a8371319c46f_image.png)\n\n\n#### **李寅祥**\n\n\nAmazon 解决方案架构师,负责基于 Amazon 云计算方案架构的咨询和设计,在国内推广 Amazon 云平台技术和各种解决方案。曾就职于 IBM,负责企业私有云方案咨询和架构设计,在基础架构方面有丰富经验。","render":"<h4><a id=\\"1__2\\"></a><strong>1. 背景说明</strong></h4>\\n<p>亚马逊云科技 S3是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。各种规模和行业的客户都可以在 S3存储和保护任意量的数据。为提高数据安全性,很多客户会选择将现有数据迁移至 S3。在迁移存储于第三方的数据至 S3时,某些时候需要以“镜像回源”的方式完成以减少业务中断时间。“镜像回源”通常是指从 S3获取的文件不存在时,需要从第三方源获取该文件并存放至 S3。由于 S3本身不提供“镜像回源”的功能,因此需要考虑自行实现。</p>\n<p>一般情况下存储在 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 来实现“镜像回源”这一功能。方案的总体架构图如下。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/9fe2b9a474814dbbabd42842a33714ca_image.png\\" alt=\\"image.png\\" /></p>\n<p>其工作原理说明如下:</p>\n<p>1)终端设备向 CloudFront 请求文件</p>\n<p>2)CloudFront 向 S3(主源站)请求文件</p>\n<p>3)文件不存在则返回403至 CloudFront</p>\n<p>4)CloudFront 根据源站组配置尝试请求 Lambda 函数 URL(备用源站)</p>\n<p>5)Lambda 从第三方源获取文件</p>\n<p>6)Lambda 将文件保存至 S3桶</p>\n<p>7)Lambda 返回302至 CloudFront,附带地址为原始文件从而使客户端重新请求该文件</p>\n<p>8)CloudFront 再次向 S3(主源站)请求文件</p>\n<p>9)S3返回文件至 CloudFront,CloudFront 边缘节点根据缓存策略配置缓存文件</p>\n<p>10)CloudFront 返回文件至终端设备</p>\n<h4><a id=\\"2__34\\"></a><strong>2. 配置指引</strong></h4>\\n<p>本方案总体配置流程为:</p>\n<ol>\\n<li>创建 S3桶</li>\n<li>创建并配置 Lambda 函数</li>\n<li>创建并配置 CloudFront 分发</li>\n</ol>\\n<p>S3桶创建较为简单,本文略过,Lambda 函数、CloudFront 分发配置说明如下文。</p>\n<h5><a id=\\"21_Lambda__46\\"></a><strong>2.1 Lambda 函数配置</strong></h5>\\n<p>1)进入 Lambda 控制台,点击“创建函数”开始创建 Lambda 函数</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/348f1c7bbb9344fba9332639b9233bf1_image.png\\" alt=\\"image.png\\" /></p>\n<p>2)按截图所示设置 Lambda 函数名、运行环境</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/e64af28b5a62470598d69527ad256870_image.png\\" alt=\\"image.png\\" /></p>\n<p>3)展开“高级设置”,选择启用函数 URL,为了方便演示将授权类型设置为 “NONE”,实际生产环境可根据需要配置</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/c3850c030123413eabd4bd54b5ba9d3e_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/d7be25ff916943fa8c5fae99e840d1b5_image.png\\" alt=\\"image.png\\" /></p>\n<p>5)添加层时层类型为“指定 ARN”,同时指定 ARN 值。ARN 可从如下链接根据区域、Python 库类型查询</p>\n<p><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/870b498d26b745ccab7436bce7ca3725_image.png\\" alt=\\"image.png\\" /></p>\n<p>6)进入 Lambda 函数配置界面,编辑常规配置。例如根据需要同步的文件大小调整超时时限</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/a35d44f15b8749cda2f8bb90f4457bb7_image.png\\" alt=\\"image.png\\" /></p>\n<p>7)选择左侧权限菜单,点击执行角色,为角色配置 S3桶访问权限</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/88c803619f1c460581d498dd8a5efce1_image.png\\" alt=\\"image.png\\" /></p>\n<p>8)进入角色权限配置页面,点击“添加权限” → “附加策略”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/5f635592689e45b59ae4ef3eba799922_image.png\\" alt=\\"image.png\\" /></p>\n<p>9)为方便演示在弹出的策略中根据搜索选择 “AmazonS3FullAccess” 策略,后续生产环境可根据需要调整</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/98fe2d19e59d4ccea5f06347c0da9dfc_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/a881f1fee7d24620b4386854d92b1c20_image.png\\" alt=\\"image.png\\" /></p>\n<p>11)选择函数 URL 菜单,复制函数 URL 备用</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/a7e7048fec8843ddb293f6ccec2e5282_image.png\\" alt=\\"image.png\\" /></p>\n<h5><a id=\\"22_CloudFront__98\\"></a><strong>2.2 CloudFront 配置</strong></h5>\\n<p>1)创建 CloudFront 分发,源域选择 S3桶,并配置 CloudFront 通过 OAI 访问 S3桶。其他保持默认配置,创建 CloudFront 分发</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/03d9408380814460b83a631df89543cc_image.png\\" alt=\\"image.png\\" /></p>\n<p>2)进入 CloudFront 分发配置,切换至“源”标签页,点击“创建源”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/77bd315267344387819cae1b0bf7f579_image.png\\" alt=\\"image.png\\" /></p>\n<p>3)在源域配置界面填入 Lambda 函数 URL 域名,其余保持默认配置,点击创建源</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/3293b488d34643fea2379c88e12eeb1b_image.png\\" alt=\\"image.png\\" /></p>\n<p>4)点击“创建源组”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/55baa2c52980475299533d4da30ff99c_image.png\\" alt=\\"image.png\\" /></p>\n<p>5)根据提示选择 S3源为主,Lambda 函数 URL 源为备,故障转移条件选择403、404</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/41e66098cdaf49eab4c2d3943a64861e_image.png\\" alt=\\"image.png\\" /></p>\n<p>6)在 CloudFront 控制台选择左侧“策略”菜单,在“缓存”标签页点击“创建缓存策略”</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/cbd1df20559d45d7a7be70bc0f669747_image.png\\" alt=\\"image.png\\" /></p>\n<p>7)在缓存策略配置界面录入缓存策略名,同时调整最短 TTL 至0,其余 TTL 值可保持默认,然后创建缓存策略</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/222f7123db3846bb8fd38c3b3c5281dc_image.png\\" alt=\\"image.png\\" /></p>\n<p>8)进入 CloudFront 分发“行为”标签页,选择默认行为并编辑</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/cd315eb597b84c5a9f64bbc96c2bb9fc_image.png\\" alt=\\"image.png\\" /></p>\n<p>9)在行为编辑界面设置“源和源组”为步骤5)创建的源组,同时调整缓存策略为步骤7)创建的缓存策略,然后保存更改</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/42eebe13fb0745b6beba1938ed783260_image.png\\" alt=\\"image.png\\" /></p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/57a94ce480a74d1aa53be749a4250f32_image.png\\" alt=\\"image.png\\" /></p>\n<p>10)通过 CloudFront 访问类似如下文件,观察浏览器控制台网络请求情况。若出现类似下图结果,且文件正常保存至 S3桶 <a href=\\"https://d281t76geo18u8.cloudfront.net/file/2022/03/18/ea27cb786ffb474682a8feb5.jpg\\" target=\\"_blank\\">“file/2022/03/18/ea27cb786ffb474682a8feb5.jpg” </a>则说明镜像回源配置成功 https://d281txxxxxxxx.cloudfront.net/file/2022/03/18/ea27cb786ffb474682a8feb5.jpg</p>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/f133cdc73c5b4c01a5dc880aa915313a_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"3__144\\"></a><strong>3. 总结</strong></h4>\\n<p>Lambda 函数 URL 作为新发布的功能,允许用户直接通过互联网访问 Lambda,而且本功能没有额外的计费。本文提供示例借助 CloudFront 源组的故障转移功能和 Lambda 函数 URL 可快速实现 S3“镜像回源”功能。读者还可以根据自身业务需要通过 Lambda 函数 URL 来实现一些轻量级的微服务应用。</p>\n<h4><a id=\\"4__150\\"></a><strong>4. 参考资料</strong></h4>\\n<ol>\\n<li><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></li>\\n<li><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></li>\\n<li><a href=\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-urls.html\\" target=\\"_blank\\">https://aws.amazon.com/blogs/aws/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/</a></li>\\n</ol>\n<h4><a id=\\"_158\\"></a><strong>本篇作者</strong></h4>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/ed5bd4c819ed438dbbd1a8371319c46f_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_164\\"></a><strong>李寅祥</strong></h4>\\n<p>Amazon 解决方案架构师,负责基于 Amazon 云计算方案架构的咨询和设计,在国内推广 Amazon 云平台技术和各种解决方案。曾就职于 IBM,负责企业私有云方案咨询和架构设计,在基础架构方面有丰富经验。</p>\n"}
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
0
目录
关闭