Aws-cli: Saya ingin memfilter instance dengan mencocokkan substring dari nilai tag

Dibuat pada 29 Sep 2016  ·  3Komentar  ·  Sumber: aws/aws-cli

Aku akan merobek rambutku karena ini. Semua instance saya memiliki tag bernama "Data", dan nilai "Data" salah satu dari yang berikut: "foo=yes,bar=yes", "foo=yes,bar=no", "foo=no,bar =yes", "foo=no,bar=no", saya ingin menjalankan --query yang mengembalikan InstanceId untuk setiap instance yang memiliki nilai tag "Data" yang berisi "foo=yes". Jadi sesuatu seperti

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

Tapi itu tidak berhasil.

guidance

Komentar yang paling membantu

Itu pasti salah satu yang rumit! Saya mengelolanya dengan ekspresi berikut:

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

Itu panjang, jadi saya akan memecahnya, sepotong demi sepotong. Sebagai permulaan, mari gunakan contoh data ini:

{
    "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"}
            ]
        }
    ]}]
}

Pertama, kita ingin mendapatkan daftar instance, jadi kita mulai dengan 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"
  }
]

Sekarang kita ingin tag yang memiliki Kunci dengan nilai "Data": .Tags[?Key == 'Data'] untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data'] dan hasilnya:

[
  [
    {
      "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"
    }
  ]
]

Sekarang kita juga ingin nilai tag itu berisi "foo=yes" jadi kita tambahkan kondisi && contains(Value, 'foo=yes') untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')] dan hasilnya:

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

Baiklah, sekarang mari kita ratakan daftar itu dengan [] untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] dan hasilnya:

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

Baiklah, jadi sekarang kami memiliki tag yang kami inginkan, tetapi yang kami inginkan adalah data instance lengkap. Jadi mari pindahkan filter tag itu kembali sebagai filter pada instance. Jadi ekspresi lengkapnya sekarang adalah Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]] dengan hasil:

[
  [
    {
      "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"
    }
  ]
]

Untuk menjelaskan lebih lanjut, ? sedang memeriksa nilai kebenaran. Untuk instance yang tidak memiliki tag yang tepat, ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] akan dikembalikan null , nilai yang salah.

Sekarang yang tersisa untuk dilakukan adalah meratakan daftar itu dan memilih id instance dengan [].InstanceId untuk ekspresi penuh "Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId" dan hasilnya:

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

Dan kita sudah selesai!

Semua 3 komentar

Itu pasti salah satu yang rumit! Saya mengelolanya dengan ekspresi berikut:

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

Itu panjang, jadi saya akan memecahnya, sepotong demi sepotong. Sebagai permulaan, mari gunakan contoh data ini:

{
    "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"}
            ]
        }
    ]}]
}

Pertama, kita ingin mendapatkan daftar instance, jadi kita mulai dengan 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"
  }
]

Sekarang kita ingin tag yang memiliki Kunci dengan nilai "Data": .Tags[?Key == 'Data'] untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data'] dan hasilnya:

[
  [
    {
      "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"
    }
  ]
]

Sekarang kita juga ingin nilai tag itu berisi "foo=yes" jadi kita tambahkan kondisi && contains(Value, 'foo=yes') untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')] dan hasilnya:

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

Baiklah, sekarang mari kita ratakan daftar itu dengan [] untuk ekspresi penuh Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] dan hasilnya:

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

Baiklah, jadi sekarang kami memiliki tag yang kami inginkan, tetapi yang kami inginkan adalah data instance lengkap. Jadi mari pindahkan filter tag itu kembali sebagai filter pada instance. Jadi ekspresi lengkapnya sekarang adalah Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]] dengan hasil:

[
  [
    {
      "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"
    }
  ]
]

Untuk menjelaskan lebih lanjut, ? sedang memeriksa nilai kebenaran. Untuk instance yang tidak memiliki tag yang tepat, ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] akan dikembalikan null , nilai yang salah.

Sekarang yang tersisa untuk dilakukan adalah meratakan daftar itu dan memilih id instance dengan [].InstanceId untuk ekspresi penuh "Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId" dan hasilnya:

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

Dan kita sudah selesai!

Wow Keren! Langkah Tags[?Key == 'Data' && contains(Value, 'foo=yes')] adalah tempat saya tergelincir. Terima kasih!

* memperbarui *

Untuk tujuan saya, berikut ini adalah pendekatan yang jauh lebih mudah (inilah yang saya dapatkan dari mengakses utas tertanggal 2+ tahun yang lalu):

--filter "Name=tag:aws:cloudformation:stack-name,Values=*$1*"
* pesan asli *

Ini tampaknya tidak lagi berfungsi. Ini bekerja sampai langkah terakhir di mana [?Tag diganti dengan .Tags .. ketika saya menjalankannya untuk kasus penggunaan saya, saya mendapatkan satu set kosong (setelah berhasil mendapatkan apa yang saya harapkan dari
Reservations[].Instances[].Tags[?Key == 'aws:cloudformation:stack-name' && contains(Value, 'target')][]

Apakah halaman ini membantu?
0 / 5 - 0 peringkat