使用 Terraform AWS Provider 查询 EMR on EKS 虚拟集群:aws_emrcontainers_virtual_cluster 数据源完全指南 使用 Terraform AWS Provider 查询 EMR on EKS 虚拟集群aws_emrcontainers_virtual_cluster 数据源完全指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本篇指南围绕 terraform-provider-aws 中的aws_emrcontainers_virtual_cluster数据源展开讲解如何按虚拟集群 ID 检索 Amazon EMR ContainersEMR on EKS虚拟集群的元数据信息。读完本文你将掌握该数据源的完整参数与导出属性、底层 API 调用原理以及如何将查询结果与资源管理、标签策略和状态感知场景相结合。数据源概览aws_emrcontainers_virtual_cluster是 terraform-provider-aws 中 EMR Containers 服务internal/service/emrcontainers提供的数据源用于读取而非创建一个已存在的 EMR Containers 虚拟集群的运行时信息。在 EMR on EKS 架构中虚拟集群Virtual Cluster是一个逻辑容器它指向一个底层 Amazon EKS 集群的某个 Kubernetes 命名空间EMR Spark 作业在其中调度运行。当基础设施代码需要根据集群状态、名称或 ARN 决定后续行为例如条件化创建作业模板、生成 IAM 策略或输出运维信息时数据源就是获取这些只读信息的标准方式。从服务注册代码 internal/service/emrcontainers/service_package_gen.go 可以看到该数据源在 Provider 的 SDK 数据源列表中注册TypeName 为aws_emrcontainers_virtual_cluster名称 Virtual Cluster并支持标签Tags读取。基础用法示例数据源的核心用法非常简单只需提供虚拟集群 ID 即可完成查询。以下示例完整继承自官方文档并加以注释data aws_emrcontainers_virtual_cluster example { virtual_cluster_id example id # 替换为实际的虚拟集群 ID如 a1b2c3d4e5f6g7h8i9j10k11l } output name { value data.aws_emrcontainers_virtual_cluster.example.name } output arn { value data.aws_emrcontainers_virtual_cluster.example.arn }实际使用中virtual_cluster_id通常不需要硬编码而是引用由aws_emrcontainers_virtual_cluster资源创建出的集群 ID。仓库内的数据源测试用例 internal/service/emrcontainers/virtual_cluster_data_source_test.go 展示了这一标准组合方式data aws_emrcontainers_virtual_cluster test { virtual_cluster_id aws_emrcontainers_virtual_cluster.test.id }这种写法让数据源与资源解耦又联动资源负责声明式管理集群生命周期数据源负责在任何需要只读信息的场景如同一个配置中的其他模块或输出中安全引用其最新状态。参数Argument说明该数据源支持以下参数参数必填说明virtual_cluster_id是要查询的虚拟集群 ID也是数据源的唯一必填参数region否指定查询所用的 AWS 区域。默认使用 Provider 配置中设置的区域当集群位于与默认区域不同的区域时需要显式指定其中virtual_cluster_id在源码中被定义为TypeString Required见 internal/service/emrcontainers/virtual_cluster_data_source.go它直接作为DescribeVirtualClusterAPI 请求的Id字段传入。需要特别指出的是在 Provider 的官方文档中region参数的意义是该数据源将在此区域被托管即所有底层 API 请求都发往该区域端点Provider 还会通过服务包生成代码对传入区域与客户端默认区域进行一致性校验详见 service_package_gen.go 中的区域覆盖逻辑。导出属性Attribute详解数据源在查询成功后会将 API 返回的虚拟集群对象展开为以下属性属性类型说明idstring虚拟集群的 IDnamestring虚拟集群的名称arnstring虚拟集群的 ARNcontainer_providerlist底层容器提供方EKS 集群信息嵌套结构见下created_atstring集群创建时间的 Unix 纪元时间戳秒statestring集群状态取值为RUNNING、TERMINATING、TERMINATED、ARRESTED之一tagsmap资源的键值标签映射container_provider 嵌套结构container_provider是本次查询最具信息量的嵌套属性其层级如下container_provider ├── id # 运行该 EMR Containers 集群的容器提供方EKS 集群名称 ├── type # 容器提供方类型如 EKS └── info └── eks_info └── namespace # EMR Containers 集群运行所在的 Kubernetes 命名空间这些字段与创建资源时的container_provider配置块一一对应可对照资源文档 website/docs/r/emrcontainers_virtual_cluster.html.markdown因此数据源非常适合用来验证集群实际绑定在哪个 EKS 集群、哪个命名空间上。从源码实现看container_provider在 virtual_cluster_data_source.go 中被定义为三层嵌套的TypeList Computed读取时通过flattenContainerProvider→flattenContainerInfo→flattenEKSInfo三个扁平化函数定义于 internal/service/emrcontainers/virtual_cluster.go将 AWS SDK 的ContainerProvider、ContainerInfo与EksInfo结构逐层转换为 Terraform 状态中的嵌套列表。实际取值示例假设集群绑定到 EKS 集群my-eks-cluster的default命名空间那么查询结果中的关键属性大致如下id a1b2c3d4e5f6g7h8i9j10k11l name example arn arn:aws:emr-containers:us-east-1:123456789012:/virtualclusters/a1b2c3d4e5f6g7h8i9j10k11l state RUNNING created_at 1710000000 container_provider [ { id my-eks-cluster type EKS info [ { eks_info [ { namespace default } ] } ] } ]底层原理数据源读取如何工作数据源的定义与读取逻辑全部集中在 internal/service/emrcontainers/virtual_cluster_data_source.go入口注册dataSourceVirtualCluster()返回一个schema.Resource仅实现ReadWithoutTimeout数据源只读无创建/更新/删除。Schema 中所有属性除virtual_cluster_id外均为Computed。发起查询dataSourceVirtualClusterRead先从 Provider 上下文中取出 EMR Containers API 客户端conns.AWSClient.EMRContainersClient读取virtual_cluster_id然后调用findVirtualClusterByID。API 调用链findVirtualClusterByID构造DescribeVirtualClusterInput并调用DescribeVirtualClusterAPI见 virtual_cluster.go。该函数对ResourceNotFoundException返回retry.NotFoundError对空结果返回tfresource.NewEmptyResultError并会额外检查若集群状态为TERMINATED同样视为未找到——这意味着已终止的集群通过数据源查询会直接报错而不是返回一个已死亡集群的残留信息。写回状态查询成功后d.SetId将集群 ID 设为数据源的 ID再依次填充arn、container_provider、created_at、name、state等属性最后通过setTagsOut输出标签。标签处理数据源声明了// Tags注解Schema 中tags使用tftags.TagsSchemaComputed()标签通过 Provider 的标签框架internal/tags统一输出与资源的tags_all语义保持一致。常见组合场景场景一与虚拟集群资源联动并输出关键信息resource aws_emrcontainers_virtual_cluster example { container_provider { id aws_eks_cluster.example.name type EKS info { eks_info { namespace default } } } name example } data aws_emrcontainers_virtual_cluster example { virtual_cluster_id aws_emrcontainers_virtual_cluster.example.id } output cluster_state { value data.aws_emrcontainers_virtual_cluster.example.state } output cluster_namespace { value data.aws_emrcontainers_virtual_cluster.example.container_provider[0].info[0].eks_info[0].namespace }场景二按状态条件化下游资源state属性可用于条件表达式例如仅在集群处于RUNNING时才创建下游资源resource aws_emrcontainers_job_template example { count data.aws_emrcontainers_virtual_cluster.example.state RUNNING ? 1 : 0 name example job_template_data { execution_role_arn aws_iam_role.example.arn release_label emr-6.10.0-latest job_driver { spark_submit_job_driver { entry_point s3://example/example.py } } } }场景三结合标签策略与审计由于数据源直接导出tags可以与 Provider 的标签策略检查见 website/docs/guides/tag-policy-compliance.html.markdown结合在terraform plan阶段验证生产集群是否具备必需的标签或在输出中汇总所有集群的归属信息。测试与验证仓库为数据源提供了完整的单元级验收测试 internal/service/emrcontainers/virtual_cluster_data_source_test.go。测试TestAccEMRContainersVirtualClusterDataSource_basic的关键断言包括数据源与资源的arn、id、name、container_provider.0.id、container_provider.0.info.0.eks_info.0.namespace、container_provider.0.type完全一致使用TestCheckResourceAttrPair成对校验container_provider.#、container_provider.0.info.#、container_provider.0.info.0.eks_info.#均等于1验证嵌套结构完整展开created_at与state为非空TestCheckResourceAttrSet数据源与资源的tags数量一致。此外测试通过PreCheckIAMServiceLinkedRole(/aws-service-role/emr-containers.amazonaws.com)验证 EMR Containers 服务相关角色已就绪并声明了外部 Providerkubernetes (~ 2.3)——这提示我们运行此类验收测试需要真实的 EKS 集群与 Kubernetes Provider这与测试配置中同时创建 EKS 集群的用法吻合。若要在本地复现可参考仓库的验收测试运行指南 docs/running-and-writing-acceptance-tests.md。使用注意事项只读语义数据源不会创建、修改或删除任何集群也无法触发集群的启停它仅是对DescribeVirtualClusterAPI 的薄封装。已终止集群查询会失败由于findVirtualClusterByID将TERMINATED状态视为未找到查询已终止的集群会得到reading EMR Containers Virtual Cluster (...)错误如需批量巡检请考虑使用ListVirtualClusters仓库清扫器 internal/service/emrcontainers/sweep.go 中展示了分页列举并过滤TERMINATED状态的用法。区域一致性当 Provider 默认区域与集群所在区域不一致时务必在数据源中显式声明region否则查询会因区域端点不匹配而失败。状态枚举state的完整取值集合为RUNNING、TERMINATING、TERMINATED、ARRESTED。其中ARRESTED表示集群因底层 EKS 集群或命名空间异常而停止调度是运维排障时的重要信号。小结aws_emrcontainers_virtual_cluster数据源是 terraform-provider-aws 中访问 EMR on EKS 虚拟集群只读信息的标准入口一个必填的virtual_cluster_id即可换取名称、ARN、状态、创建时间、容器提供方详情与标签的完整快照。它的实现遵循 Provider 统一的SDK 数据源 查找函数 扁平化模式核心代码位于 internal/service/emrcontainers/virtual_cluster_data_source.go 与 internal/service/emrcontainers/virtual_cluster.go与同名资源天然互补适合在基础设施编排中承担读取集群现状、驱动下游决策的角色。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考