资讯动态

Terraform AWS Provider 数据源 `aws_memorydb_cluster` 完全指南:查询 MemoryDB 集群配置与运行状态

发布时间:2026/9/19 6:57:57 来源:尧图企业网站定制
Terraform AWS Provider 数据源aws_memorydb_cluster完全指南查询 MemoryDB 集群配置与运行状态【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_memorydb_cluster是 Terraform AWS Provider 提供的只读数据源Data Source用于按集群名称拉取 AWS MemoryDB for Valkey前身 MemoryDB for Redis集群的完整配置快照与运行信息包括分片拓扑、节点端点、加密与网络设置、快照策略及标签。本文以该数据源官方文档为主体结合仓库源码 cluster_data_source.go、cluster.go 与验收测试 cluster_data_source_test.go 深入讲解其参数、全部导出属性与底层读取原理帮助你安全地在 Terraform 配置中引用已有集群而不会产生资源变更。数据源概览为什么需要只读集群查询在 Terraform 中数据源用于读取基础设施的既有状态而不是创建或修改它。aws_memorydb_cluster数据源的核心价值在于解耦跨模块引用当集群由其他团队或其他 Terraform 配置创建时可以直接按名称读取其arn、cluster_endpoint.address等信息作为依赖注入给下游资源如安全组规则、DNS 记录、应用配置。避免配置漂移数据源每次执行terraform plan/apply都会重新调用 AWS API 刷新数据读取结果实时反映云端实际状态。补充资源属性的无法直读项如num_replicas_per_shard这类 API 不直接返回的字段数据源也通过源码中的推导逻辑给出可靠值详见下文源码解析。从仓库实现看该数据源通过 service_package_gen.go 注册为 SDK 数据源aws_memorydb_clusterName 为 Cluster并声明以arn作为标签标识属性。参数Argument Reference该数据源支持的参数非常简单仅有 2 个参数必填说明name是集群名称。Terraform 调用DescribeClusters时按该名称精确匹配。region否集群所属区域。默认为 provider 配置 中设置的区域即 provider 的region参数。region参数是 AWS Provider 所有资源/数据源的通用约定当你需要查询与 provider 默认区域不同的集群时可在数据源块内显式覆盖例如region eu-west-1读取操作会在该区域执行。名称命名约束来自源码校验虽然数据源只读名称但该名称本身必须遵守 MemoryDB 集群的命名规范。仓库 validate.go 中的校验规则同样适用于你传入的name长度 140 个字符clusterNameMaxLength 40仅允许小写字母、数字与连字符^[0-9a-z-]$不允许连续两个连字符--不允许以连字符结尾。基本使用示例官方文档给出了最简用法——只按名称读取输出任意所需属性data aws_memorydb_cluster example { name my-cluster } output cluster_arn { value data.aws_memorydb_cluster.example.arn } output cluster_endpoint { value data.aws_memorydb_cluster.example.cluster_endpoint[0].address }完整实战示例资源创建 数据源读取数据源最常见的用法是与aws_memorydb_cluster资源配对将创建后的集群反向读取供其他配置引用。下面组合了仓库测试 cluster_data_source_test.go 中的真实配置骨架该测试同时创建了 VPC、安全组、KMS 密钥、子网组、ACL 与集群# 安全组运行在测试创建的 VPC 内 resource aws_security_group test { name tf-test-sg description MemoryDB cluster security group vpc_id aws_vpc.test.id } # 集群静态加密使用的 KMS 密钥 resource aws_kms_key test { deletion_window_in_days 7 enable_key_rotation true } resource aws_memorydb_cluster test { acl_name aws_memorydb_acl.test.id auto_minor_version_upgrade false kms_key_arn aws_kms_key.test.arn name tf-test-cluster node_type db.t4g.small num_shards 2 security_group_ids [aws_security_group.test.id] snapshot_retention_limit 7 subnet_group_name aws_memorydb_subnet_group.test.id tls_enabled true tags { Test test } } # 数据源按资源名称反向读取同一集群 data aws_memorydb_cluster test { name aws_memorydb_cluster.test.name } output engine_patch_version { value data.aws_memorydb_cluster.test.engine_patch_version }其中aws_memorydb_cluster资源支持的关键参数详见 资源文档包括engine取值redis或valkey、engine_version不支持降级、port默认6379、ip_discovery默认ipv4若为ipv6则network_type必须为ipv6或dual_stack、tls_enabled默认true设为false时acl_name必须为open-access、name_prefix与name二选一、snapshot_arns/snapshot_name用于从备份或 S3 中的 RDB 文件恢复。属性参考Attribute Reference除参数外数据源导出以下属性与资源一致全部为Computed见 cluster_data_source.go。按功能分组如下标识与描述属性类型说明idstring与name相同源码中d.SetId(aws.ToString(cluster.Name))。arnstring集群的 Amazon 资源名称ARN。descriptionstring集群描述。网络、安全与加密属性类型说明acl_namestring与集群关联的访问控制列表ACL名称。security_group_idsset(string)与该集群关联的 VPC 安全组 ID 集合。subnet_group_namestring集群使用的子网组名称。kms_key_arnstring用于集群静态加密的 KMS 密钥 ARN。tls_enabledbool为true表示启用了传输中加密。network_typestring集群的 IP 地址类型ipv4/ipv6/dual_stack。ip_discoverystring集群发现 IP 地址的机制ipv4/ipv6。cluster_endpointlist集群配置端点cluster_endpoint.0.addressDNS 主机名与cluster_endpoint.0.port监听端口。portint每个节点接受连接所使用的端口号。引擎与容量属性类型说明enginestring运行在集群节点上的引擎redis或valkey。engine_versionstring集群使用的引擎版本号。engine_patch_versionstring集群使用的引擎补丁版本号。node_typestring集群节点的计算与内存容量如db.t4g.small。num_shardsint集群中的分片shard数量。num_replicas_per_shardint每个分片应用的副本数。data_tieringbool为true表示启用了数据分层data tiering。auto_minor_version_upgradebool为true表示集群允许自动进行引擎次要版本升级。parameter_group_namestring与集群关联的参数组名称。分片拓扑shardsshards是一个以分片name为集合键的 set每个分片包含属性说明shards.*.name分片名称。shards.*.num_nodes该分片内的节点数。shards.*.slots该分片的 keyspace例如0-16383。shards.*.nodes该分片内的节点集合每个节点包含availability_zone节点所在可用区、create_time创建时间如2022-01-01T21:00:00Z、name节点名、endpoint节点端点含address与port。快照与通知属性类型说明snapshot_retention_limitintMemoryDB 在删除自动快照前保留的天数为0时自动备份被禁用。snapshot_windowstring每日 UTC 快照时间窗例如05:00-09:00。final_snapshot_namestring资源删除时创建的最终快照名称省略则不创建最终快照。sns_topic_arnstring接收集群通知的 SNS 主题 ARN。maintenance_windowstring每周维护时间窗格式为ddd:hh24:mi-ddd:hh24:mi24 小时制 UTC例如sun:23:00-mon:01:30最小维护窗口为 60 分钟。标签属性类型说明tagsmap(string)分配给集群的标签映射。源码级实现解析数据源如何工作读取调用链数据源的读取入口是dataSourceClusterReadcluster_data_source.go其核心流程为从 provider 上下文中获取 MemoryDB SDK v2 客户端conn : meta.(*conns.AWSClient).MemoryDBClient(ctx)读取name参数调用findClusterByName内部构造DescribeClustersInput{ClusterName, ShowShardDetails: true}cluster.goShowShardDetails: true保证返回完整的分片与节点拓扑——这正是shards.*.nodes.*属性有数据的来源通过DescribeClusters分页器遍历所有页findClusters并对结果调用tfresource.AssertSingleValueResult——如果按名称匹配到 0 个或多个集群读取会直接报错确保数据源结果的唯一确定性集群不存在时错误会被包装为SingularDataSourceFindError(MemoryDB Cluster, err)在 plan 阶段即可暴露集群不存在的清晰错误。几个易被忽视的数据转换细节源码中有多处值得注意的API 行为修正理解它们有助于正确解读数据源输出id即name数据源把集群名称直接设为资源 IDd.SetId(aws.ToString(cluster.Name))与文档id- Same asname一致。data_tiering是字符串转布尔MemoryDB API 返回的DataTiering是字符串true/false源码用strconv.ParseBool转换后才写入d.Set(data_tiering, v)若转换失败会返回错误诊断。kms_key_arn的字段名陷阱API 字段名为KmsKeyId但实际返回的是 ARN。源码明确注释// KmsKeyId is actually an ARN here.直接写入kms_key_arn这正是文档将该属性命名为kms_key_arn而非kms_key_id的原因。sns_topic_arn有条件导出只有SnsTopicStatus ACTIVE常量clusterSNSTopicStatusActive见 enum.go时才会设置sns_topic_arn否则置为空字符串——避免把处于解除过程中的 SNS 关联误报为有效值。num_replicas_per_shard无法直读采用推导API 不直接返回副本数。deriveClusterNumReplicasPerShardcluster.go遍历所有分片只在分片状态为available时统计节点数取最大分片的NumberOfNodes - 1作为副本数。注释说明这是保守起见限定在稳定分片上的推导策略。security_group_ids扁平化API 返回的SecurityGroups是SecurityGroupMembership列表含 ID 与状态源码用tfslices.ApplyToAll只提取SecurityGroupId生成 set。分片与节点的集合结构shards与nodes在 schema 中都是TypeSet并分别以分片名、节点名作为 hash 键clusterShardHash/clusterShardNodeHash见 cluster.go。扁平化逻辑flattenShardscluster.go将每个分片转换为{name, num_nodes, slots, nodes}每个节点转换为{availability_zone, create_time(RFC3339 格式), endpoint{address, port}, name}。因此在 HCL 中遍历分片和节点非常方便output node_addresses { value [ for shard in data.aws_memorydb_cluster.example.shards : [for node in shard.nodes : node.endpoint[0].address] ] }数据源与资源的关系数据源与aws_memorydb_cluster资源共用同一套 find/flatten/wait 基础设施资源的resourceClusterRead与数据源的dataSourceClusterRead读路径几乎一致cluster.go区别在于资源在集群不存在时会从 state 中移除d.SetId()而数据源直接报错。两者都依赖waitClusterAvailable等状态机等待集群进入available状态enum.go 中定义了creating/updating/snapshotting/available/deleting等集群状态。关联数据源MemoryDB 服务包还提供了其他配套数据源均注册在 service_package_gen.go 中可以组合使用aws_memorydb_acl 数据源acl.go/acl_data_source.go按名称读取 ACL、minimum_engine_version与用户列表aws_memorydb_parameter_group、aws_memorydb_subnet_group、aws_memorydb_snapshot、aws_memorydb_user数据源分别读取参数组、子网组、快照与用户信息。例如要同时获取集群及其 ACL 信息data aws_memorydb_cluster example { name my-cluster } data aws_memorydb_acl example { name data.aws_memorydb_cluster.example.acl_name }验收测试如何保障数据源行为仓库中的 cluster_data_source_test.go 用TestAccMemoryDBClusterDataSource_basic对数据源做了完整的端到端验证它先创建包含 2 个分片num_shards 2、KMS 加密、安全组、标签Test test的集群再用数据源按名称读取并通过resource.TestCheckResourceAttrPair逐一断言数据源每个属性与资源属性完全一致覆盖acl_name、arn、cluster_endpoint.0.address/.port、data_tiering、engine、engine_version、ip_discovery、maintenance_window、node_type、num_shards、shards.#断言为 2及shards.0.nodes.#断言为 2等全部字段甚至精确校验了security_group_ids.#、tags.Test与tls_enabled。这意味着凡是在该测试中通过的属性都保证与aws_memorydb_cluster资源的状态写入一致你可以放心用数据源做资源配置漂移校验——例如在 CI 中对比资源定义与数据源读取结果。使用注意事项与最佳实践region覆盖只影响本次读取若集群不在 provider 默认区域务必在数据源内显式指定region否则会因集群不存在而报SingularDataSourceFindError类错误。名称必须完全匹配数据源按精确名称查找且 MemoryDB 对名称大小写敏感传入错误名称会在 plan 阶段直接失败这是数据源相对于资源会自行创建的一大差异。只读不产生变更数据源不会出现在terraform apply的变更计划中适合承载仅消费、不管理的集群信息若要管理生命周期请使用 aws_memorydb_cluster 资源。cluster_endpoint与port是配套读取的源码中只有ClusterEndpoint非空时才会同时写入cluster_endpoint与顶层port两者总是保持一致。分片集合无稳定顺序shards/nodes是TypeSet遍历结果顺序不定编写for表达式或引用shards.0时不要依赖顺序建议按name或对全部元素做聚合处理。小结aws_memorydb_cluster数据源以极简的参数面name 可选region提供了覆盖集群全维度运行信息的只读视图从 ARN、端点、分片节点拓扑到快照、维护窗口、标签一应俱全。其实现深度依赖 MemoryDBDescribeClusters接口含ShowShardDetails并通过多处源码级修正如字符串布尔转换、num_replicas_per_shard推导、SNS 状态过滤保证了输出与 Terraform 资源语义的一致性。若你需要进一步了解集群的创建、管理与导入细节可继续阅读 cluster.go 与 资源文档。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价