我在 AWS 中有具有相同 ReservationId 的实例(它们是同时启动的,并且 AmiLaunchIndex 为 0 到 x )。我的目标是生成每个实例一行的文本输出,如下所示。为了清楚起见,我添加了列标题。
OwnerId ReservationId InstanceId PrivateIpAddress AmiLaunchIndex
12345678910 r-poiu4567 i-asdf1234 10.0.0.1 0
12345678910 r-poiu4567 i-qwer4312 10.0.1.1 1
... etc ...
Run Code Online (Sandbox Code Playgroud)
在 jmespath gitter 频道中,建议使用 map 函数作为实现此目的的一种方法,但我不知道如何使用该函数。有什么建议么?
我在过滤 AWS CLI 描述安全组输出时遇到困难
目标:使用 cidr 0.0.0.0/0 在端口 22 上找到所有具有入口规则的 SG
亚马逊自己的文档提供了一个示例,但声明他们的查询存在限制,因为它将首先过滤端口 22 的整个数据集,然后过滤 0.0.0.0/0 的整个数据集。这意味着具有以下规则的 SG 仍将触发:
ingress 22 sg-12345678
ingress 443 0.0.0.0/0
Run Code Online (Sandbox Code Playgroud)
这完全违背了过滤的目的,我什至不知道为什么亚马逊提供了一个标题为“描述具有特定规则的安全组”的示例
路线 1:先 aws cli 查询,然后是 jq
这条路线基于我在这里找到的内容:https : //github.com/aws/aws-cli/issues/971
aws ec2 describe-security-groups --output json --query 'SecurityGroups[*].[GroupName,GroupId,IpPermissions[?ToPort==`22`].[IpRanges[?CidrIp==`0.0.0.0/0`]]]'
Run Code Online (Sandbox Code Playgroud)
它提供了所有安全组的列表,但显示了具有 22 0.0.0.0/0 的任何 SG 的嵌套数据(并成功忽略了其他端口的任何 0.0.0.0/0 ACL)在下面的输出中,SG1 是我感兴趣的, SG2/SG3 需要过滤掉。
[
[
"SG 1",
"sg-11111111",
[
[
[
{
"CidrIp": "0.0.0.0/0"
}
]
]
]
],
[
"SG 2",
"sg-22222222",
[
[
[]
]
] …Run Code Online (Sandbox Code Playgroud) 在我的 AWS 账户上,我有四个文件系统。在创建每个文件系统时,我都为每个文件系统指定了一个标签名称。我想使用 AWS CLI 过滤掉具有特定名称的文件,并检索其文件系统 ID。
我已经尝试在 JMESPath 中查找以过滤掉一个特定的文件系统,但似乎查询的结构以及输出的结构对我来说有点难以使用。
这是我到目前为止的查询:
aws efs describe-file-systems --query FileSystems[?Name=='dev-four'].FileSystemId --region us-east-1 --output text
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会将文件系统 ID 作为单个字符串获取,但我不断收到错误:
Bad value for --query FileSystems[?Name==dev-sg].FileSystemId: Bad jmespath expression: Unknown token '-':
FileSystems[?Name==dev-four].FileSystemId
Run Code Online (Sandbox Code Playgroud)
我不知道如何以不同的方式执行 JMES。
我正在尝试使用带查询的 AWS CLI 运行命令。该命令可能很简单,例如aws s3api list-buckets --query 'sum(Versions[*].Size)'
但是,有时某些值可能会返回 null。在上面的示例中,当没有任何内容时,size 可以为 null,命令将返回以下错误:
In function sum(), invalid type for value: None, expected one of: ['array-number'], received: "null"
我怎样才能给它一个默认值?如果实际值为空,我想将其设置为,0以便结果中有一些值而不是错误。
我正在尝试查询在特定日期之后创建的快照,但它没有返回任何结果。我正在尝试的查询如下:
aws ec2 describe-snapshots --query 'Snapshots[?StartTime >= `2017-06-01`].{id:SnapshotId}' --owner-ids nnnnnnnnnnn
Run Code Online (Sandbox Code Playgroud)
如果我删除 --query 部分,则会返回所有快照,因此我知道这与查询有关。
我尝试检查JMESPath 文档,但没有太多关于日期操作的内容。我还尝试复制此处示例中的语法,但无济于事。
谢谢,
由于 aws 日志 get-query-results,我有以下数据结构:
{
"status": "Complete",
"statistics": {
"recordsMatched": 2.0,
"recordsScanned": 13281.0,
"bytesScanned": 7526096.0
},
"results": [
[
{
"field": "time",
"value": "2019-01-31T21:53:01.136Z"
},
{
"field": "requestId",
"value": "a9c233f7-0b1b-3326-9b0f-eba428e4572c"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
[
{
"field": "time",
"value": "2019-01-25T13:13:01.062Z"
},
{
"field": "requestId",
"value": "a4332628-1b9b-a9c2-0feb-0cd4a3f7cb63"
},
{
"field": "logLevel",
"value": "INFO"
},
{
"field": "callerId",
"value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
}
],
]
}
Run Code Online (Sandbox Code Playgroud)
AWS CLI 支持 JMESPath 语言来过滤输出。我需要应用一个查询字符串,在返回的“结果”中过滤包含“callerId”作为“字段”的对象,检索“value”属性并获得以下输出:
[
{
callerId: …Run Code Online (Sandbox Code Playgroud) JSON 有很多查询语言,例如 JMES Path 和 JSON Path,但我发现的没有一个让我感兴趣,例如 JSON Path 不允许多选查询(我无法返回具有不同类型元素的列表 [汽车、飞机、船])和 JMES 路径与 JSON 路径相比确实更简单,并且允许多选,但不允许访问父节点,例如 .. 或parent(@) 或 $(对于源)。所以我想要一种可以同时完成这两个任务的语言,如果可能有一种像 JMES Path 这样简单的查询语言,但如果只有一种并且是最困难的一种,那没关系,我会接受它!
PS:我用javascript工作!
拥有一个如下所示的对象:
{
"pick": "a",
"elements": [
{"id": "a", "label": "First"},
{"id": "b", "label": "Second"}
]
}
Run Code Online (Sandbox Code Playgroud)
如何检索elements列表中id等于 值的项目pick?
我正在尝试类似的事情:
elements[?id == pick]
Run Code Online (Sandbox Code Playgroud)
但是,显然,比较器右侧的表达式是相对于根据我的过滤器表达式测试的对象进行评估的。
我怎样才能实现我想要的?如果这不可能开箱即用,您对我应该从哪里开始扩展 JMESPath 有什么建议吗?谢谢你!
在这里发现了一些类似的问题,但没有一个具体回答这个问题。我有几个安全组,它们的规则允许来自所有源 IP 的所有流量。我想编写一个简单的 CLI 命令来为我获取这些内容。
在搜索了一些来源之后,我确信这个命令可以工作:
$ aws ec2 describe-security-groups
--filters "Name=ip-permission.protocol,Values=-1"
--query 'SecurityGroups[?length(IpPermissions[?IpProtocol==`-1` && contains(IpRanges[].CidrIp, `0.0.0.0/0`)]) > `0`]'
[]
Run Code Online (Sandbox Code Playgroud)
但是,这会返回一个空列表。事实上,将范围缩小到查询的第一个条件会返回一个空列表
$ aws ec2 describe-security-groups
--filters "Name=ip-permission.protocol,Values=-1"
--query 'SecurityGroups[?length(IpPermissions[?IpProtocol==`-1`]) > `0`]'
[]
Run Code Online (Sandbox Code Playgroud)
即使取出上面的查询(我认为与过滤器匹配)会返回几个安全组:
aws ec2 describe-security-groups
--filters "Name=ip-permission.protocol,Values=-1"
[sg-1, sg-2, sg-3 ...]
Run Code Online (Sandbox Code Playgroud)
我不明白什么?提前致谢。
更新
这个新的查询更接近。它正在检索同时具有允许所有协议的规则和允许来自所有 IP 的流量的规则的每个安全组。但是,当前正在检索的安全组并未按照我的要求在同一规则中明确具有这两个条件。
aws ec2 describe-security-groups
--filters "Name=ip-permission.protocol,Values=-1"
--query "SecurityGroups[?IpPermissions[?IpProtocol == '-1']] |
[?length(IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`)]) > `0`]"
Run Code Online (Sandbox Code Playgroud)
另外,我认为向那些不熟悉 JSON 对象结构的人展示 JSON 对象会很有帮助。您可以在此页面底部找到它
command-line-interface amazon-ec2 amazon-web-services jmespath
我应该使用什么查询来获取以特定字符串开头的所有 CloudFormation 堆栈?
我尝试了以下查询,但它总是返回一个空数组:
aws cloudformation describe-stacks --no-paginate --query "Stacks[?StackName!='null']|[?starts_with(StackName,'HD-') == 'true']"
Run Code Online (Sandbox Code Playgroud)
我们帐户中的所有堆栈都以“HD-”开头,因此这应该返回与
aws cloudformation describe-stacks --no-paginate
Run Code Online (Sandbox Code Playgroud)
但它返回
[]
Run Code Online (Sandbox Code Playgroud) jmespath ×10
aws-cli ×7
amazon-ec2 ×3
json ×3
amazon-efs ×1
arrays ×1
jq ×1
jsonpath ×1
pandas ×1
python ×1