使用JQ删除CloudFormation.template.json中指定资源块的方法
jq删除CloudFormation模板指定资源实现方法
现有实现
你当前已经通过匹配Type字段实现了AWS::CodePipeline::Pipeline类型资源的删除,所用命令如下:
jq '(del(.Resources | .[] | select(.Type=="AWS::CodePipeline::Pipeline")))' $fileName > newTemplate1.json
这个写法的局限是只能遍历Resources下的资源值做判断,无法获取上层资源键名,因此无法匹配「键名包含cdkpipelinePipeline」的删除规则。
待删除资源示例
需要额外删除的是所有键名包含cdkpipelinePipeline的资源,结构参考如下:
{ "developcdkpipelinePipeline": { "Type": "AWS::CodePipeline::Pipeline", "Properties": { "RoleArn": { "Fn::GetAtt": [ "developcdkpipelinePipelineRole", "Arn" ] } } }, "developcdkpipelinePipelineRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "codepipeline.amazonaws.com" } } ], "Version": "2012-10-17" }, "Tags": [ { "Key": "Application", "Value": "develop" } ] }, "DependsOn": [ "AuroraNestedStackAuroraNestedStackResource" ], "Metadata": { "aws:cdk:path": "develop-cicd-stack/develop-cdkpipeline/Pipeline/Role/Resource" } } }
最终实现命令
使用with_entries同时获取资源键名和值,将两个删除条件合并,一次性完成两类资源的删除:
jq 'del(.Resources | with_entries(select(.key | contains("cdkpipelinePipeline") or .value.Type == "AWS::CodePipeline::Pipeline")))' $fileName > newTemplate1.json
命令逻辑说明
with_entries会将Resources对象转换为{key: 资源键名, value: 资源内容}的数组结构,筛选完成后自动转回原对象结构select()中配置两个删除规则,满足任意一个规则的资源都会被选中删除:- 资源键名包含
cdkpipelinePipeline字符串 - 资源的Type字段值为
AWS::CodePipeline::Pipeline
- 资源键名包含
- 单条命令即可覆盖全部删除需求,无需分多次处理模板
内容的提问来源于stack exchange,提问作者Mathiasdcm
相关产品推荐
相关产品推荐

