Terraform AWS Provider 数据源实战:使用 aws_cloudfront_origin_access_identity 读取 CloudFront 源访问身份

发布时间:2026/11/4 23:32:38

Terraform AWS Provider 数据源实战:使用 aws_cloudfront_origin_access_identity 读取 CloudFront 源访问身份 Terraform AWS Provider 数据源实战使用 aws_cloudfront_origin_access_identity 读取 CloudFront 源访问身份【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读在 terraform-provider-aws 中aws_cloudfront_origin_access_identity数据源用于按 ID 读取已存在的 Amazon CloudFront Origin Access IdentityOAI信息从而在不重新创建资源的情况下复用其arn、iam_arn、cloudfront_access_identity_path、s3_canonical_user_id等关键属性。本文以官方数据源文档为主体结合仓库源码与配套资源文档完整讲解其参数、导出属性、与aws_cloudfront_distribution及 S3 桶策略的组合用法以及底层实现与测试验证。读完本文你将掌握用一行数据源配置安全引用 OAI 并在 CloudFront 分发与 S3 私有内容授权场景中正确使用的完整方案。数据源概述数据源Data Source在 Terraform 中用于读取而非管理外部已有资源。aws_cloudfront_origin_access_identity即属于此类你只需要提供 OAI 的 ID形如E1ZAKK699EOLALProvider 就会调用 CloudFront 的GetCloudFrontOriginAccessIdentityAPI把该 OAI 的 ARN、IAM ARN、S3 规范用户 ID、访问路径等信息一次性读回并暴露为可引用的导出属性。从仓库源码看该数据源在 internal/service/cloudfront/origin_access_identity_data_source.go 中通过SDKDataSource(aws_cloudfront_origin_access_identity)注解注册属于 SDK v2 风格的资源定义核心读取逻辑由dataSourceOriginAccessIdentityRead实现见 同文件 L63-L85。基本用法官方文档给出的最小示例非常简洁只需要传入id一个必填参数。data aws_cloudfront_origin_access_identity example { id E1ZAKK699EOLAL }在实际项目中更常见的做法是与aws_cloudfront_origin_access_identity资源配合使用由资源创建 OAI再用数据源读取其属性。仓库中的验收测试 origin_access_identity_data_source_test.go 就展示了这一模式resource aws_cloudfront_origin_access_identity test { comment some comment } data aws_cloudfront_origin_access_identity test { id aws_cloudfront_origin_access_identity.test.id }这样既享受了资源的创建/更新/删除生命周期管理又通过数据源拿到标准化的属性集合便于在多个资源之间复用。Argument Reference参数说明该数据源仅支持一个参数参数是否必填说明idRequired源访问身份的标识符identifier例如E1ZAKK699EOLAL在源码层面id被定义为TypeString且Required: true见 origin_access_identity_data_source.go L50-L53。读取时Provider 会执行id : d.Get(names.AttrID).(string) output, err : findOriginAccessIdentityByID(ctx, conn, id)findOriginAccessIdentityByID位于 internal/service/cloudfront/origin_access_identity.go L161-L183其行为要点包括构造GetCloudFrontOriginAccessIdentityInput{Id: ...}调用 AWS SDK若服务返回NoSuchCloudFrontOriginAccessIdentity会被包装为retry.NotFoundError便于上层做未找到判断若返回内容为空output、CloudFrontOriginAccessIdentity或其CloudFrontOriginAccessIdentityConfig为 nil则返回tfresource.NewEmptyResultError()避免空指针访问。从源码结构可以看出该数据源对ID 不存在与API 返回空两类异常都做了显式处理错误信息形如reading CloudFront Origin Access Identity (%s): %s。Attribute Reference导出属性详解除id外数据源会导出以下属性与aws_cloudfront_origin_access_identity资源的导出属性一一对应详见 origin_access_identity.go L38-L71属性类型说明arnstring源访问身份的 ARNcaller_referencestringCloudFront 内部使用的调用者引用值用于支持未来对 OAI 的更新cloudfront_access_identity_pathstring供 CloudFront 使用的完整路径快捷写法见下文commentstringOAI 的可选备注信息etagstringOAI 信息的当前版本号例如E2QWRUHAPOMQZLiam_arnstring预生成的、可直接用于 S3 桶策略的 ARNs3_canonical_user_idstringOAI 对应的 Amazon S3 规范用户 IDcanonical user ID各属性的生成逻辑源码级在dataSourceOriginAccessIdentityReadorigin_access_identity_data_source.go L63-L85中各导出属性并非全部来自 API 响应部分是由 Provider 本地拼接生成的arn调用originAccessIdentityARN见 origin_access_identity.go L200-L203生成形如arn:aws:cloudfront::account:origin-access-identity/id的全局 ARNcloudfront_access_identity_path直接拼接为字符串常量origin-access-identity/cloudfront/ id。这正是 CloudFront 分发配置中s3_origin_config需要的特殊路径前缀iam_arn调用originAccessIdentityIAMUserARN见 origin_access_identity.go L205-L208生成arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity id其中iam服务、账户段固定为cloudfrontcaller_reference、comment直接取自 API 返回的CloudFrontOriginAccessIdentityConfigetag取自GetCloudFrontOriginAccessIdentityOutput.ETags3_canonical_user_id取自CloudFrontOriginAccessIdentity.S3CanonicalUserId。对应地资源侧测试 origin_access_identity_test.go L36-L45 用正则验证了这些属性的格式例如s3_canonical_user_id以^[0-9a-z]开头、cloudfront_access_identity_path匹配^origin-access-identity/cloudfront/[0-9A-Z]、iam_arn匹配^arn:partition:iam::cloudfront:user/CloudFront Origin Access Identity [0-9A-Z]可作为理解各字段格式的权威依据。实战组合一在 CloudFront 分发中引用 OAI创建 OAI 的主要目的是让 CloudFront 通过该身份访问 S3 桶中的私有内容。在aws_cloudfront_distribution资源的s3_origin_config结构中origin_access_identity字段要求传入带origin-access-identity/cloudfront/前缀的完整路径——这正是cloudfront_access_identity_path属性存在的意义省去了手动拼接的麻烦。data aws_cloudfront_origin_access_identity example { id E1ZAKK699EOLAL } resource aws_cloudfront_distribution example { # ... other configuration ... origin { domain_name aws_s3_bucket.example.bucket_regional_domain_name origin_id myS3Origin s3_origin_config { origin_access_identity data.aws_cloudfront_origin_access_identity.example.cloudfront_access_identity_path } } # ... other configuration ... }在 website/docs/r/cloudfront_distribution.html.markdown 的官方示例中同一个 OAI 甚至可以同时被 origin group 的两个成员primaryS3与failoverS3引用可见cloudfront_access_identity_path是可多处复用的标准配置值。数据源化之后即使 OAI 由其他流程或另一个 Terraform 配置创建你也能安全地拿到这条路径。实战组合二用 iam_arn 配置 S3 桶策略避免漂移拿到 OAI 后还需要在 S3 桶策略中授予其读取权限才能让 CloudFront 访问桶内对象。官方资源文档 website/docs/r/cloudfront_origin_access_identity.html.markdown 特别提醒了一个坑AWS API 可能会把用s3_canonical_user_idCanonicalUser主体验写的策略自动改写成AWSIAM ARN 主体系导致 Terraform 反复出现无意义的 diff。因此推荐直接使用iam_arndata aws_cloudfront_origin_access_identity example { id E1ZAKK699EOLAL } data aws_iam_policy_document s3_policy { statement { actions [s3:GetObject] resources [${aws_s3_bucket.example.arn}/*] principals { type AWS identifiers [data.aws_cloudfront_origin_access_identity.example.iam_arn] } } } resource aws_s3_bucket_policy example { bucket aws_s3_bucket.example.id policy data.aws_iam_policy_document.s3_policy.json }要点解读actions使用s3:GetObject仅开放对象读取resources限定为桶内全部对象arn/*principals的type固定为AWSidentifiers传入 OAI 的iam_arn即arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity id形式策略通过aws_iam_policy_document生成 JSON 后交给aws_s3_bucket_policy挂载。这一写法同时规避了s3_canonical_user_id被 API 规范化改写导致的漂移问题。若你确实需要s3_canonical_user_id例如在非桶策略场景下按规范用户 ID 授权数据源同样提供该属性可配合CanonicalUser主体验证使用。底层原理与注意事项读取流程与错误处理数据源的完整调用链为dataSourceOriginAccessIdentityRead→findOriginAccessIdentityByID→GetCloudFrontOriginAccessIdentityAWS SDK v2。任何失败都会以diag.Diagnostics形式返回错误文本包含 OAI 的 ID便于排障。测试 origin_access_identity_data_source_test.go L21-L41 通过TestCheckResourceAttrPair逐一断言数据源与资源同名属性完全一致覆盖了arn、iam_arn、comment、caller_reference、s3_canonical_user_id、cloudfront_access_identity_path等字段验证了数据源读取结果的正确性。使用注意事项id一旦填错或对应 OAI 已被删除plan/apply会直接报错NoSuchCloudFrontOriginAccessIdentity会被识别为非 NotFound 的常规错误返回因此在多配置复用场景下优先从aws_cloudfront_origin_access_identity资源输出中引用id避免硬编码若 OAI 由当前配置的aws_cloudfront_origin_access_identity资源创建可直接使用资源属性如aws_cloudfront_origin_access_identity.example.iam_arn数据源更适用于读取他人已建/存量 OAI或需要统一数据接口的场景arn与iam_arn是两类不同用途的 ARNarn用于标识 CloudFront 资源本身iam_arn是特制的 IAM 用户形式 ARN专用于 S3 桶策略Principal两者不可混用若需一次性枚举账户下所有 OAI 并批量获取其iam_arns、s3_canonical_user_ids可进一步查阅aws_cloudfront_origin_access_identities复数数据源其实现见 internal/service/cloudfront/origin_access_identities_data_source.go支持按comments过滤并分页遍历ListCloudFrontOriginAccessIdentities。总结aws_cloudfront_origin_access_identity数据源以极低的配置成本仅id一个必填参数为 Terraform 配置提供了 OAI 的统一信息入口。结合源码可以确认cloudfront_access_identity_path、arn、iam_arn均由 Provider 按 CloudFront 约定格式本地生成其余属性直接取自GetCloudFrontOriginAccessIdentityAPI 响应。把它与aws_cloudfront_distribution的s3_origin_config、以及基于iam_arn的 S3 桶策略配合使用即可完整落地CloudFront 私有 S3 内容的经典架构同时规避桶策略漂移问题。相关文档与源码可继续查阅数据源官方文档website/docs/d/cloudfront_origin_access_identity.html.markdown配套资源文档website/docs/r/cloudfront_origin_access_identity.html.markdown数据源实现internal/service/cloudfront/origin_access_identity_data_source.go资源实现与 ARN 生成internal/service/cloudfront/origin_access_identity.go数据源验收测试internal/service/cloudfront/origin_access_identity_data_source_test.go分发配置示例website/docs/r/cloudfront_distribution.html.markdown【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/3 23:38:48

Python解析Keil uvprojx工程文件实现自动化管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 23:31:52

鸿蒙源码自动化下载工具设计与实现

1. 项目背景与核心价值作为一名长期跟踪鸿蒙生态发展的开发者,我深刻体会到获取鸿蒙源码的痛点。官方代码库包含数十个分支版本,从LTS长期支持版到每日构建的nightly版本,手动逐个下载不仅耗时耗力,还容易出错。这个自动化脚本正是…

2026/11/4 23:31:52

Git推送ERR 307错误解析与解决方案

1. 问题现象与初步诊断遇到Git推送时出现ERR 307错误,这通常表示服务器端对请求进行了临时重定向。不同于常见的网络错误或权限问题,307状态码的特殊性在于它要求客户端保持原请求方法(如POST)进行重定向。在Git操作场景下&#x…

2026/11/4 23:31:52

ArcGIS红叉与无法验证登录信息五层排查指南

1. 先把“红叉”翻译成人话:症状分类与影响面判断ArcGIS 界面里那个红色小叉号,是很多人入门阶段最不想见到的图标。它不像报错弹窗那样给你一串英文,也不像崩溃那样干脆利落,它就安安静静地挂在那儿,提示你“某个在线…

2026/11/4 23:31:52

ArcGIS Pro 小红叉与无法验证登录信息排查指南

周五下午快下班的时候,一位同事把笔记本推到我工位上,屏幕上 ArcGIS Pro 右上角挂着一个刺眼的红色小叉,鼠标悬停提示“无法验证登录信息”,左侧目录里的在线底图、影像服务和协作项目全部灰掉,可本地那几份 shapefile…

2026/11/4 23:31:52

OpenClaw+千问3.5-9B智能体24小时长稳压测实战

1. 先搞清楚这场压测到底在测什么标题里那几个词——“OpenClaw”“千问3.5-9B”“持续运行24小时”——听起来像是某种硬核跑分,但真正动手之前,你得先问自己一个问题:我要的结论是什么?是“这个组合能不能跑”,还是“…

2026/11/4 23:26:52

微波通信核心技术解析与应用实践

1. 微波通信基础概念解析微波通信作为现代无线通信的重要组成部分,已经渗透到我们日常生活的方方面面。从手机基站到卫星电视,从雷达系统到高速公路ETC,这些常见应用背后都离不开微波技术的支持。微波通常指频率在300MHz至300GHz之间的电磁波…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑