ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用 aws_cloudfront_distribution 数据源读取 CloudFront 分发配置

使用 aws_cloudfront_distribution 数据源读取 CloudFront 分发配置 使用 aws_cloudfront_distribution 数据源读取 CloudFront 分发配置【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_cloudfront_distribution是 Terraform AWS Provider 提供的数据源Data Source用于按分发 ID 读取现有 CloudFront Web 分发的完整配置信息。本文将基于 website/docs/d/cloudfront_distribution.html.markdown 文档结合仓库内 distribution_data_source.go 的实现源码与 distribution_data_source_test.go 的验收测试完整讲解其用法、全部导出属性及底层实现原理帮助你在 Terraform 配置中安全复用已有分发信息如域名、ARN、Route 53 托管区 ID 等。数据源概述数据源与资源Resource不同资源负责创建、更新、销毁云端对象而数据源只负责读取已存在对象的信息供当前 Terraform 配置引用。aws_cloudfront_distribution数据源的作用就是读取一个已经存在的 CloudFront 分发Distribution并导出其域名、状态、ETag、ARN、WAF ACL 等属性供其他资源或输出值使用。该数据源的核心价值在于当分发不是由当前 Terraform 配置管理例如由控制台、其他账号或历史配置创建时你仍然可以通过它获得分发的关键信息并安全地与其他资源如 Route 53 别名记录联动而无需将分发纳入 Terraform 管理范围。基本用法数据源的基本配置极其简单只需提供分发的 IDdata aws_cloudfront_distribution test { id EDFDVBD632BHDS5 }其中id是分发标识符Distribution ID形如EDFDVBD632BHDS5。该 ID 可以在 AWS 控制台的 CloudFront 分发详情页中找到也可以从aws_cloudfront_distribution资源的id属性直接引用。实际使用时更常见的做法是先定义分发资源再用数据源读取它的完整信息resource aws_cloudfront_distribution main { # ... 分发配置 ... } data aws_cloudfront_distribution main { id aws_cloudfront_distribution.main.id } output distribution_domain { value data.aws_cloudfront_distribution.main.domain_name }参数说明Argument Reference该数据源支持以下参数参数类型必填说明idstring是分发标识符例如EDFDVBD632BHDS5。数据源将据此调用 AWS API 查询对应分发从源码看id是数据源 schema 中唯一一个Required字段其余属性均为Computed只读定义见 distribution_data_source.go。属性参考Attribute Reference数据源除了返回上述参数外还导出以下属性均为计算属性只读属性类型说明idstring分发标识符例如EDFDVBD632BHDS5aliasesset(string)分发的 CNAME备用域名列表若无备用域名则为空anycast_ip_list_idstring与分发关联的 Anycast 静态 IP 列表 ID如有arnstring分发的 ARN例如arn:aws:cloudfront::123456789012:distribution/EDFDVBD632BHDS5其中123456789012为你的 AWS 账号 IDstatusstring分发当前状态若为Deployed表示分发信息已完全传播至整个 Amazon CloudFront 系统domain_namestring分发对应的域名例如d604721fxaaqy9.cloudfront.netlast_modified_timestring分发最后修改的日期和时间in_progress_validation_batchesnumber当前正在进行中的失效invalidation批次数量etagstring分发信息的当前版本号用于并发控制例如E2QWRUHAPOMQZLhosted_zone_idstringCloudFront 在 Route 53 中使用的托管区 ID用于配置 [Alias Resource Record Set]该属性是区域Z2FDTNDATAQYW2的别名web_acl_idstring与分发关联的 AWS WAF Web ACL 的 ID文档未列出但源码中存在的属性除文档列出的属性外源码 schema 中还定义了两个计算属性供引用时使用enabledbool分发是否处于启用状态直接映射 AWS API 返回的DistributionConfig.Enabledtagsmap分发的标签集合通过内部tftags.TagsSchemaComputed()定义仅读取、不写回。上述属性同样可以在data.aws_cloudfront_distribution.xxx.enabled、data.aws_cloudfront_distribution.xxx.tags形式引用完整 schema 见 distribution_data_source.go。源码实现剖析读取流程数据源的读取逻辑在dataSourceDistributionRead中实现核心流程如下见 distribution_data_source.go从 meta 中获取 CloudFront 客户端连接读取参数id调用findDistributionByID查询分发详情查询出错时返回带上下文错误信息的诊断结果reading CloudFront Distribution (%s)查询成功后将 API 返回值逐一写入各属性aliases、anycast_ip_list_id、arn、domain_name、enabled、etag、hosted_zone_id、in_progress_validation_batches、last_modified_time、status、web_acl_id。底层 API 调用与错误处理findDistributionByID封装了对 AWS 的GetDistributionAPI 调用其实现位于 distribution.go构造GetDistributionInput{Id: ...}请求若 AWS 返回NoSuchDistribution错误则转换为retry.NotFoundError供上层统一按不存在处理若返回结果为空output、Distribution或DistributionConfig为 nil则返回tfresource.NewEmptyResultError()否则返回原始查询结果。hosted_zone_id 的分区差异hosted_zone_id并非来自 API 返回值而是由客户端方法CloudFrontDistributionHostedZoneID根据当前 AWS 分区计算得出见 awsclient.go标准分区aws返回Z2FDTNDATAQYW2中国分区aws-cn返回Z3RFFRIM2A3IF5。因此数据源返回的hosted_zone_id会自动适配你所配置的 AWS 分区用于 Route 53 别名记录时无需手工区分区域。测试验证仓库中对应的验收测试为TestAccCloudFrontDistributionDataSource_basic见 distribution_data_source_test.go。该测试的验证要点包括先创建一个aws_cloudfront_distribution资源再通过数据源读取同一分发使用TestCheckResourceAttrPair将数据源的aliases.#、anycast_ip_list_id、arn、domain_name、etag、hosted_zone_id、in_progress_validation_batches、last_modified_time、status、web_acl_id属性与资源对应属性逐一比对确保数据源读取结果与资源状态完全一致测试中数据源的配置为id aws_cloudfront_distribution.test.id验证了资源 ID 直接传给数据源这一典型用法。典型实战场景1. 为已有分发配置 Route 53 别名记录将数据源与aws_route53_record配合可以为不受 Terraform 管理的 CloudFront 分发添加自定义域名data aws_cloudfront_distribution existing { id EDFDVBD632BHDS5 } resource aws_route53_record cdn { zone_id aws_route53_zone.main.zone_id name cdn.example.com type A alias { name data.aws_cloudfront_distribution.existing.domain_name zone_id data.aws_cloudfront_distribution.existing.hosted_zone_id evaluate_target_health false } }2. 将分发信息导出为输出值data aws_cloudfront_distribution existing { id var.distribution_id } output distribution_arn { value data.aws_cloudfront_distribution.existing.arn } output distribution_domain { value data.aws_cloudfront_distribution.existing.domain_name }3. 依据分发状态与标签做条件判断data aws_cloudfront_distribution existing { id var.distribution_id } resource aws_cloudwatch_metric_alarm distribution_health { count data.aws_cloudfront_distribution.existing.status Deployed ? 1 : 0 # ... 告警配置 ... }总结aws_cloudfront_distribution数据源是 Terraform 与 CloudFront 集成中读取既有分发信息的标准入口。它只需要一个id参数即可返回域名、ARN、状态、ETag、托管区 ID、WAF ACL 等十余项属性在源码层面其读取逻辑直接封装 AWSGetDistributionAPI并妥善处理了分发不存在与空结果等边界情况同时hosted_zone_id会自动适配 AWS 与 AWS 中国分区。无论是为已有分发配置 Route 53 别名、导出输出值还是基于分发状态进行条件编排该数据源都能让你在不接管分发生命周期的情况下安全地复用其配置信息。如需进一步了解分发的创建与管理可阅读 aws_cloudfront_distribution 资源文档若存在或仓库内 distribution.go 的实现分发的失效操作可参考 create_invalidation_action.go。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进