
使用 aws_opensearchserverless_security_policy 数据源读取 OpenSearch Serverless 安全策略【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本篇文章以 terraform-provider-aws 仓库中的aws_opensearchserverless_security_policy数据源文档为主体讲解如何通过 Terraform 读取 AWS OpenSearch ServerlessServerless 版 OpenSearch的加密encryption与网络network两类安全策略覆盖全部参数与导出属性并结合仓库源码数据源实现、查找函数与测试用例剖析其底层读取流程与字段语义。读完本文你将掌握该数据源的完整用法、JSON 策略文档的获取方式以及如何将它与安全策略资源配合使用。数据源概览aws_opensearchserverless_security_policy是 terraform-provider-aws 为 AWS OpenSearch Serverless 服务提供的只读数据源用于获取某个已存在的 Security Policy安全策略的详细信息。在 OpenSearch Serverless 中安全策略分为两类加密策略encryption控制 Collection 数据落盘加密方式可使用 AWS 托管密钥AWSOwnedKey或客户管理的 KMS 密钥KmsARN网络策略network控制哪些来源可以访问 Collection 端点与 Dashboards 端点支持公网访问或 VPC 内网访问。该数据源按「策略名称 策略类型」二元组合定位策略二者缺一不可。它不会创建或修改任何资源只负责把远端策略的最新状态回读到 Terraform 状态中供其他资源配置引用或作为输出展示。基础用法文档给出的最简示例位于 website/docs/d/opensearchserverless_security_policy.html.markdown只需指定name与type两个必填参数data aws_opensearchserverless_security_policy example { name example-security-policy type encryption }执行terraform apply后数据源会把远端策略的属性写入data.aws_opensearchserverless_security_policy.example例如通过输出引用策略 JSON 文档output policy_document { value data.aws_opensearchserverless_security_policy.example.policy }与安全策略资源联动的典型场景数据源最常见的用途是「先建资源、再读取校验」。仓库中的接入测试security_policy_data_source_test.go展示了标准组合写法先创建aws_opensearchserverless_security_policy资源再用数据源按name与type读取并通过TestCheckResourceAttrPair断言二者字段一致resource aws_opensearchserverless_security_policy test { name var.rName type encryption description var.rName policy jsonencode({ Rules [ { Resource [collection/${var.rName}], ResourceType collection } ], AWSOwnedKey true }) } data aws_opensearchserverless_security_policy test { name aws_opensearchserverless_security_policy.test.name type encryption }测试中逐项校验了数据源与资源之间的字段对等关系name、type、description、policy、policy_version并验证created_date、last_modified_date已被设置。该测试配置模板同样保存在仓库的 testdata/SecurityPolicy/basic/main_gen.tf 中可作为可复现的完整示例。参数详解Argument Reference该数据源支持以下参数参数必需说明name是安全策略的名称用于定位策略。type是安全策略类型仅允许encryption或network。region否策略所在的 AWS 区域默认为 provider 配置中设定的 Region。name 的约束从数据源的 Schema 定义security_policy_data_source.go可以看到name在 Provider 侧经过了双重校验ValidateFunc: validation.All( validation.StringLenBetween(3, 32), validation.StringMatch(regexache.MustCompile(^[a-z][0-9a-z-]$), must start with any lower case letter and can include any lower case letter, number, or -), ),即名称长度必须在 332 个字符之间且必须以小写字母开头之后只能包含小写字母、数字与连字符-。这与资源侧的定义security_policy.go 中stringvalidator.LengthBetween(3, 32)保持一致说明 Provider 对「名称格式」的约束在数据源与资源之间是统一执行的。type 的约束type通过enum.Validate[types.SecurityPolicyType]()校验底层对应 AWS SDK 的枚举类型SecurityPolicyTypesecurity_policy_data_source.go。仓库清理脚本sweep.go与资源测试均只使用SecurityPolicyTypeEncryption与SecurityPolicyTypeNetwork两个枚举值与文档声明的encryption/network一一对应。region 参数region允许在多区域场景下将数据源指向非默认区域。仓库为安全策略生成的区域覆盖测试配置testdata/SecurityPolicy/region_override/main_gen.tf展示了该用法数据源/资源通过region var.region显式指定部署区域从而规避默认区域限制。当需要跨区域读取策略时可在数据源中显式设置data aws_opensearchserverless_security_policy example { region us-west-2 name example-security-policy type encryption }导出属性详解Attribute Reference数据源在查询成功后除参数本身外还会导出以下只读属性属性类型说明created_date字符串安全策略的创建时间。description字符串安全策略的描述信息。last_modified_date字符串安全策略的最后修改时间。policy字符串去除所有空白字符后的 JSON 策略文档。policy_version字符串策略的版本号用于并发更新时的乐观锁控制。字段如何被填充数据源的读取逻辑集中在dataSourceSecurityPolicyReadsecurity_policy_data_source.go其流程如下通过findSecurityPolicyByNameAndType调用 AWS SDK 的GetSecurityPolicyAPIfind.go按name与type查询策略详情查询成功后以策略名称作为数据源 IDd.SetId(aws.ToString(securityPolicy.Name))将 SDK 返回的时间戳int64 毫秒值通过flex.Int64ToRFC3339StringValue转换为 RFC3339 格式分别写入created_date与last_modified_date将 SDK 返回的文档类型types.Document通过tfsmithy.DocumentToJSONString序列化为无空白字符的 JSON 字符串写入policy属性若策略文档为空则置为nil最后写入description、policy_version与type。值得注意的两点实现细节时间格式created_date与last_modified_date最终以 RFC3339 字符串形式暴露给用户可直接参与比较或格式化输出无需自行换算毫秒时间戳策略 JSON 规范化policy属性是「紧凑化」后的 JSON不含任何空白适合在jsondecode()后做结构化比较或直接透传给需要规范 JSON 的下游组件。若需要保留缩进的可读格式可在配置中用jsonencode(jsondecode(...))自行重排。未找到策略时的行为findSecurityPolicyByNameAndType将 SDK 的ResourceNotFoundException转换为retry.NotFoundErrorfind.go并处理nil响应的情况返回tfresource.NewEmptyResultError()。数据源读取时若发生错误会返回形如reading OpenSearch Serverless Security Policy (名称): ...的诊断信息security_policy_data_source.go便于快速定位是名称、类型还是区域配置有误。策略文档内容速览虽然数据源本身只做读取但理解policy字段承载的 JSON 结构有助于正确使用该数据源的输出。仓库中对应的资源文档website/docs/r/opensearchserverless_security_policy.html.markdown给出了两类策略的典型 JSON 形态。加密策略encryption加密策略是一个 JSON 对象核心字段为Rules作用于哪些 Collection与密钥归属resource aws_opensearchserverless_security_policy example { name example type encryption description encryption security policy for example-collection policy jsonencode({ Rules [ { Resource [collection/example-collection] ResourceType collection } ], AWSOwnedKey true }) }AWSOwnedKey true表示使用 AWS 托管密钥加密使用客户管理的 KMS 密钥时将AWSOwnedKey置为false并补充KmsARN字段Resource支持通配符如collection/example*以一次匹配多个 Collection。网络策略network网络策略是一个 JSON数组每个元素描述一组访问规则核心字段为Rules、AllowFromPublic与SourceVPCEsresource aws_opensearchserverless_security_policy example { name example type network description VPC access policy jsonencode([ { Description VPC access to collection and Dashboards endpoint for example collection, Rules [ { ResourceType collection, Resource [collection/example-collection] }, { ResourceType dashboard, Resource [collection/example-collection] } ], AllowFromPublic false, SourceVPCEs [vpce-050f79086ee71ac05] } ]) }AllowFromPublic true允许公网访问AllowFromPublic false时需通过SourceVPCEs指定允许访问的 VPC Endpoint ID实现内网访问一个策略可包含多个数组元素实现不同 Collection 的混合访问控制如营销组走 VPC、销售组走公网。当通过数据源读取上述任意策略时policy属性返回的正是经过 AWS 规范化、去除空白后的同一份 JSON 文档。底层实现与可追溯性数据源在 Provider 代码中通过注解注册security_policy_data_source.go// SDKDataSource(aws_opensearchserverless_security_policy, nameSecurity Policy) func dataSourceSecurityPolicy() *schema.Resource {该实现基于 Terraform Plugin SDK v2terraform-plugin-sdk/v2/helper/schema使用ReadWithoutTimeout作为读取回调Schema 通过SchemaFunc构建。值得注意的是type字段同时使用了 SDK 枚举校验而name字段的格式校验3~32 位、小写字母开头与对应资源security_policy.go保持一致确保「先建后查」场景下资源名一定能通过数据源校验。仓库中还提供了配套的「列表」能力aws_opensearchserverless_security_policies见 security_policy_list.go其内部同样复用findSecurityPolicyByNameAndType逐项读取详情可作为按类型批量枚举策略时的补充手段。使用注意事项名称唯一性依赖类型区分name与type共同构成定位键同名但不同类型的策略是两条独立策略读取时必须同时指定二者policy为紧凑 JSON直接输出或比较时注意它不含空白字符如需可读格式请先用jsondecode()解析区域一致性若数据源与策略资源处于不同区域务必显式设置region否则会因默认区域不匹配导致查询不到策略只读语义数据源不会对策略做任何变更适用于治理审计、配置漂移检测与terraform plan对比以及跨配置引用等场景。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考