资讯动态

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

发布时间:2026/9/18 3:36:14 来源:尧图企业网站定制
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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价