首页/新闻资讯/正文详情

使用 Boto3 管理 CloudFront 分发:Python 代码示例实战指南

发布时间:2026/9/27 21:23:10 来源:云帆数科 栏目:资讯中心
使用 Boto3 管理 CloudFront 分发:Python 代码示例实战指南
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本文以 aws-doc-sdk-examples 仓库中python/example_code/cloudfront目录下的官方示例为蓝本系统讲解如何用 AWS SDK for PythonBoto3执行 Amazon CloudFront 分发Distribution的查询与更新操作。读完本文你将掌握ListDistributions、GetDistributionConfig、UpdateDistribution三个核心 API 的调用方式、ETag 乐观锁的更新流程以及如何借助仓库自带的 Stubber 测试工具完成不产生任何 AWS 费用的单元测试。示例概览本示例围绕 CloudFront 的分发这一核心资源展开封装在CloudFrontWrapper类中位于 distributions.py。它演示了三类最常见的单动作Single action调用单动作源码位置对应 Boto3 方法功能ListDistributionsdistributions.py#L27list_distributions()列举账户下的全部分发并打印域名、ID 与证书信息GetDistributionConfigdistributions.py#L55get_distribution_config()获取指定分发的配置与 ETag作为更新示例的预备步骤UpdateDistributiondistributions.py#L49update_distribution()在并发保护下更新分发的 Comment 字段CloudFront 通过全球边缘节点加速静态与动态 Web 内容如.html、.css、.php、图片和媒体文件的分发而分发正是定义这些内容如何被缓存与交付的配置单元。本示例即围绕读取、修改这一配置单元展开。环境准备与运行方式前置条件一个有效的 AWS 账户并按 AWS 工具与 SDK 共享配置和凭据参考指南 中有完整说明。Python 3.6.0 或更高版本。遵循最低权限原则仅授予执行任务所需的最小 IAM 权限。对于本示例即 CloudFront 的ListDistributions、GetDistributionConfig、UpdateDistribution三个操作的读/写权限。安装依赖在虚拟环境中安装 requirements.txt 列出的包python -m pip install -r requirements.txt该文件声明了两个依赖boto31.26.79AWS SDK for Python提供 CloudFront 客户端pytest7.2.1运行单元测试所需的测试框架。推荐的完整流程是先创建并激活虚拟环境python -m venv .venv source .venv/bin/activate # Linux、macOS 或 UnixWindows 使用 .venv\Scripts\activate python -m pip install -r requirements.txt运行示例在命令行中直接运行python distributions.py脚本会依次执行两个操作调用list_distributions()打印账户下的所有 CloudFront 分发调用update_distribution()交互式地等待你输入一个分发 ID然后修改该分发的 Comment。⚠ 注意在真实账户上运行会产生 AWS 费用。若仅做学习验证建议优先使用下文介绍的 Stubber 单元测试方式。核心代码逐段解析客户端封装与类结构示例用一个薄封装类持有 Boto3 CloudFront 客户端class CloudFrontWrapper: Encapsulates Amazon CloudFront operations. def __init__(self, cloudfront_client): :param cloudfront_client: A Boto3 CloudFront client self.cloudfront_client cloudfront_client构造函数接收一个boto3.client(cloudfront)实例把创建客户端与业务操作解耦——这正是单元测试中注入 Stubber 的关键测试替身替换的是这里的客户端对象而非业务逻辑。ListDistributions枚举分发列表def list_distributions(self): print(CloudFront distributions:\n) distributions self.cloudfront_client.list_distributions() if distributions[DistributionList][Quantity] 0: for distribution in distributions[DistributionList][Items]: print(fDomain: {distribution[DomainName]}) print(fDistribution Id: {distribution[Id]}) print( fCertificate Source: f{distribution[ViewerCertificate][CertificateSource]} ) if distribution[ViewerCertificate][CertificateSource] acm: print( fCertificate: {distribution[ViewerCertificate][Certificate]} ) print() else: print(No CloudFront distributions detected.)实现要点分页结构list_distributions()的返回体DistributionList是 CloudFront 统一的量 项结构。Quantity表示条目总数Items是实际数据数组。代码先判断Quantity 0再遍历避免空列表报错。证书来源判断ViewerCertificate.CertificateSource字段取值通常为acmAWS Certificate Manager、iamIAM 证书存储已不再推荐或cloudfront默认证书。示例仅当来源为acm时才打印证书 ARN因为只有该来源的Certificate字段才有意义。每条分发还包含Status如Deployed、PriceClass、Enabled、HttpVersion等字段详见下方测试桩的定义。GetDistributionConfig UpdateDistribution带并发保护的更新def update_distribution(self): distribution_id input( This script updates the comment for a CloudFront distribution.\n Enter a CloudFront distribution ID: ) distribution_config_response self.cloudfront_client.get_distribution_config( Iddistribution_id ) distribution_config distribution_config_response[DistributionConfig] distribution_etag distribution_config_response[ETag] distribution_config[Comment] input( f\nThe current comment for distribution {distribution_id} is f{distribution_config[Comment]}.\n fEnter a new comment: ) self.cloudfront_client.update_distribution( DistributionConfigdistribution_config, Iddistribution_id, IfMatchdistribution_etag, ) print(Done!)这是本示例最有价值的部分完整演示了 CloudFront 分发更新的**读-改-写read-modify-write**流程读取现有配置get_distribution_config(Id...)返回完整的DistributionConfig结构体以及与之配套的ETag。CloudFront 分发的配置是强类型、全量提交的——update_distribution不接受部分字段补丁而是要求提交完整的DistributionConfig。本地修改仅对目标字段Comment做局部改动其余字段原样保留避免覆盖丢失其他配置。乐观并发控制update_distribution的IfMatch参数携带先前拿到的 ETag。CloudFront 会比较该值与服务端当前版本若在此期间分发被其他操作修改ETag 变化请求会被拒绝并返回PreconditionFailed412防止最后写入覆盖先写的竞态问题。这正是 ETag 机制的核心价值——它保证了并发更新下的数据一致性。需要注意更新分发是异步生效的请求成功后分发进入InProgress状态配置变更需要一定时间才会在全域边缘节点完成部署。单元测试用 Stubber 零成本验证行为测试原理仓库为 CloudFront 准备了专属测试桩 cloudfront_stubber.py其设计基于 botocore Stubber在单元测试模式下stub_list_distributions、stub_get_distribution_config、stub_update_distribution会拦截 Boto3 客户端调用并返回预设响应请求不发送到 AWS也不会产生任何费用而当通过USE_AWS等机制切换为真实调用时桩函数自动透传passthrough。这一开关由 common.py 中的make_stubberfixture 统一管理。测试用例解读测试文件位于 test/test_distributions.py使用 conftest.py 通过sys.path.append(../..)引入公共测试工具。test_list_distributions用pytest.mark.parametrize对error_code参数化None与TestException两种场景分别验证正常路径与异常路径pytest.mark.parametrize(error_code, [None, TestException]) def test_list_distributions(make_stubber, error_code): cloudfront_client boto3.client(cloudfront) cloudfront_stubber make_stubber(cloudfront_client) cloudfront CloudFrontWrapper(cloudfront_client) distribs [ { name: fdistrib-name-{index}, id: fdistrib-{index}, cert_source: acm, cert: Hi, Im a certificate!, } for index in range(3) ] cloudfront_stubber.stub_list_distributions(distribs, error_codeerror_code) if error_code is None: cloudfront.list_distributions() else: with pytest.raises(ClientError) as exc_info: cloudfront.list_distributions() assert exc_info.value.response[Error][Code] error_codetest_update_distribution用monkeypatch替换builtins.input把交互输入替换为预设的[test-id, comment]从而在无人工干预下走完整条读-改-写链路inputs [test-id, comment] monkeypatch.setattr(builtins.input, lambda x: inputs.pop(0)) cloudfront_stubber.stub_get_distribution_config(distrib_id, comment, etag) cloudfront_stubber.stub_update_distribution( distrib_id, comment, etag, error_codeerror_code )测试桩的预期参数校验cloudfront_stubber.py 中每个 stub 函数都定义了expected_paramsStubber 会校验实际请求参数是否与预期一致stub_list_distributions构造含DistributionList的完整响应其中每个Items条目覆盖了ARN、Status、Origins、DefaultCacheBehavior、PriceClass、Enabled、Restrictions、ViewerCertificate、Staging等字段可见一个分发对象实际包含的配置维度stub_get_distribution_config校验请求参数{Id: distrib_id}返回DistributionConfig含CallerReference、Origins、DefaultCacheBehavior、Enabled、Comment与ETagstub_update_distribution校验请求参数必须同时包含Id、完整的DistributionConfig和IfMatchetag——这从测试层印证了更新必须全量配置 ETag 并发保护的 API 契约。运行测试在 python/README.md 的测试章节中单元测试统一通过排除integ标记运行python -m pytest -m not integ在示例目录下执行即可验证全部单元测试。集成测试真实 AWS 调用则通过包含integ标记运行会创建/销毁真实资源并产生费用需谨慎操作。关键设计要点总结全量配置提交CloudFront 的update_distribution要求提交完整DistributionConfig因此正确的模式永远是先get_distribution_config取出、局部修改、再整体提交绝不能凭记忆手工构造配置字典。ETag 乐观锁IfMatch参数携带的 ETag 是并发安全的基石更新前必须保留get_distribution_config返回的 ETag否则在并发场景下可能发生静默覆盖。客户端注入便于测试CloudFrontWrapper接受外部传入客户端配合仓库统一的 Stubber 机制可以在不触碰 AWS 的情况下覆盖正常与异常两条路径。交互式脚本示例通过input()驱动流程直接运行时需要人工输入自动化测试则用monkeypatch模拟输入验证同样的逻辑。延伸阅读本示例依赖的通用测试基础设施python/test_tools/fixtures/common.pymake_stubberfixture 与错误注入机制与 python/test_tools/stubber_factory.pyPython 全量示例的安装、运行、测试与 Docker 容器说明python/README.mdCloudFront 分发的完整字段定义可在 Boto3 的cloudfront服务参考中找到Distribution、DistributionConfig、ViewerCertificate等类型建议在编码时结合查阅。本文基于 aws-doc-sdk-examples 仓库中的 cloudfront README 及其配套源码编写示例代码遵循 Apache-2.0 许可。运行示例与测试前请务必确认你的 AWS 凭据配置正确并了解可能产生的账户费用。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for PythonBoto3管理 Amazon EC2示例代码全指南使用 AWS SDK for PythonBoto3管理 Amazon EC2示例代码全指南 本文围绕 AWS Code Examples 仓库中 pyt示例工程教程后端AWS SDK for Python (Boto3) 代码示例详解与使用指南AWS SDK for Python Boto3 代码示例详解与使用指南 前言 AWS SDK for PythonBoto3是AWS官方提供的Python示例工程教程后端IoT-For-Beginners 实战用 Raspberry Pi 与 Grove 继电器实现基于土壤湿度的自动浇水IoT For Beginners 实战用 Raspberry Pi 与 Grove 继电器实现基于土壤湿度的自动浇水 本篇技术指南聚焦于 Microsoft示例工程教程后端上一篇炉石传说HsMod插件55项功能免费增强你的游戏体验下一篇3分钟上手MASTG合规检查工具从安装到实战的安全测试加速指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

cryptography 异常体系详解:UnsupportedAlgorithm、AlreadyFinalized 等内置异常的使用与源码剖析
cryptography 异常体系详解:UnsupportedAlgorithm、AlreadyFinalized 等内置异常的使用与源码剖析

密码学 【免费下载链接】cryptography cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. 项目地址: https://gitcode.com/gh_mirrors/cr/cryptography 点击查看 免费下载 cryptography 是面向 Python 开… · 2026/9/27 21:23:03

OptiScaler:不換显卡 5 步换掉游戏里的超分技术,再开上帧生成
OptiScaler:不換显卡 5 步换掉游戏里的超分技术,再开上帧生成

OptiScaler:不換显卡 5 步换掉游戏里的超分技术,再开上帧生成 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeFG on non-FG titles.… · 2026/9/27 21:23:03

网站开发三步避坑:源码下载后,改需求不再拖一周
网站开发三步避坑:源码下载后,改需求不再拖一周

网站开发三步避坑:源码下载后,改需求不再拖一周 昨天刚被湖北襄阳的一个甲方兄弟吐槽,说找建站公司改个产品详情页的布局,对方竟拖了一周还没动静。他气得直接要求【源码下载】,想自己找人改。这场景太典型了,很多老板觉得建站就是交钱等图,殊不知没有… · 2026/9/27 21:23:03

PaddleGAN First Order Motion 图像动画完全指南:人脸表情/动作迁移、多人脸驱动、模型压缩与部署实战
PaddleGAN First Order Motion 图像动画完全指南:人脸表情/动作迁移、多人脸驱动、模型压缩与部署实战

人工智能深度学习计算机视觉媒体生成视频处理图像处理 【免费下载链接】PaddleGAN PaddlePaddle GAN library, including lots of interesting applications like First-Order motion transfer, Wav2Lip, picture repair, image editing, photo2cartoon, image style transfer,… · 2026/9/27 21:59:26

新手入门:解决做网站打开图片慢的3个狠招
新手入门:解决做网站打开图片慢的3个狠招

新手入门:解决做网站打开图片慢的3个狠招 模板网站确实好看,但真上线一测,图片加载慢得让人想砸键盘。这是很多新手入门建站时最容易踩的坑。明明网速不慢,浏览器转圈圈就是转不完,用户等不及直接关页走了。… · 2026/9/27 21:59:26

【项目编号:project38076】牙科门诊数字化怎么做?SSM 牙得康牙科医院管理系统把咨询、预约、病历和库存串起来从患者第一次进入系统,到医护人员完成诊疗记录,再到药品与器材库存管理,业务链条
【项目编号:project38076】牙科门诊数字化怎么做?SSM 牙得康牙科医院管理系统把咨询、预约、病历和库存串起来从患者第一次进入系统,到医护人员完成诊疗记录,再到药品与器材库存管理,业务链条

DENTAL DIGITAL CLINIC牙科门诊数字化怎么做?SSM 牙得康牙科医院管理系统把咨询、预约、病历和库存串起来从患者第一次进入系统,到医护人员完成诊疗记录,再到药品与器材库存管理,业务链条完整落地。#SSM #牙科医院 #诊疗管理… · 2026/9/27 21:59:26

如何使用 Highcharts API 创建动态图表与探索高级功能
如何使用 Highcharts API 创建动态图表与探索高级功能

创建互动性强且视觉效果出色的数据可视化图表能够显著提升用户体验。动态图表支持实时更新,这对于以数据为驱动的应用程序来说非常重要。通过利用强大的可视化库,你可以将这些图表无缝集成到你的网页项目中。本文将重点介绍如何高效实现这一目标&#xf… · 2026/9/27 21:59:26

外贸独立站把 LCP 从 4.2 秒压到 1.8 秒的 60 天:收录、排名与询盘数据对照
外贸独立站把 LCP 从 4.2 秒压到 1.8 秒的 60 天:收录、排名与询盘数据对照

外贸独立站把 LCP 从 4.2 秒压到 1.8 秒的 60 天:收录、排名与询盘数据对照 TL;DR(太长不看) LCP 4.2 → 1.8 秒:60 天四个关键动作完成。图片压缩:WebP/AVIF 转换,hero 图 3.8 MB → 86 KB。脚本按需加载… · 2026/9/27 21:59:26

napi-rs `create-npm-dirs` 命令完全指南:为多平台一键生成 npm 发布包目录
napi-rs `create-npm-dirs` 命令完全指南:为多平台一键生成 npm 发布包目录

开发工具后端 【免费下载链接】napi-rs A framework for building compiled Node.js add-ons in Rust via Node-API 项目地址: https://gitcode.com/gh_mirrors/na/napi-rs 点击查看 免费下载 napi create-npm-dirs 是 napi-rs CLI(napi-rs/cli&#xf… · 2026/9/27 21:59:19

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码