【发布时间】:2020-11-22 07:05:47
【问题描述】:
我正在从 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 Parameter Store 提取条目时不存在此问题,因为 AWS 允许您将“解析”条目用作字符串或数字。 SecretsManager 中不存在相同的功能。我还想使用 SecretsManager 提供大约 30 个或更多配置项的列表来设置我的堆栈。使用参数存储,您必须将每个配置项设置为单独的条目,这对我们来说是维护的噩梦。
【问题讨论】:
-
从云形成方面来看:“一些云形成参数需要是数字”你能多谈谈这个,给出一个精确的例子来说明你自己的一些参数如何?比如,资源类型和属性,或者参数定义和传递方法?
标签: json amazon-cloudformation jq