亚马逊AWS官方博客
自动创建和更新 CloudFront 中的 Lambda@Edge
应用场景
在配置CloudFront的Distribution的时候,往往一个distribution下可能会有多个behavior。每个behavior下可能会用Lambda@Edge来实现修改请求或者边缘计算等功能。在整个Lambda@Edge的部署过程中,需要修改晚Lambda的代码后,在将代码推送到边缘节点,并且需要在CloudFront的每一个behavior的配置下面修改Lambda@Edge的version ARN。为了避免手动误操作的情况,本文主要讨论一个自动化的部署方案,在完成CI阶段后,仅需把程序包放置在对应的存储桶位置时,就可以实现CloudFront的Lambda@Edge的自动化部署方案
技术背景
本文主要应用到了以下AWS的服务及功能
1.S3 Bucket,并启用了版本控制:用于存储Lambda@Edge的代码
2.S3 存储桶触发Lambda:集成服务,实现上传Object后能够自动触发CloudFormation执行。并控制参数传入
(参考文档: https://docs.amazonaws.cn/lambda/latest/dg/with-s3-example.html)
3.CloudFormation:创建并负责更新CloudFront, Lambda@Edge, Lambda Version 等组件
事例代码
CloudFormation:
Lambda:
部署函数之前,需要设置Template URL 为CloudFormation 模版存储的s3 地址
Lambda@Edge json code:
工作原理
资源准备
1.创建S3 存储桶作为Lambda@Edge的代码artifacts。
2.创建S3 存储桶,作为CloudFormation 存储模版的仓库,并将模版上传至存储桶
3.创建deployed lambda执行时所需的IAM Role(具备AWSLambdaBasicExecutionRole 和 自定义策略如下)
示例场景及代码
场景一: 首次部署CloudFront和Lambda@Edge
CloudFormation Template解释:
在cloudfront_lambda.yaml,定义了一个参数 FirstLaunch, 并在后面用Conditions 设置一个判断条件。
在创建distribution的resource中,关联Lambda@Edge部分的时候会使用这个判断条件,如果FirstLaunch 为True的时候则这里的参数引用本模版中创建的Lambda Version,如果为False,则引用从Template外传入的参数。
创建资源
参考官方文档,创建堆栈
https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/cfn-using-console.html
注意:在首次执行的时候,FirstLaunch 请选择true。
验证:
1.验证堆栈
在CloudFormation创建完毕后,以下资源被创建
2.登入CloudFront界面查看Distribution的Behavior
3.访问CloudFront的页面,并与Lambda@Edge功能核对
场景二: 更新CloudFront上的Lambda@Edge
在运行完首次创建后,在后期正常运维的情况下,可以直接将代码更新到S3 的Artifacts中,后续部分自动由deploy_lambda.py来执行。
deploy_lambda.py代码解释:
update_lambda() 负责根据event中的捕获的信息,完成对应的Lambda@Edge的更新,并生成新的版本。并作为更新CloudFormation的输入参数进行后续操作
注意:
- py 的权限请参照文章资源准备中的权限部分
- 您上传的Lambda@Edge的zip包的名字需要跟Lambda@Edge函数的名字保持一致。
- StackName 要与CloudFormation的Stack名称一致,如果考虑参数联动,可以后期将py与API Gateway继承,进行参数传递
验证:
当您具备以上的前置条件和注意事项后
1.上传代码到S3 的artifacts中,并查看版本信息
2.检查CloudFormation是否处于更新状态,并等待更新完成(注意:因为更新CloudFront资源本身涉及到更新edge端的配置,因此可能耗时较长)
3.检查CloudFront状态,直至状态变更为“已部署”
4.检查Lambda@Edge效果(由于可能存在缓存,请清理缓存后验证)
总结
- 如果在管理多个Lambda@Edge场景中,可以将CloudFormation模版修改为Nested Stack方式执行。
- 在后续运维过程中,用户只需要将Lambda@Edge的code上传至S3即可,CD部分自动化实施
- CI部分可以集成Code系列工具,只需将代码成功上传至S3即可