【问题标题】:aws ec2 describe-instances: how to filter *out* spot instances?aws ec2 describe-instances:如何过滤 *out* 现场实例?
【发布时间】:2017-09-13 16:31:28
【问题描述】:

我可以通过发出以下 CLI 命令列出我的所有 Spot 实例:

aws ec2 describe-instances --filter Name="instance-lifecycle",Values="spot"

但是我怎样才能显示我所有的 not 现场实例?这些都不起作用:

aws ec2 describe-instances --filter Name="instance-lifecycle",Values=""
aws ec2 describe-instances --filter Name="instance-lifecycle",Values="?"

(对于非现场实例,instance-lifecycle 为空/null,spot-instance-request-id 类似)

【问题讨论】:

  • 在 CLI 查询中尝试过 Values="normal"
  • 这会返回一个空响应,所以它看起来不起作用。
  • 您能否确认以下语法是否满足您的要求?

标签: amazon-web-services amazon-ec2 command-line-interface


【解决方案1】:

AWS CLI 和控制台不适用于过滤实例生命周期“正常”。

所以我使用 jq 工具而不是 '--filter Key=instance-lifecycle,Values=scheduled'

aws ec2 describe-instances --filter Name="instance-state-code",Values="16" \
| jq '.Reservations[]?.Instances[]? | select(.InstanceLifecycle == null)| .InstanceId' -r

【讨论】:

    【解决方案2】:

    看来你可以通过--query 选项来做到这一点。

    我一直在努力寻找关于选项本身的良好文档,但我设法发现您可以在其中传递过滤器。

    例如,这 2 个命令将返回相同的结果:

    aws ec2 describe-instances --filters "[{\"Name\": \"tag:role\", \"Values\": [\"web\"]}, {\"Name\":\"instance-state-name\", \"Values\": [\"running\"]}]" --query='Reservations[*].Instances[*].[LaunchTime,PrivateIpAddress][]'
    
    aws ec2 describe-instances --filters "[{\"Name\": \"tag:role\", \"Values\": [\"web\"]}]" --query='Reservations[*].Instances[?InstanceStateName=="running"].[LaunchTime,PrivateIpAddress][]'
    

    这还允许我们在实例输出中过滤没有指定标签的项目(例如,“正常”实例没有“InstanceLifecycle”属性,因此返回null):

    aws ec2 describe-instances --filters "[{\"Name\": \"tag:role\", \"Values\": [\"web\"]}, {\"Name\":\"instance-state-name\", \"Values\": [\"running\"]}]" --query='Reservations[*].Instances[?!InstanceLifecycle].[LaunchTime,PrivateIpAddress][]'
    

    在查询中注明Instances[?!InstanceLifecycle]

    【讨论】:

    • 除了使用查询选项之外,现在还有其他方法可以过滤掉现场实例吗?
    • @D.prd 我不知道。这个解决方案本身并不容易获得,我还没有看到任何其他解决方案。希望亚马逊能在某个时候让这一切变得更简单。
    • 我不得不稍微修改一下上面的内容,以仅获取现场实例aws ec2 describe-instances --filters "Name=instance-lifecycle,Values=spot" --filters "Name=instance-state-name,Values=running" --query='Reservations[*].Instances[?InstanceLifecycle].[InstanceId]'
    【解决方案3】:

    如果您在 Windows 平台上,您可以使用以下命令列出所有按需实例的实例

    aws ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId,InstanceLifecycle]" --output table --region eu-west-1 | find "None"
    

    同样,对于所有的现场实例

    aws ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId,InstanceLifecycle]" --output table --region eu-west-1 | find "spot"
    

    在 Linux 环境下可能会得到以下结果

    aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, InstanceLifecycle]' --output text |
    %{if ($_.split("`t")[1] -match "None") { $_.split("`t")[2]; } }
    

    注意:我没有测试 Linux 环境命令,因为我目前无法访问 Linux

    【讨论】:

    • 这会在客户端进行过滤,我试图避免这种情况。
    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 2019-06-14
    • 2023-03-03
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多