我正在从AWS的SecretsManager中获取一个秘密,并使用生成的JSON构建参数JSON文件,该文件可以将此参数传递给云形成引擎。不幸的是,SecretsManager将所有值存储为字符串,因此当我尝试将这些值传递到我的云形成模板时,它将失败,因为它传递的是字符串而不是数字,并且某些云形成参数需要为数字(例如,不是字符串) 。
在下面的示例中,我想告诉JQ,“ HEALTH_CHECK_UNHEALTHY_THRESHOLD_COUNT ”和“ AUTOSCALING_MAX_CAPACITY ”是数字。因此,我在键之前加上“ NUMBER ::”。
这有两个目的。首先,它告诉查看此秘密的人它将被转换为数字,其次,它将告诉JQ将字符串值“ 2”转换为2。这需要扩展,以便我可以拥有1..n键需要在JSON中进行转换。
考虑以下JSON:
{
"NUMBER::AUTOSCALING_MAX_CAPACITY": "12",
"SERVICE_PLATFORM_VERSION": "1.3.0",
"HEALTH_CHECK_PROTOCOL": "HTTPS",
"NUMBER::HEALTH_CHECK_UNHEALTHY_THRESHOLD_COUNT": "2"
}
这是我想对JQ进行的操作:
JQ将“按原样”复制JSON中大多数元素的键/值对。如果没有“ NUMBER ::”前缀,它们将被复制为“原样”。
但是,如果键的前缀为“ NUMBER ::”,则希望发生以下情况:
一种。JQ将从键名中删除“ NUMBER ::”前缀。
b。JQ会将值从字符串转换为数字。
最终结果是一个如下所示的JSON:
{
"AUTOSCALING_MAX_CAPACITY": 12,
"SERVICE_PLATFORM_VERSION": "1.3.0",
"HEALTH_CHECK_PROTOCOL": "HTTPS",
"HEALTH_CHECK_UNHEALTHY_THRESHOLD_COUNT": 2
}
我尝试过的
我尝试使用Map来完成此操作,但效果有限。在此示例中,我主要是作为测试来寻找特定领域。我不需要按名称调出特定的键,而只是使用以“ NUMBER ::”开头的任何键进行转换。
注意:以下示例中的SECRET_STRING变量包含源JSON。
echo $SECRET_STRING | jq 'to_entries | map(if .key == "NUMBER::AUTOSCALING_MAX_CAPACITY" then . + {"value":.value} else . end ) | from_entries'**
我还尝试在整个JSON中使用“ tonumber”。JQ将检查所有值,并查看是否可以将它们转换为数字。问题是,当它按下“ SERVICE_PLATFORM_VERSION”键时会失败,因为它检测到“ 1.3.0”为数字,并试图使该数字成为伪造。
Example: echo $SECRET_STRING | jq -r '.[] | tonumber'
回顾一下,我想使用JQ通过在键名中使用前缀“ NUMBER ::”将JSON字符串值转换为数字。
注意:尝试从Systems Manager参数存储中提取条目时,此问题不存在,因为AWS允许您将“解决”条目用作字符串或数字。SecretsManager中不存在相同的功能。我还想使用SecretsManager提供约30个或更多配置项的列表,以设置我的堆栈。使用参数存储,您必须将每个配置项设置为单独的条目,这是维护的噩梦。
用键开头选择每个条目,NUMBER::
并进行更新以删除该前缀并将值转换为数字。
with_entries(
select(.key | startswith("NUMBER::")) |= (
(.key |= ltrimstr("NUMBER::")) |
(.value |= tonumber)
)
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句