aws cli returns 使用 --query 参数和 --output 文本获取第一个元素时额外 'None'
aws cli returns an extra 'None' when fetching the first element using --query parameter and with --output text
我在 aws-cli(版本 1.11.160)中使用 --query 参数和 --output 文本获取查询输出的第一个元素时得到额外的 None
。
请参阅下面的示例。
$ aws kms list-aliases --query "Aliases[?contains(AliasName,'alias/foo')].TargetKeyId|[0]" --output text
a3a1f9d8-a4de-4d0e-803e-137d633df24a
None
$ aws kms list-aliases --query "Aliases[?contains(AliasName,'alias/foo-bar')].TargetKeyId|[0]" --output text
None
None
据我所知,这一直工作到昨天,但从今天开始,这个额外的 None
进来并杀死了我们的 ansible 任务。
有人经历过类似的事情吗?
谢谢
最好的解释是,并非您的查询语句的每个匹配项都有一个 TargetKeyId。在我的帐户中,有几个别名只有 AliasArn 和 AliasName key/value 对。 None
来自 TargetKeyId 的空值,换句话说。
我这几天也开始遇到这个问题。在我的例子中,我正在查询 cfn 堆栈的导出。
我的解决方案是(因为我只会从查询中得到一个结果)将 | [0].Value
更改为 .Value
,这适用于 --output text
.
一些例子:
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | []'
[
{
"ExportingStackId": "arn:aws:cloudformation:ap-southeast-2:111122223333:stack/stack-name/83ea7f30-ba0b-11e8-8b7d-50fae957fc4a",
"Name": "kms-key-arn",
"Value": "arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa"
}
]
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [].Value'
[
"arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa"
]
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [].Value' --output text
arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa
aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [0].Value' --output text
arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa
None
我还没有找到它发生的原因,但它反驳了@LHWizard 的理论,或者至少表明在某些情况下该解释是不充分的。
我在列出步骤函数时遇到了同样的问题。我认为这是一个错误。我不喜欢忽略第一个或最后一个元素的解决方案,期望它总是 None
在那个位置 - 在某个阶段问题会得到解决并且你的解决方法引入了一个讨厌的错误。
因此,就我而言,我将此作为安全解决方法(适应您的需求):
#!/usr/bin/env bash
arn="<step function arn goes here>"
arns=()
for arn in $(aws stepfunctions list-executions --state-machine-arn "$arn" --max-items 50 --query 'executions[].executionArn' --output text); do
[[ $arn == 'None' ]] || arns+=("$arn")
done
# process execution arns
for arn in "${arns[@]}"; do
echo "$arn" # or whatever
done
我在 aws-cli(版本 1.11.160)中使用 --query 参数和 --output 文本获取查询输出的第一个元素时得到额外的 None
。
请参阅下面的示例。
$ aws kms list-aliases --query "Aliases[?contains(AliasName,'alias/foo')].TargetKeyId|[0]" --output text
a3a1f9d8-a4de-4d0e-803e-137d633df24a
None
$ aws kms list-aliases --query "Aliases[?contains(AliasName,'alias/foo-bar')].TargetKeyId|[0]" --output text
None
None
据我所知,这一直工作到昨天,但从今天开始,这个额外的 None
进来并杀死了我们的 ansible 任务。
有人经历过类似的事情吗?
谢谢
最好的解释是,并非您的查询语句的每个匹配项都有一个 TargetKeyId。在我的帐户中,有几个别名只有 AliasArn 和 AliasName key/value 对。 None
来自 TargetKeyId 的空值,换句话说。
我这几天也开始遇到这个问题。在我的例子中,我正在查询 cfn 堆栈的导出。
我的解决方案是(因为我只会从查询中得到一个结果)将 | [0].Value
更改为 .Value
,这适用于 --output text
.
一些例子:
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | []'
[
{
"ExportingStackId": "arn:aws:cloudformation:ap-southeast-2:111122223333:stack/stack-name/83ea7f30-ba0b-11e8-8b7d-50fae957fc4a",
"Name": "kms-key-arn",
"Value": "arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa"
}
]
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [].Value'
[
"arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa"
]
$ aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [].Value' --output text
arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa
aws cloudformation list-exports --query 'Exports[?Name==`kms-key-arn`] | [0].Value' --output text
arn:aws:kms:ap-southeast-2:111122223333:key/a13a4bad-672e-45a3-99c2-c646a9470ffa
None
我还没有找到它发生的原因,但它反驳了@LHWizard 的理论,或者至少表明在某些情况下该解释是不充分的。
我在列出步骤函数时遇到了同样的问题。我认为这是一个错误。我不喜欢忽略第一个或最后一个元素的解决方案,期望它总是 None
在那个位置 - 在某个阶段问题会得到解决并且你的解决方法引入了一个讨厌的错误。
因此,就我而言,我将此作为安全解决方法(适应您的需求):
#!/usr/bin/env bash
arn="<step function arn goes here>"
arns=()
for arn in $(aws stepfunctions list-executions --state-machine-arn "$arn" --max-items 50 --query 'executions[].executionArn' --output text); do
[[ $arn == 'None' ]] || arns+=("$arn")
done
# process execution arns
for arn in "${arns[@]}"; do
echo "$arn" # or whatever
done