AWS CLI 查找包含允许来自所有来源的所有流量的规则的所有安全组

Pet*_*ter 3 command-line-interface amazon-ec2 amazon-web-services 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 对象会很有帮助。您可以在此页面底部找到它

Pet*_*ter 7

事实证明,我原来的命令实际上非常接近。我用函数取出了逻辑length(),现在它可以工作了。

aws ec2 describe-security-groups
    --filters "Name=ip-permission.protocol,Values=-1"
    --query "SecurityGroups[?IpPermissions[?IpProtocol == '-1' &&
      contains(IpRanges[].CidrIp,'0.0.0.0/0')]].GroupId"
Run Code Online (Sandbox Code Playgroud)

希望这对将来的人有帮助。