资讯动态

使用 Terraform AWS Provider 的 aws_opensearch_domain 数据源查询 OpenSearch 域配置

发布时间:2026/9/19 17:24:41 来源:尧图企业网站定制
使用 Terraform AWS Provider 的 aws_opensearch_domain 数据源查询 OpenSearch 域配置【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_opensearch_domain是 Terraform AWS Provider 为 Amazon OpenSearch Service 提供的数据源Data Source用于只读地查询现有 OpenSearch 域的完整配置信息。本文以该数据源的官方文档为主体结合仓库中的 Go 实现源码与验收测试系统讲解其参数、全部导出属性、底层 API 调用链及典型实战用法帮助读者在基础设施即代码中安全复用既有域的资源信息。数据源概述与适用场景与资源Resource不同数据源不会创建、修改或删除任何 AWS 资源它只负责读取。当你需要在一个 Terraform 配置中引用由其他方式手动创建、其他配置或历史遗留管理的 OpenSearch 域时aws_opensearch_domain数据源是获取该域 ARN、端点、安全配置、集群拓扑等信息的标准入口。典型场景包括将已有 OpenSearch 域的endpoint或dashboard_endpoint传递给应用配置、ECS 任务或 Lambda 环境变量在只读审计配置中读取域的加密、网络、日志发布等安全基线信息在模块之间共享域信息避免重复定义资源。从仓库源码看该数据源定义在 internal/service/opensearch/domain_data_source.go注册名为aws_opensearch_domain见注释// SDKDataSource(aws_opensearch_domain, nameDomain)使用 Terraform Plugin SDK v2 实现读取动作挂载在ReadWithoutTimeout: dataSourceDomainRead上即整个读取过程不依赖 Terraform 的默认超时机制由 provider 的请求级超时兜底。基础用法Example Usage官方文档给出的最小示例只需一个参数domain_namedata aws_opensearch_domain my_domain { domain_name my-domain-name }执行terraform apply后即可通过data.aws_opensearch_domain.my_domain.attribute引用该域的全部导出属性例如output opensearch_endpoint { value data.aws_opensearch_domain.my_domain.endpoint } output opensearch_dashboard { value data.aws_opensearch_domain.my_domain.dashboard_endpoint }仓库中的验收测试也遵循同样的引用模式。在 internal/service/opensearch/domain_data_source_test.go 中测试配置先创建一个aws_opensearch_domain.test资源再用数据源引用它resource aws_opensearch_domain test { # ... 域资源配置 } data aws_opensearch_domain test { domain_name aws_opensearch_domain.test.domain_name }随后测试用resource.TestCheckResourceAttrPair将数据源属性与资源属性逐一比对确保两者数值一致从而验证数据源的读取正确性。参数说明Argument Reference该数据源支持以下参数参数必填说明domain_name是OpenSearch 域的名称用于唯一标识要查询的域。region否查询域所在区域。默认使用 provider 配置中设置的区域可通过该参数覆盖指向其他区域的 OpenSearch 服务端点。region 参数的作用region参数的存在意味着你可以用同一份 provider 配置、在不同的 provider alias 下查询不同区域的域。在源码层面该数据源通过meta.(*conns.AWSClient).OpenSearchClient(ctx)获取 OpenSearch 客户端internal/service/opensearch/domain_data_source.go客户端绑定的是 provider 配置的区域指定region后请求会定向到对应区域的端点与 AWS 的区域端点regional endpoint机制保持一致。导出属性全览Attribute Reference除上述参数外数据源导出以下属性。它们均为Computed只读由读取到的 AWS API 响应回填。根据 internal/service/opensearch/domain_data_source.go 中的 schema 定义这些属性可分为域级基本信息与嵌套配置块两大类。域级基本信息属性类型说明access_policies字符串附加到域的访问策略文档JSON源码中会先经structure.NormalizeJsonString规范化后返回保证 JSON 格式一致。advanced_optionsMap(String)高级配置选项的键值字符串对由flex.FlattenStringValueMap从 API 响应转换而来。arn字符串域的 ARN。同时该值被用作数据源的 IDd.SetId(aws.ToString(ds.ARN))。created布尔域是否已创建完成。deleted布尔域是否处于已删除状态。domain_id字符串域的唯一标识符。domain_endpoint_v2_hosted_zone_id字符串域 V2 端点的双栈 hosted zone ID。engine_version字符串域使用的 OpenSearch 版本如OpenSearch_2.11直接来自 API 响应的EngineVersion。endpoint字符串用于提交索引、搜索和数据写入请求的域专属端点。endpoint_v2字符串同时支持 IPv4 与 IPv6 的 V2 端点。dashboard_endpoint字符串用于访问 OpenSearch Dashboards 应用的域专属端点。dashboard_endpoint_v2字符串用于访问 Dashboards 应用的 V2 端点。ip_address_type字符串域端点支持的 IP 地址类型。processing布尔域当前是否正在执行配置变更。tagsMap(String)附加到域的标签。源码最后通过listTags调用 ListTags API 获取并经过IgnoreAWS().IgnoreConfig(ignoreTagsConfig)过滤后写入状态。其中endpoint、dashboard_endpoint与 V2 变体的取值逻辑与域是否部署在 VPC 内有关详见后文VPC 域与端点处理。advanced_security_options高级安全选项属性说明anonymous_auth_enabled是否启用匿名认证。enabled是否启用高级安全。internal_user_database_enabled是否启用内部用户数据库。jwt_optionsJWT 认证配置块包含以下子属性jwt_options.enabled是否启用 JWT 认证。jwt_options.jwks_url托管 JSON Web Key SetJWKS的 URL 端点JWKS 内含用于校验 JWT 签名的公钥。jwt_options.public_key用于校验 JWT 签名的 PEM 编码公钥。jwt_options.role_keyJWT 断言中用于映射角色的元素。jwt_options.subject_keyJWT 断言中用于映射用户名的元素。仓库中的 domain_data_source_test.go 专门为 JWT 选项编写了两组验收测试一组针对 OpenSearch 2.11 使用subject_key/roles_key的场景另一组针对 OpenSearch 3.5 使用jwks_url的场景均通过TestCheckResourceAttrPair验证数据源读回的 JWT 配置与资源配置一致。auto_tune_optionsAuto-Tune 配置属性说明desired_stateAuto-Tune 期望状态。maintenance_scheduleAuto-Tune 维护窗口的嵌套配置列表每个窗口包含maintenance_schedule.start_at维护计划开始时间RFC3339 格式。maintenance_schedule.duration维护窗口时长配置块value为时长数值unit为时间单位。maintenance_schedule.cron_expression_for_recurrence维护计划的 Cron 表达式。rollback_on_disable禁用 Auto-Tune 时是否回滚到默认设置。use_off_peak_window是否将需要蓝绿部署的 Auto-Tune 优化调度到每日低峰窗口内。值得注意的是auto_tune_options的数值来源与其他属性不同读取函数使用DescribeDomainConfig响应中的AutoTuneOptions.Options再经flattenAutoTuneOptions扁平化internal/service/opensearch/domain_structure.go而大部分属性来自DescribeDomain响应。cluster_config集群配置属性说明cold_storage_options.enabled是否启用冷存储。instance_type数据节点实例类型。instance_count集群实例数量。dedicated_master_enabled是否为集群启用专用主节点。dedicated_master_type专用主节点实例类型。dedicated_master_count专用主节点数量。multi_az_with_standby_enabled是否启用带备用可用区的多 AZ 域。node_options节点选项列表每项包含node_type节点类型与node_config节点尺寸配置含count节点数量、enabled是否启用、type实例类型。warm_enabled是否启用热存储warm storage。warm_count热节点数量。warm_type热节点实例类型。zone_awareness_enabled是否启用可用区感知。zone_awareness_config.availability_zone_count使用的可用区数量。cognito_optionsDashboards 的 Cognito 认证属性说明enabled是否启用 Amazon Cognito 认证。user_pool_id域使用的 Cognito 用户池。identity_pool_id域使用的 Cognito 身份池。role_arn附加了AmazonOpenSearchServiceCognitoAccess策略的 IAM 角色。deployment_strategy_options 与 off_peak_window_optionsdeployment_strategy_options.deployment_strategy域的部署策略如BLUE_GREEN等由flattenDeploymentStrategyOptions处理。off_peak_window_options低峰更新窗口配置enabled低峰窗口启用开关off_peak_window.window_start_time10 小时更新窗口的起始时间包含hours起始小时与minutes起始分钟两个子属性。ebs_options数据节点 EBS 存储属性说明ebs_enabled数据节点是否挂载 EBS 卷。throughputEBS 卷吞吐量MiB/s。volume_typeEBS 卷类型。volume_sizeEBS 卷大小GB。iopsEBS 卷的基线 I/O 性能。encryption_at_rest 与 node_to_node_encryption加密配置encryption_at_rest.enabled是否启用静态加密。encryption_at_rest.kms_key_id用于静态加密的 KMS 密钥 ID。node_to_node_encryption.enabled是否启用节点间传输加密。identity_center_optionsIAM Identity Center 集成属性说明enabled_api_access是否对 API 访问启用 IAM Identity Center。identity_center_instance_arnIAM Identity Center 实例的 ARN用于创建以 Identity Center 认证的 OpenSearch UI 应用。roles_keyIdentity Center 中承载后端角色标识如组名或组 ID的属性。subject_keyIdentity Center 中承载主体标识如用户名、用户 ID 或邮箱的属性。log_publishing_options日志发布属性说明log_type发布的 OpenSearch 日志类型。cloudwatch_log_group_arn日志发布到的 CloudWatch Log Group。enabled是否启用日志发布。snapshot_options 与 software_update_optionssnapshot_options.automated_snapshot_start_hour服务执行每日自动快照的小时。software_update_options.auto_software_update_enabled自动软件更新是否启用。vpc_options私有域网络配置属性说明availability_zones域使用的可用区列表。security_group_ids域使用的安全组列表。subnet_ids域使用的子网列表。vpc_id域所在的 VPC。底层实现原理两次 AWS API 调用的读取流程dataSourceDomainReadinternal/service/opensearch/domain_data_source.go的读取流程可归纳为三步按名称查找域调用findDomainByName(ctx, conn, domainName)。该函数internal/service/opensearch/domain.go封装了DescribeDomainAPI 调用若 AWS 返回ResourceNotFoundException则转换为retry.NotFoundError若响应为空或DomainStatus为空返回tfresource.NewEmptyResultError()——两种情形最终都会让数据源报出your query returned no results。查询域配置调用DescribeDomainConfigAPI 获取DomainConfig其中包含 Auto-Tune 等只存在于配置视图中的信息若响应为空同样报no results。回填状态将两类 API 响应通过flatten*系列函数集中在 internal/service/opensearch/domain_structure.go转换为 Terraform 属性最后以域 ARN 作为数据源 ID。也就是说每次terraform plan/apply读取该数据源时实际发生两次 OpenSearch 服务调用DescribeDomainDescribeDomainConfig以及一次标签查询ListTags用于填充tags属性。VPC 域与端点处理细节源码中对端点属性的处理区分了 VPC 域与非 VPC 域两种情形这是阅读导出属性时需要特别注意的细节VPC 域VPCOptions非空时端点取自 API 响应Endpoints映射endpoint对应endpoints[vpc]endpoint_v2对应endpoints[vpcv2]若存在Dashboards 端点由getDashboardEndpoint基于端点推导。此时若 API 同时返回了非空的Endpoint/EndpointV2字段源码会直接报错因为 VPC 域的公开端点本应为空。非 VPC 域直接使用ds.Endpoint与ds.EndpointV2填充对应属性并推导dashboard_endpoint、dashboard_endpoint_v2若Endpoints映射非空则报错因为非 VPC 域不应有 VPC 端点。这一对称校验VPC 域必须无公开端点、非 VPC 域必须无 VPC 端点保证了读取到的网络拓扑信息是自洽的也为使用端点的下游配置提供了正确性前提。实战组合示例数据源 资源编排数据源最常见的用法是与aws_opensearch_domain资源配合先声明域资源再用数据源引用其配置供其他模块消费。以下示例读取域的端点、ARN 与安全配置并将其输出给下游应用data aws_opensearch_domain my_domain { domain_name my-domain-name } # 输出应用可用的端点 output opensearch_url { value data.aws_opensearch_domain.my_domain.endpoint } output opensearch_dashboards_url { value data.aws_opensearch_domain.my_domain.dashboard_endpoint } # 供下游资源引用的 ARN例如授权其他账号访问 output opensearch_domain_arn { value data.aws_opensearch_domain.my_domain.arn } # 安全基线审计确认静态加密与传输加密均已开启 output encryption_at_rest_enabled { value data.aws_opensearch_domain.my_domain.encryption_at_rest[0].enabled } output node_to_node_encryption_enabled { value data.aws_opensearch_domain.my_domain.node_to_node_encryption[0].enabled }引用嵌套块属性时与资源一样采用索引展开语法如encryption_at_rest[0].enabled因为encryption_at_rest、node_to_node_encryption、advanced_security_options等属性在 schema 中都是 TypeList 类型见 internal/service/opensearch/domain_data_source.go 中对应的Computed: true定义。常见注意事项数据源报 your query returned no results通常是domain_name拼写错误或该域位于其他区域未通过region参数指定。底层对应findDomainByName捕获到的ResourceNotFoundException。嵌套属性需要索引cluster_config、ebs_options、vpc_options等均为列表块使用[0]索引访问其子属性当某些配置未启用时对应块可能为空访问前可配合length()判断。tags属性受 provider 的ignore_tags配置影响数据源返回的tags已经过滤掉IgnoreAWS()与IgnoreConfig指定的标签审计时需注意这一行为。该数据源只读不参与域生命周期任何对域的变更都应通过aws_opensearch_domain资源或其他管理方式完成数据源本身不会产生apply副作用。参考文档与源码位置数据源官方文档website/docs/d/opensearch_domain.html.markdown数据源实现schema 与读取逻辑internal/service/opensearch/domain_data_source.go底层域查找封装DescribeDomain 调用internal/service/opensearch/domain.go属性扁平化辅助函数internal/service/opensearch/domain_structure.go验收测试basic / complex / JWT 场景internal/service/opensearch/domain_data_source_test.go通过本文的参数、属性与源码对照读者应能准确使用aws_opensearch_domain数据源在任何 Terraform 配置中安全地复用 OpenSearch 域的运行信息并理解其背后的 API 读取链路与边界行为。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价