
Terraform AWS Provider 数据源 aws_dx_gateway 完全指南按名称检索 Direct Connect 网关【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_dx_gateway是 Terraform AWS Provider 提供的一个数据源Data Source用于按名称查询 AWS Direct Connect 网关Direct Connect Gateway的实时信息并将其以可引用的属性形式注入到 Terraform 配置中。本文以 gateway_data_source.go 的实现为基准系统讲解该数据源的配置参数、导出属性、底层 AWS API 调用链以及与之配套的资源与测试帮助你在 VPC 与本地数据中心互联场景中安全、精准地复用已有网关资源。数据源概览它解决什么问题Direct Connect Gateway 是 AWS Direct Connect 服务中的全局组件用于在同一个区域内关联一个或多个 VPC并与本地网络通过虚拟接口Virtual Interface建立私网或中转网络连接。在 Terraform 配置中网关可能由团队之外的其他管道创建例如由aws_dx_gateway资源创建也可能来自控制台或另一套 IaC 代码此时你并不总能直接引用资源的地址而只知道网关的名称。aws_dx_gateway数据源正是为这种只认名字、不认 ID的场景设计的只需要提供网关名称即可取回网关的 ID、Amazon 侧 ASN、ARN、所属账号 ID 以及标签供其他资源如虚拟接口、网关关联等引用。从源码标记// SDKDataSource(aws_dx_gateway, nameGateway)、// Region(globaltrue)、// Tags可以看出该数据源是全局资源、支持标签读取并且属于 Provider 中 SDKv2 风格的数据源。最小可用配置在原文档 dx_gateway.html.markdown 的基础上完整的最小配置如下data aws_dx_gateway example { name example } output gateway_id { value data.aws_dx_gateway.example.id }将name设置为目标网关的名称后terraform apply或terraform plan即会在读取阶段发起一次对 AWS Direct Connect API 的查询把结果写入状态文件。随后配置中的任意位置都可以通过data.aws_dx_gateway.example.属性引用查询结果。与资源配合的典型用法更常见的做法是数据源与aws_dx_gateway资源协同使用资源负责创建网关数据源按名称读取它既验证了网关确实存在又把读取结果作为其他资源例如虚拟接口的输入resource aws_dx_gateway example { name tf-dxg-example amazon_side_asn 64512 } data aws_dx_gateway example { name aws_dx_gateway.example.name } # 示例将网关 ID 用于中转虚拟接口 # resource aws_dx_transit_virtual_interface example { # dx_gateway_id data.aws_dx_gateway.example.id # ... # }参数参考Argument Reference该数据源支持且仅支持一个必填参数参数必填类型说明name是string要检索的 Direct Connect Gateway 名称在 gateway_data_source.go 的 Schema 定义中name被声明为Required: true其余属性全部为Computed: true意味着它们由 Provider 在读取阶段自动填充不能在配置中手工指定。属性参考Attribute Reference除name之外数据源还会导出以下 5 个属性属性类型说明amazon_side_asnstring连接 Amazon 侧的自治系统号ASN即对端你的网络在 BGP 会话中看到的 ASNarnstring网关的 ARNAmazon Resource Nameidstring网关的 ID形如abcd1234-dcba-5678-be23-cdef9876ab45的 UUIDowner_account_idstring网关所属的 AWS 账号 IDtagsmap(string)分配给网关的标签映射Tag Map属性从何而来源码级解读上述属性并非凭空生成而是来自 gateway_data_source.go 中的dataSourceGatewayRead函数其填充逻辑如下id取自 AWS API 返回的DirectConnectGatewayId同时作为 Terraform 状态中的资源标识d.SetId(...)。amazon_side_asnAWS API 返回的AmazonSideAsn是int64类型源码通过strconv.FormatInt(aws.ToInt64(gateway.AmazonSideAsn), 10)将其转换为字符串后写入状态。arn由 Provider 内部工具函数gatewayARN构造格式为arn:aws:directconnect::账号ID:dx-gateway/网关ID。在 gateway.go 中可以看到它调用c.GlobalARN(ctx, directconnect, dx-gateway/id)这也印证了网关是全局资源// Region(globaltrue)ARN 不携带区域信息。owner_account_id直接取自 AWS API 返回的OwnerAccount字段。tags通过setTagsOut(ctx, gateway.Tags)写入 Provider 的标签读取机制与// Tags注释标记相对应。底层实现原理按名称如何查到一个网关数据源读取的核心逻辑是调用DescribeDirectConnectGatewaysAPI然后对返回的网关列表按名称做精确匹配。在 gateway_data_source.go 中查询请求DescribeDirectConnectGatewaysInput不携带任何过滤条件而是通过一个谓词函数Predicate过滤结果gateway, err : findGateway(ctx, conn, input, func(v *awstypes.DirectConnectGateway) bool { return aws.ToString(v.DirectConnectGatewayName) name })即拉取账号下全部网关再在内存中按DirectConnectGatewayName name精确比对。这一行为有两个值得注意的推论名称必须精确匹配该数据源不做模糊匹配或前缀匹配名称在账号内需唯一——findGateway最终调用tfresource.AssertSingleValueResult(output)如果过滤结果多于一个会返回期望恰好一个结果的报错如果为零个则通过tfresource.SingularDataSourceFindError(Direct Connect Gateway, err)包装为数据源专属的错误信息。分页拉取由 list_pages_gen.go 中的describeDirectConnectGatewaysPages负责它会自动翻页拼接DirectConnectGateways列表后再交给过滤函数处理因此即使账号下网关数量很多也能完整遍历。查询失败的幂等处理当网关不存在时读取不会抛出导致整体失败的致命错误而是通过SingularDataSourceFindError返回明确提示如not found类错误提示你在terraform plan/apply阶段即可发现问题例如名称拼写错误、网关位于其他账号等。深入理解 Amazon 侧 ASN 的取值范围虽然数据源的amazon_side_asn是只读属性但理解其取值范围对配置aws_dx_gateway资源以及核对数据源结果非常有用。在 gateway.go 中资源的amazon_side_asn参数使用了verify.ValidAmazonSideASN校验函数。根据 validate.go 的实现合法的 Amazon 侧 ASN 为64512 ~ 65534BGP 私用 ASN 范围4200000000 ~ 42949672944 字节 ASN 扩展范围特殊遗留 ASN7224、9059、10124、17493历史遗留的公开 ASN社区 issue #5263 引入兼容处理。如果填入上述范围之外的值如65535、4200000000之前的数terraform plan阶段就会报错。资源文档 dx_gateway.html.markdown资源版 中同样声明了 64,512 到 65,534 或 4,200,000,000 到 4,294,967,294 的范围与源码校验逻辑一致。数据源的amazon_side_asn属性正是以字符串形式返回这个值方便你直接透传给其他资源做一致性核对。如何验证该数据源的行为从测试看语义仓库中的 gateway_data_source_test.go 用验收测试Acceptance Test固化了该数据源的行为是理解其语义的最佳文档。TestAccDirectConnectGatewayDataSource_basic的测试配置testAccGatewayDataSourceConfig_name精心构造了两个名称不同的网关resource aws_dx_gateway wrong { amazon_side_asn rBgpAsn1 name rName-wrong } resource aws_dx_gateway test { amazon_side_asn rBgpAsn name rName tags { key1 value1 } } data aws_dx_gateway test { name aws_dx_gateway.test.name }同时存在名字错误的网关与目标网关正是为了验证数据源仅按名称精确命中目标网关而不会被其他同名或相近名称的网关干扰。测试断言resource.TestCheckResourceAttrPair逐一校验数据源的amazon_side_asn、arn、id、name、owner_account_id、tags与对应资源完全一致覆盖了本文列出的全部导出属性。测试还使用了acctest.RandIntRange(t, 64512, 65534)生成随机的私用 ASN并且amazon_side_asn以字符串形式在数据源与资源之间比对——这与源码中strconv.FormatInt的字符串化处理相呼应。此外gateway_identity_gen_test.go 中的 Identity 测试验证了aws_dx_gateway资源而非数据源的id可被用作 Terraform v1.12 的import块身份标识数据源读取的id与之同源均来自DirectConnectGatewayId。常见使用场景小结跨配置引用已存在的网关只知道网关名称、不知道 ID 时用数据源按名称查询并引用id、amazon_side_asn等属性。配合虚拟接口/网关关联将数据源的id传给aws_dx_transit_virtual_interface、aws_dx_private_virtual_interface或网关关联类资源避免硬编码 UUID。标签驱动的基础设施治理通过tags属性读取网关标签用于条件判断或在输出中展示归属信息。一致性校验将数据源返回的amazon_side_asn与期望值对比或在模块输出中暴露网关 ARN 供 IAM 策略使用。相关文档与源码导航数据源文档website/docs/d/dx_gateway.html.markdown资源文档创建/导入网关website/docs/r/dx_gateway.html.markdown数据源实现gateway_data_source.go资源实现与 ASN 校验引用gateway.goASN 校验逻辑internal/verify/validate.go分页查询实现list_pages_gen.go数据源验收测试gateway_data_source_test.go资源 Identity/Import 测试gateway_identity_gen_test.go【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考