如何使用boto3更新CloudFront事件触发Lambda@Edge配置
boto3更新CloudFront Lambda@Edge关联实现方法
boto3原生支持修改CloudFront分发的事件关联配置,Lambda@Edge的绑定关系属于CloudFront缓存行为的配置项,不存在独立的修改接口,按以下流程操作即可:
- 第一步:拉取目标分发的当前配置与版本校验ETag
CloudFront所有更新操作都必须携带当前配置对应的ETag做版本校验,否则会触发冲突报错,先调用get_distribution_config接口获取必要信息:import boto3 cf = boto3.client('cloudfront') DISTRIBUTION_ID = "替换为你的CloudFront分发ID" # 获取配置与ETag current_config = cf.get_distribution_config(Id=DISTRIBUTION_ID) dist_config = current_config['DistributionConfig'] etag = current_config['ETag'] - 第二步:修改缓存行为中的Lambda关联配置
你可以根据需要修改默认缓存行为或自定义路径缓存行为下的LambdaFunctionAssociations字段,维护模式通常绑定viewer-request事件:
注意:Lambda@Edge不支持指向$LATEST版本的ARN,必须使用发布后生成的指定版本ARN,否则配置提交会校验失败# 维护模式开启时的关联配置 maintain_mode_assoc = { "Quantity": 1, "Items": [ { # 注意必须填带版本号的Lambda@Edge ARN,不能使用$LATEST "LambdaFunctionARN": "替换为你的Lambda@Edge对应版本ARN", "EventType": "viewer-request", "IncludeBody": False } ] } # 绑定到默认缓存行为;要切回主站时把Quantity设为0、Items置为空列表即可 dist_config["DefaultCacheBehavior"]["LambdaFunctionAssociations"] = maintain_mode_assoc - 第三步:提交更新配置
调用update_distribution接口提交修改后的配置,传入之前获取的ETag:
提交后CloudFront会进入部署状态,通常5-10分钟完成生效,你可以轮询cf.update_distribution( DistributionConfig=dist_config, Id=DISTRIBUTION_ID, IfMatch=etag )get_distribution接口返回的Status字段,当值从InProgress变为Deployed即代表配置已全部分发完成。
更高效的维护模式切换方案
如果不想每次切换都等待CloudFront分发部署,可以选择不需要修改CloudFront配置的实现方式:
- 固定绑定Lambda@Edge到viewer-request事件,在Lambda逻辑中增加开关判断:把维护模式的开关值存在SSM参数存储或者DynamoDB中,Lambda每次触发时先读取开关状态,开关开启则直接返回维护页HTML,开关关闭则透传请求到S3源站。这种方式切换只需要修改参数值,数秒即可生效,完全不需要调整CloudFront配置。
- 轻量场景下可以替换为CloudFront Functions实现维护页返回,CloudFront Functions的部署更新速度远快于Lambda@Edge,且成本更低,适合这类简单的请求拦截、固定内容返回场景。
内容的提问来源于stack exchange,提问作者rennol
相关产品推荐
相关产品推荐

