AWS CLI,在管道中使用 `--cli-input-json`

AWS CLI,在管道中使用 `--cli-input-json`

我想aws在管道中使用命令行应用程序,但这似乎不可能。

一个有效的例子是:

$ aws ecs register-task-definition --cli-input-json file://./mytask.json

但是以下方法不起作用:

$ cat ./mytask.json \
    | aws ecs register-task-definition --cli-input-json file:///dev/stdin

Error parsing parameter 'cli-input-json': Invalid JSON: Expecting value: line 1 column 1 (char 0)
JSON received:
$ aws ecs register-task-definition --cli-input-json file://<(cat ./mytask.json)

Error parsing parameter 'cli-input-json': Invalid JSON: Expecting value: line 1 column 1 (char 0)
JSON received:

答案1

暂时找到了一个使用 xargs 的解决方法,非常干净:

cat ./mytask.json \
    | xargs -0 aws ecs register-task-definition --cli-input-json

它仅添加xargs -0需要 --cli-input-json作为最后的论点

答案2

我去挖掘了...看起来aws会读取指示的文件两次,使用第二个数据集进行操作。当然,在管道中,第二个数据集read()将一无所获。

我添加了pipe://前缀/模式(犯罪)用于这种情况,它将缓存值...我还做了一个拉取请求

答案3

我能够将 JSON 作为变量传递--cli-input-json并注入 bash 变量。

所以你的例子应该是:

aws ecs register-task-definition --cli-input-json "$(cat < ./mytask.json)"

在我目前的情况中,我有:

  1. 根据需要传递 JSON

    aws autoscaling start-instance-refresh --cli-input-json "$(cat < ./options.json )"

  2. 或者作为 HEREDOC 来传递其他变量。(不是要求但可能有用)

asg_nominal_name=AutoScalingGroupName

aws autoscaling start-instance-refresh --cli-input-json "$(cat <<JSON
{ 
    "AutoScalingGroupName": "${asg_nominal_name}",
    "Preferences": {
        "InstanceWarmup": 300,
        "MinHealthyPercentage": 100
    }
}
JSON
)"

我不太熟悉用 bash 术语解释为什么。请随意。

答案4

就我的情况而言,这是文件编码问题。将文件保存为不带 BOM 的 UTF-8 格式,然后就可以正常工作了。

如果您使用 Sublime Text,请转到文件->使用编码保存->UTF-8。

在 VS Code 中,在 VS Code 的底部栏中,您会看到标签“UTF-8 with BOM”。单击它打开操作栏并选择“使用编码保存”。选择 UTF-8 并保存文件。

相关内容