用"aws-ecs execute command"处理"aws-secs list ta



例如,执行此命令。

aws ecs list-tasks --cluster aic-prod

然后它返回到以下

{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
]
}

然后使用返回语句的CCD_ 1执行下一个命令。

aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task ae340032378f4155bd2d0eb4ee60b5c7

我想用一句话或shell脚本来完成这件事。有可能吗?

我在谷歌上搜索了一下正则表达式,但仍然不清楚。

aws ecs list-tasks --cluster aic-prod | grep taskArns | (regular expression??)

你能帮忙吗?

使用jq操作JSON

jq是在shell脚本中操作JSON的最佳工具。它有一种非常复杂的查询语言。

以下是如何使用它提取所需的字符串。我展示了我一个接一个构建的查询,这样你就可以一步一步地看到正在发生的事情:

❯ aws ecs list-tasks --cluster aic-prod | jq
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
]
}
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0]'
"arn:aws:ecs:ap-northeast-1:678100228133:task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0] | split(":")[-1]'
"task/aic-prod-cn/ae340032378f4155bd2d0eb4ee60b5c7"
❯ aws ecs list-tasks --cluster aic-prod | jq '.taskArns[0] | split(":")[-1] | split("/")[-1]'
"ae340032378f4155bd2d0eb4ee60b5c7"

使用$(…(捕获输出

下一步是添加-r,使其打印不带引号的原始字符串,并使用$(...)捕获输出,以便我们可以在第二个命令中重用它。

task_id=$(aws ecs list-tasks --cluster aic-prod | jq -r '.taskArns[0] | split(":")[-1] | split("/")[-1]')
aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task "$task_id"

或使用xargs

另一种编写方法是使用xargs,它接受一个命令的输出,并将其作为参数传递给下一个命令。

aws ecs list-tasks --cluster aic-prod |
jq -r '.taskArns[0] | split(":")[-1] | split("/")[-1]' |
xargs aws ecs execute-command --cluster aic-prod-cn --container AicDjangoContainer --interactive --command '/bin/bash' --task

最新更新