批量替换CloudFront配置JSON中CacheBehaviour的TargetOriginId方案求助
批量替换CloudFront分发配置中CacheBehaviors的TargetOriginId
需要批量替换CloudFront分发配置JSON文件(distconfig.json)内CacheBehaviors.Items中的TargetOriginId,用changebehaviour.json里的对应新值替换现有值,但尝试的jq脚本未达到预期效果,现寻求可行方案。
尝试过的脚本
for targetoriginID in $(jq '(.CacheBehaviors.Items[].TargetOriginId)' distconfig.json); do echo "#######fetch the new value from change behaviour json file#######" NewValue=$(jq -r "map(select(.targetoriginid == ""$targetoriginID""))[].targetorigindr" changebehaviour.json) echo "#########replace value in dist config json file with new value from change behaviour###########" jq -r '(.CacheBehaviors.Items[].TargetOriginId | select(. == "$targetoriginID")) = "$NewValue"' distconfig.json > "tmp" && mv "tmp" distconfig.json done
相关配置片段
distconfig.json 关键片段
{ "CacheBehaviors": { "Quantity": 2, "Items": [ { "PathPattern": "jkl/*", "TargetOriginId": "nkl/Prod", // 其他配置省略 }, { "PathPattern": "fgh/*", "TargetOriginId": "xyz/Prod", // 其他配置省略 } ] } }
假设的 changebehaviour.json 结构(需与实际文件匹配)
[ {"targetoriginid": "nkl/Prod", "targetorigindr": "nkl/NewProd"}, {"targetoriginid": "xyz/Prod", "targetorigindr": "xyz/NewProd"} ]
原脚本问题分析
- 变量引用错误:jq单引号内的
$targetoriginID和$NewValue不会被Shell解析,始终是字符串字面量,无法匹配实际值。 - 字段名拼写问题:需确认
changebehaviour.json中的targetorigindr是否为正确的新值字段名,避免笔误。 - 多次覆盖文件:循环中每次修改都会覆盖临时文件,可能导致之前的替换被覆盖,且效率低下。
- 未处理引号:
jq输出的TargetOriginId带双引号,直接赋值给targetoriginID会导致匹配时带引号,无法匹配JSON中的实际值。
可行解决方案
无需Shell循环,直接用jq一次性完成映射替换,效率更高且避免错误:
替换命令
jq --argfile mappings changebehaviour.json ' # 将映射数组转为键值对对象:原TargetOriginId => 新值 $mappings | reduce .[] as $item ({}; .[$item.targetoriginid] = $item.targetorigindr) as $map | .CacheBehaviors.Items[] |= ( .TargetOriginId = ($map[.TargetOriginId] // .TargetOriginId) ) ' distconfig.json > tmp.json && mv tmp.json distconfig.json
命令说明
--argfile mappings changebehaviour.json:将changebehaviour.json内容作为变量$mappings传入jq。reduce .[] as $item ({}; .[$item.targetoriginid] = $item.targetorigindr):把映射数组转为键值对对象,实现快速查找。.CacheBehaviors.Items[] |= (...):遍历所有CacheBehavior项,替换TargetOriginId为映射中的新值;若没有对应映射,则保留原数值(//是jq的默认值运算符)。
注意事项
- 确认
changebehaviour.json中的字段名与脚本一致,若实际字段名不同需修改脚本中的对应字段。 - 执行前建议备份
distconfig.json,避免数据丢失。
内容的提问来源于stack exchange,提问作者Bindu
相关产品推荐
相关产品推荐

