Java AWS CDK如何遍历CfnInclude对象中的所有CfnResource资源?
结论
AWS CDK 提供的software.amazon.awscdk.cloudformation.include.CfnInclude确实没有公开可直接遍历所有已导入资源的API,仅支持通过提前知晓的逻辑ID调用getResource()方法获取指定资源。
可行解决方案
方案1:预解析原始CloudFormation模板(推荐,兼容性最强)
你可以在初始化CfnInclude实例前,先自行解析原始CloudFormation模板文件,过滤出所有AWS::SSM::Parameter类型资源的逻辑ID,再用这些ID从CfnInclude实例中提取对应资源,Java 示例代码如下:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import software.amazon.awscdk.services.ssm.CfnParameter; import software.amazon.awscdk.cloudformation.include.CfnInclude; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; // 第一步:预解析模板,过滤SSM参数的逻辑ID ObjectMapper mapper = new ObjectMapper(); JsonNode templateRoot = mapper.readTree(new File("path/to/your/template.json")); JsonNode resourcesNode = templateRoot.get("Resources"); List<String> ssmParamLogicIds = new ArrayList<>(); Iterator<Map.Entry<String, JsonNode>> resourceIter = resourcesNode.fields(); while (resourceIter.hasNext()) { Map.Entry<String, JsonNode> entry = resourceIter.next(); String resourceType = entry.getValue().get("Type").asText(); if ("AWS::SSM::Parameter".equals(resourceType)) { ssmParamLogicIds.add(entry.getKey()); } } // 第二步:初始化CfnInclude,用过滤得到的逻辑ID获取资源 CfnInclude cfnInclude = CfnInclude.Builder.create(this, "ImportedCfnTemplate") .templateFile("path/to/your/template.json") .build(); for (String logicId : ssmParamLogicIds) { CfnParameter ssmParam = (CfnParameter) cfnInclude.getResource(logicId); // 此处编写SSM参数的后续处理逻辑 }
如果你的模板是YAML格式,只需将JSON解析逻辑替换为YAML解析逻辑即可,资源过滤的逻辑完全一致。
方案2:反射获取内部资源映射(不推荐)
你也可以通过反射访问CfnInclude的私有成员字段resources,该字段存储了所有已导入资源的逻辑ID与资源实例的映射关系,拿到后即可直接遍历。但该方法依赖CDK的非公开内部实现,版本更新时可能出现兼容性问题,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者cecukemon
相关产品推荐
相关产品推荐

