You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量替换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

命令说明

  1. --argfile mappings changebehaviour.json:将changebehaviour.json内容作为变量$mappings传入jq。
  2. reduce .[] as $item ({}; .[$item.targetoriginid] = $item.targetorigindr):把映射数组转为键值对对象,实现快速查找。
  3. .CacheBehaviors.Items[] |= (...):遍历所有CacheBehavior项,替换TargetOriginId为映射中的新值;若没有对应映射,则保留原数值(//是jq的默认值运算符)。

注意事项

  • 确认changebehaviour.json中的字段名与脚本一致,若实际字段名不同需修改脚本中的对应字段。
  • 执行前建议备份distconfig.json,避免数据丢失。

内容的提问来源于stack exchange,提问作者Bindu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:31:50