Aws-cli: タグ値の部分文字列を照合してインスタンスをフィルタリングしたい

作成日 2016年09月29日  ·  3コメント  ·  ソース: aws/aws-cli

私はこれで髪を引き裂こうとしています。 すべてのインスタンスには「Data」という名前のタグがあり、「Data」の値は「foo = yes、bar = yes」、「foo = yes、bar = no」、「foo = no、bar」のいずれかです。 = yes "、" foo = no、bar = no "、 --queryを実行して、" foo = yes "を含むタグ" Data "値を持つインスタンスのInstanceIdを返します。 だから何かのような

aws --region us-east-1 ec2 describe-instances --query 'Reservations[].Instances[].[?contains(Tags[?Key==`Data`].Value, `foo=yes` == `true`)].InstanceId'

しかし、それはうまくいきません。

guidance

最も参考になるコメント

それは確かにトリッキーなものです! 私はそれを次の式で管理しました:

"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"

それは長いので、少しずつ分割していきます。 手始めに、次のサンプルデータを使用してみましょう。

{
    "Reservations": [{"Instances": [
        {
            "InstanceId": "id-target1",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=no"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-target2",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=yes"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-invalid1",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=no"},
                {"Key": "Name", "Value": "invalid"}
            ]
        },
        {
            "InstanceId": "id-invalid2",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=yes"},
                {"Key": "Name", "Value": "invalid"}
            ]
        }
    ]}]
}

まず、インスタンスリストを取得したいので、 Reservations[].Instances[]から始めます。

[
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=no",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target1"
  },
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target2"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=no",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid1"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid2"
  }
]

今、私たちは値「データ」とのキーを持っているタグをしたい: .Tags[?Key == 'Data']完全な表現のためのReservations[].Instances[].Tags[?Key == 'Data']と結果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=yes",
      "Key": "Data"
    }
  ]
]

ここで、そのタグの値に「foo = yes」を含める必要があるため、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]の条件&& contains(Value, 'foo=yes') Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]と結果を追加します。

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [],
  []
]

さて、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]とその結果について、そのリストを[]でフラット化しましょう。

[
  {
    "Value": "foo=yes,bar=no",
    "Key": "Data"
  },
  {
    "Value": "foo=yes,bar=yes",
    "Key": "Data"
  }
]

さて、これで必要なタグができましたが、完全なインスタンスデータが必要です。 それでは、そのタグフィルターをインスタンスのフィルターとして戻しましょう。 したがって、完全な式はReservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]なり、結果は次のようになります。

[
  [
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=no",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target1"
    },
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=yes",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target2"
    }
  ]
]

もう少し説明すると、 ?は真の値をチェックしています。 適切なタグがないインスタンスの場合、 ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]は偽の値であるnullを返します。

あとは、そのリストをフラット化して、完全な式"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"と結果の[].InstanceIdを含むインスタンスIDを選択するだけです。

[
  "id-target1",
  "id-target2"
]

これで完了です。

全てのコメント3件

それは確かにトリッキーなものです! 私はそれを次の式で管理しました:

"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"

それは長いので、少しずつ分割していきます。 手始めに、次のサンプルデータを使用してみましょう。

{
    "Reservations": [{"Instances": [
        {
            "InstanceId": "id-target1",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=no"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-target2",
            "Tags": [
                {"Key": "Data", "Value": "foo=yes,bar=yes"},
                {"Key": "Name", "Value": "target"}
            ]
        },
        {
            "InstanceId": "id-invalid1",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=no"},
                {"Key": "Name", "Value": "invalid"}
            ]
        },
        {
            "InstanceId": "id-invalid2",
            "Tags": [
                {"Key": "Data", "Value": "foo=no,bar=yes"},
                {"Key": "Name", "Value": "invalid"}
            ]
        }
    ]}]
}

まず、インスタンスリストを取得したいので、 Reservations[].Instances[]から始めます。

[
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=no",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target1"
  },
  {
    "Tags": [
      {
        "Value": "foo=yes,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "target",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-target2"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=no",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid1"
  },
  {
    "Tags": [
      {
        "Value": "foo=no,bar=yes",
        "Key": "Data"
      },
      {
        "Value": "invalid",
        "Key": "Name"
      }
    ],
    "InstanceId": "id-invalid2"
  }
]

今、私たちは値「データ」とのキーを持っているタグをしたい: .Tags[?Key == 'Data']完全な表現のためのReservations[].Instances[].Tags[?Key == 'Data']と結果:

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=no,bar=yes",
      "Key": "Data"
    }
  ]
]

ここで、そのタグの値に「foo = yes」を含める必要があるため、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]の条件&& contains(Value, 'foo=yes') Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]と結果を追加します。

[
  [
    {
      "Value": "foo=yes,bar=no",
      "Key": "Data"
    }
  ],
  [
    {
      "Value": "foo=yes,bar=yes",
      "Key": "Data"
    }
  ],
  [],
  []
]

さて、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]とその結果について、そのリストを[]でフラット化しましょう。

[
  {
    "Value": "foo=yes,bar=no",
    "Key": "Data"
  },
  {
    "Value": "foo=yes,bar=yes",
    "Key": "Data"
  }
]

さて、これで必要なタグができましたが、完全なインスタンスデータが必要です。 それでは、そのタグフィルターをインスタンスのフィルターとして戻しましょう。 したがって、完全な式はReservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]なり、結果は次のようになります。

[
  [
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=no",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target1"
    },
    {
      "Tags": [
        {
          "Value": "foo=yes,bar=yes",
          "Key": "Data"
        },
        {
          "Value": "target",
          "Key": "Name"
        }
      ],
      "InstanceId": "id-target2"
    }
  ]
]

もう少し説明すると、 ?は真の値をチェックしています。 適切なタグがないインスタンスの場合、 ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]は偽の値であるnullを返します。

あとは、そのリストをフラット化して、完全な式"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"と結果の[].InstanceIdを含むインスタンスIDを選択するだけです。

[
  "id-target1",
  "id-target2"
]

これで完了です。

うわ〜すごい! Tags[?Key == 'Data' && contains(Value, 'foo=yes')]ステップは私が脱線したところです。 ありがとうございました!

* アップデート *

私の目的では、以下ははるかに簡単なアプローチでした(これは、2年以上前の日付のスレッドにアクセスすることで得られるものです)。

--filter "Name=tag:aws:cloudformation:stack-name,Values=*$1*"
* オリジナルメッセージ *

これは機能していないようです。 [?Tagsが.Tagsに置き換えられた最後のステップまでずっと機能しました..ユースケースで実行すると、空のセットが取得されます(期待どおりの結果が得られた後)
Reservations[].Instances[].Tags[?Key == 'aws:cloudformation:stack-name' && contains(Value, 'target')][]

このページは役に立ちましたか?
0 / 5 - 0 評価