JSMEPath

JSMEPath

大多数 AWS CLI 命令都接受--query选项。此选项将获取命令输出并应用 JMESPath 表达式来转换输出。JMESPath 是一种查询语言,它以 JSON 作为输入并根据提供的查询表达式转换数据, JMESPath 表达式生成的输出也是 JSON 数据。

--query选项可用于减少输出以仅显示您想要查看的值。在编写 shell 脚本以从输出中提取特定值时也经常使用此选项,以便我们可以在后续命令中使用它。

例如,假设我们想要获取我们的 AWS 账户 ID, aws sts get-caller-identity命令输出:

$ aws sts get-caller-identity
{
    "UserId": "AIDA2LXQ3EOQBID7ABCDE",
    "Account": "12345",
    "Arn": "arn:aws:iam::12345:user/admin"
}

如果我们只想提取Account键的值,我们可以使用 JMESPath 表达式Account来提取与该键关联的值。

$ aws sts get-caller-identity --query Account
"12345678910"

在上面的输出中,我们将字符串显示为 JSON,其中包含双引号。

在 shell 脚本中使用 AWS CLI 时的另一个常见模式是通过选项指定需要文本输出而不是 JSON 输出来删除双引号,--output text这会删除值周围的引号:

$ aws sts get-caller-identity --query Account --output text
12345678910

为了将此值保存为我们可以稍后重用的变量,我们会经常看到使用以下模式:

account_id=$(aws sts get-caller-identity --query Account --output text)
echo "Your account id is $account_id"

要了解有关 JMESPath 查询语言的更多信息,请参阅JMESPath 教程

一些技巧

MultiSelect List

我们通常只对从服务返回的数据的子集感兴趣。我们可以使用multiselect-list 帮助我们提取我们感兴趣的子集。

许多 AWS 服务的listdescribe命令都具有以下返回结构:

{
  "SingleRootKey": [
    {"Attr1": "foo", "Attr2": "bar", "Attr3": "baz"},
    {"Attr1": "foor2", "Attr2": "barr2", "Attr3": "bazr2"},
  ]
}

如果我们只对 Attr1感兴趣,可以提取出来。

例如,运行aws cloudformation describe-stacks查看我们的帐户中部署了哪些 CloudFormation 堆栈:

aws cloudformation describe-stacks

image-20231202173716004

让我们将输出范围缩小到堆栈的名称和堆栈的状态。该模式的一般格式如下:TopLevelKey[].[Attr1,Attr1,...]在本例中,顶级键是Stacks,我们要提取的两个属性是 StackNameStackStatus

aws cloudformation describe-stacks --query Stacks[].[StackName,StackStatus]

image-20231202173912740

服务端过滤

在可能的情况下,建议先在服务端过滤结果,以避免不必要的带宽和客户端处理。

例如,假设我们想要查看状态为ROLLBACK_COMPLETE的所有堆栈, 执行此操作的首选方法是使用--stack-status-filter参数,因为过滤发生在服务端。因此,只有具有以下ROLLBACK_COMPLETE 状态的堆栈才会返回给您:

aws cloudformation list-stacks --stack-status-filter ROLLBACK_COMPLETE --query StackSummaries[].[StackName,StackStatus]

image-20231202174423587

客户端过滤

有时服务 API 参数中并未提供我们想要执行的过滤器类型。发生这种情况时,我们可以使用客户端过滤来--query生成我们想要的结果。

该查询的格式为SingleRootKey[? QUERY_EXPRESSION ]。然后,我们可以使用MultiSelect List技巧中的查询来扩展该查询,以选择我们感兴趣的字段子集。

例如,我们将探讨要列出以特定前缀开头的Stack的场景。使用客户端过滤运行list-stacks命令以检索以eksctl开头的堆栈:

aws cloudformation list-stacks --query "StackSummaries[?starts_with(StackName, 'eksctl')]"

image-20231202175039959

如果仅想显示StackNameStackStatus属性:

aws cloudformation list-stacks \
    --query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]"

image-20231202175122635

--text结合

到目前为止,我们看到的输出都是 JSON 格式。但是,有时我们希望将输出格式化为Tab分隔的基于文本的格式。这允许我们使用其他命令行工具,例如sedawk来继续处理

运行与上一步相同的命令, 并添加选项--output text

aws cloudformation list-stacks \
    --query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]" \
    --output text

image-20231202175427853

如果我们想让CREATE_COMPLETE /UPDATE_COMPLETE / 统一为COMPLETE。我们还将通过对齐列来清理输出,以便输出更易于直观地解析。这演示了我们如何将该--output text选项与其他 CLI 工具结合起来。

aws cloudformation list-stacks \
   --query "StackSummaries[?starts_with(StackName, 'eksctl')].[StackName,StackStatus]"  \
   --output text | \
   sed 's/\(CREATE\|UPDATE\)_COMPLETE/COMPLETE/' | column -t

image-20231202175916317