ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

使用 Terraform AWS Provider 的 aws_networkfirewall_resource_policy 数据源检索 Network Firewall 资源策略

使用 Terraform AWS Provider 的 aws_networkfirewall_resource_policy 数据源检索 Network Firewall 资源策略 使用 Terraform AWS Provider 的 aws_networkfirewall_resource_policy 数据源检索 Network Firewall 资源策略【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读aws_networkfirewall_resource_policy是 terraform-provider-aws 中 Network Firewall 服务提供的一个只读数据源用于检索挂载在 AWS Network Firewall 防火墙策略Firewall Policy或规则组Rule Group上的资源策略Resource PolicyJSON 文档。本文以 数据源官方文档 为核心结合仓库内资源实现与集成测试代码系统讲解该数据源的参数、属性、完整实战用法以及底层的 AWS API 调用链帮助你在跨账户共享 Network Firewall 资源的场景中准确读取并复用现有策略。Network Firewall 资源策略与数据源的作用AWS Network Firewall 的资源策略是一种基于 AWS Resource Access ManagerRAM的共享机制它允许账户 A 将自身的防火墙策略或规则组共享给账户 B使账户 B 的防火墙能够引用这些资源。这类策略通过PutResourcePolicyAPI 写入本质上是一份 JSON 格式的 IAM 策略文档。在 terraform-provider-aws 中这一能力被拆分成一对配套的抽象资源Resourceaws_networkfirewall_resource_policy负责创建、更新、删除资源策略定义见 资源文档数据源Data Sourceaws_networkfirewall_resource_policy只负责读取检索已经存在的资源策略即本文主题。两者在服务包注册表中同时登记见 service_package_gen.go 与 service_package_gen.go共享同一组resource_arn/policy字段语义。数据源通常用于以下场景跨账户 Terraform 工作区中读取对方账户共享出来的策略内容用于审计或条件判断在配置防火墙、防火墙策略或规则组之前确认目标资源上是否已存在策略以及策略内容将现有策略作为变量传递给其他配置例如判断是否已授权某项network-firewall:*操作。数据源基础用法官方文档给出的最小可运行示例非常简洁data aws_networkfirewall_resource_policy example { resource_arn var.resource_policy_arn }其中var.resource_policy_arn是你希望查询策略的防火墙策略或规则组的 ARN。数据源执行后可以通过data.aws_networkfirewall_resource_policy.example.policy获取到完整的策略 JSON通过data.aws_networkfirewall_resource_policy.example.id获取到与resource_arn相同的标识。参数参考Argument Reference数据源支持以下两个参数参数是否必填说明region可选资源将被管理的区域默认使用 provider 配置中设定的区域。仅在该数据源需要跨区域查询资源策略时使用。resource_arn必填标识资源策略的 ARN即防火墙策略或规则组的 ARN。从实现层面看resource_arn在数据源 Schema 中被定义为必填字段并使用 ARN 校验函数verify.ValidARN进行合法性校验见 resource_policy_data_source.go传入非法格式的 ARN 会在 plan 阶段直接报错而不是等到运行时才暴露。属性参考Attribute Reference除了上述参数外数据源还会导出以下两个属性属性说明id标识该资源策略的 ARN与resource_arn取值相同。policy资源上的策略 JSON 文档即该 ARN 对应资源的 Resource Policy 全文。需要注意policy返回的是策略的 JSON 字符串。它与 aws_networkfirewall_resource_policy 资源 写入时的policy字段格式一致均为 JSON 文档因此可以直接作为该资源的输入或用于对比校验。完整实战示例资源与数据源配合使用单独使用数据源需要提前存在一个已绑定策略的资源。更常见的做法是像仓库内的集成测试那样先用资源创建防火墙策略并写入资源策略再通过数据源读取回来进行校验。以下示例改编自 resource_policy_data_source_test.godata aws_partition current {} data aws_caller_identity current {} # 1. 创建防火墙策略 resource aws_networkfirewall_firewall_policy test { name example-policy firewall_policy { stateless_fragment_default_actions [aws:drop] stateless_default_actions [aws:pass] } } # 2. 为防火墙策略写入资源策略RAM 共享授权 resource aws_networkfirewall_resource_policy test { resource_arn aws_networkfirewall_firewall_policy.test.arn policy jsonencode({ Statement [{ Action [ network-firewall:AssociateFirewallPolicy, network-firewall:ListFirewallPolicies, ] Effect Allow Resource aws_networkfirewall_firewall_policy.test.arn Principal { AWS arn:${data.aws_partition.current.partition}:iam::${data.aws_caller_identity.current.account_id}:root } }] Version 2012-10-17 }) } # 3. 通过数据源读取策略供审计或后续逻辑使用 data aws_networkfirewall_resource_policy test { resource_arn aws_networkfirewall_resource_policy.test.resource_arn } output retrieved_policy { value data.aws_networkfirewall_resource_policy.test.policy }策略中 Action 的约束在构造资源策略时策略的Action元素必须覆盖该类型资源要求的全部操作否则 AWS 会拒绝写入。根据 资源文档 的说明当目标是**防火墙策略Firewall Policy**时Action必须包含network-firewall:ListFirewallPolicies、network-firewall:CreateFirewall、network-firewall:UpdateFirewall、network-firewall:AssociateFirewallPolicy当目标是**规则组Rule Group**时Action必须包含network-firewall:ListRuleGroups、network-firewall:CreateFirewallPolicy、network-firewall:UpdateFirewallPolicy。策略文档推荐使用jsonencode函数构造以保证输出为紧凑、无多余空白的合法 JSON资源写入时底层会通过structure.NormalizeJsonString做规范化处理见 resource_policy.go。底层实现原理数据源如何读取策略数据源的核心逻辑位于dataSourceResourcePolicyRead见 resource_policy_data_source.go整个读取流程可拆解为四步获取客户端从meta.(*conns.AWSClient)中取出 Network Firewall 服务客户端NetworkFirewallClient调用查找函数从resource_arn参数取值调用findResourcePolicyByARN(ctx, conn, resourceARN)处理错误若读取失败返回形如reading NetworkFirewall Resource Policy (arn): ...的诊断信息写回状态将resource_arn设为id同时把返回的策略与resource_arn写回d.Set。真正发起 API 请求的是查找函数findResourcePolicyByARN见 resource_policy.go其关键行为包括构造DescribeResourcePolicyInput{ResourceArn: arn}并调用DescribeResourcePolicyAPI捕获ResourceNotFoundException将其转换为retry.NotFoundError供上层判断“资源不存在”若响应体或Policy字段为空返回tfresource.NewEmptyResultError()避免把空值写入状态正常情况下返回策略字符串指针*string。也就是说数据源的每一次读取都会实时调用 AWS 的DescribeResourcePolicyAPI返回的是云上最新状态而非 Terraform 状态文件中的缓存值。集成测试数据源行为验证仓库为数据源提供了完整的集成测试TestAccNetworkFirewallResourcePolicyDataSource_basic见 resource_policy_data_source_test.go从测试断言中可以提炼出数据源的几条可验证行为policy属性内容应与写入的策略一致测试用正则匹配Action:[network-firewall:AssociateFirewallPolicy,network-firewall:ListFirewallPolicies]片段resource_arn属性与资源写入的 ARN 严格相等通过TestCheckResourceAttrPair与aws_networkfirewall_firewall_policy.test.arn做配对校验测试运行需要真实 AWS 凭证acctest.ParallelTestacctest.PreCheck属于标准 acceptance test 模式详见仓库的 running-and-writing-acceptance-tests.md。常见问题与注意事项查询不存在的资源 ARN底层会把ResourceNotFoundException转为 NotFound 语义。在数据源场景下若目标资源不存在plan会报错若目标资源存在但尚未绑定任何资源策略DescribeResourcePolicy会返回空策略或直接返回 NotFound均会反映为读取失败需要先在目标资源上创建资源策略。id与resource_arn的关系数据源的id就是资源 ARN二者等价可用于TestCheckResourceAttrPair或作为引用传给其他资源。跨区域读取region参数允许数据源在非 provider 默认区域查询若配置了region请确保该区域确实存在目标资源否则 API 会返回区域不匹配或资源不存在的错误。策略的 JSON 规范化AWS 返回的策略可能与写入时在空白字符、字段排序上存在差异。若需要将数据源读出的policy与本地期望策略做字符串相等比较建议先通过jsonencode(jsondecode(...))规范化后再对比避免因格式差异产生误判。总结aws_networkfirewall_resource_policy数据源是 Network Firewall 资源策略共享场景中的标准读取入口通过resource_arn定位资源实时调用DescribeResourcePolicy返回策略全文并以id/policy两个属性向 Terraform 暴露结果。结合 数据源文档、资源文档 以及 数据源实现 与 集成测试你可以在跨账户共享防火墙策略与规则组的工作流中可靠地读取、审计并复用现有资源策略。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进