
terraform-provider-aws 实战aws_globalaccelerator_accelerator数据源完整指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_globalaccelerator_accelerator是 terraform-provider-aws 中用于查询 AWS Global Accelerator 加速器信息的只读数据源允许你按 ARN 或名称检索已存在的加速器并获取其 DNS 名称、IP 地址集合、流日志配置、Hosted Zone ID 与标签等属性。本文基于 website/docs/d/globalaccelerator_accelerator.html.markdown 文档并结合 accelerator_data_source.go 等源码实现讲清其用法、全部可导出属性及底层查询逻辑帮助你直接在 Route 53 别名记录、安全组、监控告警等场景中引用已有加速器而无需重复创建或硬编码值。数据源能做什么AWS Global Accelerator 通过遍布全球的边缘节点将用户流量就近接入并路由到同一区域或跨区域的多个终端节点如 ALB、NLB、EC2 实例从而降低访问延迟、提升可用性。当你需要把流量转发到已经存在可能是由其他团队、其他 Terraform 状态或控制台创建的加速器时aws_globalaccelerator_accelerator数据源提供了一种只读、可复用的引用方式按arn或name唯一定位加速器读取加速器的静态属性DNS 名称、IP 集、IP 地址类型、启用状态读取加速器的流日志配置attributes块读取加速器的标签tags获取用于配置 Route 53 Alias 记录的hosted_zone_id。该数据源对应管理的资源文档见 website/docs/r/globalaccelerator_accelerator.html.markdown其导出的属性与资源完全一致只是数据源是只读的。Example Usage完整可运行的配置文档给出的最小示例通过变量传入 ARN 或名称variable accelerator_arn { type string default } variable accelerator_name { type string default } data aws_globalaccelerator_accelerator example { arn var.accelerator_arn name var.accelerator_name }注意arn与name均为可选参数但至少应提供其中一个。当两者同时指定时arn具有更高优先级详见下文“底层实现”。实际项目中更常见的做法是与资源联用直接引用资源的输出避免维护变量resource aws_globalaccelerator_accelerator example { name Example ip_address_type IPV4 enabled true } data aws_globalaccelerator_accelerator by_arn { arn aws_globalaccelerator_accelerator.example.arn } data aws_globalaccelerator_accelerator by_name { name aws_globalaccelerator_accelerator.example.name } # 用数据源结果配置 Route 53 Alias 记录指向加速器的 DNS 名称与 Hosted Zone ID resource aws_route53_record example { zone_id Z00000000000000000000 name app.example.com type A alias { name data.aws_globalaccelerator_accelerator.by_arn.dns_name zone_id data.aws_globalaccelerator_accelerator.by_arn.hosted_zone_id evaluate_target_health false } }这种方式既避免了在多个配置中重复书写加速器的 ARN、DNS 名称等敏感/易变信息也保证了引用的一致性。Argument Reference入参说明参数类型必填说明arnstring可选Global Accelerator 加速器的完整 ARNnamestring可选Global Accelerator 加速器的唯一名称注意当arn和name同时指定时arn优先。若两者都未指定数据源将因无法过滤而报“multiple … matched”错误见下文源码分析。关于name的取值约束可参考对应资源源码 accelerator.go 中的校验规则长度 1255仅允许字母、数字和连字符且不能以连字符开头或结尾正则^[0-9A-Za-z-]$。Attribute Reference完整导出属性除了上述两个入参arn、name在数据源中同时以 Computed 形式导出之外数据源还导出以下属性与aws_globalaccelerator_accelerator资源返回的属性完全一致属性类型说明idstring加速器的 ARNdns_namestring加速器的 DNS 名称例如a5d53ff5ee6bca4ce.awsglobalaccelerator.comdual_stack_dns_namestringGlobal Accelerator 为双栈加速器两个 IPv4 与两个 IPv6 静态 IP生成的 DNS 名称例如a1234567890abcdef.dualstack.awsglobalaccelerator.comhosted_zone_idstring可用于配置 Route 53 Alias Resource Record Set 的 Global Accelerator Hosted Zone ID即Z2BJ6XQ5FK7U4Henabledbool加速器是否处于启用状态ip_address_typestringIP 地址类型取值为IPV4或DUAL_STACKip_setslist加速器关联的 IP 地址集合元素包含ip_addressesIP 地址列表与ip_familyIP 族类型两个子属性attributeslist加速器属性块元素包含flow_logs_enabled流日志开关、flow_logs_s3_bucket流日志 S3 桶名启用时必填、flow_logs_s3_prefix流日志对象前缀启用时必填tagsmap加速器上的标签键值对这些属性全部由数据源在读取时动态填充。例如hosted_zone_id并不是从 AWS API 返回而是由 Provider 内部常量GlobalAcceleratorHostedZoneID直接注入见 accelerator_data_source.go 与资源读取逻辑 accelerator.go。典型使用场景流日志与监控data aws_globalaccelerator_accelerator example { arn arn:aws:globalaccelerator::123456789012:accelerator/1234abcd-abcd-1234-abcd-1234abcdefgh } output accelerator_dns { value data.aws_globalaccelerator_accelerator.example.dns_name } output flow_logs_bucket { value data.aws_globalaccelerator_accelerator.example.attributes[0].flow_logs_s3_bucket }attributes中flow_logs_s3_bucket与flow_logs_s3_prefix的长度限制为 0255见 accelerator.go 的校验在引用时无需额外处理。底层实现数据源是如何查到的该数据源采用 terraform-plugin-framework 实现工厂函数newAcceleratorDataSource在 accelerator_data_source.go 中定义并通过FrameworkDataSource(aws_globalaccelerator_accelerator, nameAccelerator)注解注册到服务包参见 service_package_gen.go。其Read方法accelerator_data_source.go的执行链路如下读取配置从 Terraform 配置中解析arn、name。分页列举调用 AWS SDK v2 的NewListAcceleratorsPaginator对ListAccelerators接口分页遍历全部加速器accelerator_data_source.go。客户端过滤在内存中按arn与name逐一比对过滤。注意过滤规则是**“分别独立生效”**——若指定了arn则跳过 ARN 不匹配的项若指定了name则跳过名称不匹配的项accelerator_data_source.go。因此当两者同时指定时实际效果是“同时满足两者”的交集过滤这也解释了为何文档要求“以arn为准”需自行保证两者指向同一加速器。结果唯一性校验0 条匹配报no matching Global Accelerator Accelerator found多条匹配报multiple Global Accelerator Accelerators matched; use additional constraints to reduce matches to a single ...此时需要补充另一个过滤条件如同时传arn与name来收敛结果accelerator_data_source.go。补充属性通过DescribeAcceleratorAttributes查找函数findAcceleratorAttributesByARN见 accelerator.go获取流日志配置通过listTags获取标签并注入常量hosted_zone_idaccelerator_data_source.go。写回状态将id设为加速器 ARN并把全部字段写入 Terraform state。需要指出的是上述列举 过滤的方式意味着该数据源依赖客户端的 IAM 权限能够调用ListAccelerators并且当账号下加速器数量很多时分页次数会相应增加。相比直接DescribeAccelerator按 ARN 查询这是一种“先列举再匹配”的实现选择从源码结构可以推断这是为了同时支持“按名称查询”Global Accelerator API 本身没有按名称描述的接口而设计的。Schema 定义要点数据源 Schemaaccelerator_data_source.go中有几个值得注意的细节arn使用fwtypes.ARNType自定义类型Optional Computed读取后回填ip_sets、attributes使用fwtypes.NewListNestedObjectTypeOf嵌套对象类型与ipSetModel、acceleratorAttributesModel两个 Go struct 对应accelerator_data_source.godns_name、dual_stack_dns_name等字段带有autoflex:,legacy标记配合flex.Flatten实现 API 结构体到 TF 模型的自动扁平化accelerator_data_source.go。测试验证数据源行为如何被保障仓库提供了针对该数据源的完整验收测试 accelerator_data_source_test.go其中TestAccGlobalAcceleratorAcceleratorDataSource_basic同时创建了按 ARN 与按名称两个数据源并逐项断言其输出与资源属性一致attributes.0.flow_logs_enabled、attributes.0.flow_logs_s3_bucket、attributes.0.flow_logs_s3_prefixdns_name、dual_stack_dns_name、enabled、hosted_zone_id、ip_address_type、nameip_sets.#、ip_sets.0.ip_addresses.#、ip_sets.0.ip_addresses.0/1、ip_sets.0.ip_familytags.%标签数量。测试配置accelerator_data_source_test.go展示了数据源与资源的标准组合写法resource aws_globalaccelerator_accelerator test { name tf-acc-test-... attributes { flow_logs_enabled false flow_logs_s3_bucket flow_logs_s3_prefix flow-logs/globalaccelerator/ } tags { Name tf-acc-test-... } } data aws_globalaccelerator_accelerator test_by_arn { arn aws_globalaccelerator_accelerator.test.arn } data aws_globalaccelerator_accelerator test_by_name { name aws_globalaccelerator_accelerator.test.name }这组测试从实现层面印证了文档中“arn与name均可作为过滤条件返回属性与资源一致”的行为承诺。如果你在本地复现可参考 internal/service/globalaccelerator/testdata/tmpl/accelerator_basic.gtpl 中加速器资源的最小配置模板。注意事项与常见错误至少提供一个过滤参数arn、name都为空时数据源会匹配到全部加速器并报multiple ... matched错误。名称全局唯一约束Global Accelerator 的加速器名称在账号内唯一创建资源时name为必填因此单独按名称查询通常即可唯一命中但若担心歧义可以同时传入arn以消除不确定性。hosted_zone_id为固定值该属性来自 Provider 内置常量不需要也不应该从远程状态中猜测直接用数据源导出即可。只读语义数据源不会对加速器做任何创建、修改或删除操作需要管理加速器生命周期时请使用aws_globalaccelerator_accelerator资源资源支持create/update/delete超时均为 30 分钟并支持按 ARN 导入详见 website/docs/r/globalaccelerator_accelerator.html.markdown。小结aws_globalaccelerator_accelerator数据源是把“已存在的 Global Accelerator 加速器”安全接入 Terraform 配置的标准途径。通过本文你应已掌握按arn/name查询加速器的写法与优先级规则dns_name、dual_stack_dns_name、hosted_zone_id、ip_sets、attributes、tags等全部导出属性的含义以及在 Route 53 别名记录等场景中的实际组合用法同时借助 accelerator_data_source.go 源码理解了其“分页列举 客户端过滤 唯一性校验”的底层实现机制便于在遇到“multiple matched”等报错时快速定位根因。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考