Aws-cli: أريد تصفية المثيلات عن طريق مطابقة سلسلة فرعية لقيمة العلامة

تم إنشاؤها على ٢٩ سبتمبر ٢٠١٦  ·  3تعليقات  ·  مصدر: aws/aws-cli

أنا على وشك تمزيق شعري بسبب هذا. تحتوي جميع مثيلاتي على علامة باسم "Data" ، وقيمة "Data" واحدة مما يلي: "foo = yes، bar = yes"، "foo = yes، bar = no"، "foo = no، bar = yes "،" foo = no، bar = no "، أريد تشغيل --query الذي يقوم بإرجاع InstanceId لأي مثيل يحتوي على قيمة علامة" Data "تحتوي على" foo = yes ". لذلك شيء من هذا القبيل

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" لذلك نضيف الشرط && 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"
    }
  ]
]

لشرح أكثر قليلاً ، يتحقق ? وجود قيمة صحيحة. بالنسبة لتلك الحالات التي لا تحتوي على العلامة المناسبة ، سيتم إرجاع null ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] null ، وهي قيمة خاطئة.

كل ما تبقى الآن هو تسوية هذه القائمة وتحديد معرفات المثيل بـ [].InstanceId للتعبير الكامل "Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId" والنتيجة:

[
  "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" لذلك نضيف الشرط && 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"
    }
  ]
]

لشرح أكثر قليلاً ، يتحقق ? وجود قيمة صحيحة. بالنسبة لتلك الحالات التي لا تحتوي على العلامة المناسبة ، سيتم إرجاع null ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][] null ، وهي قيمة خاطئة.

كل ما تبقى الآن هو تسوية هذه القائمة وتحديد معرفات المثيل بـ [].InstanceId للتعبير الكامل "Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId" والنتيجة:

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

وانتهينا!

واو رائع! الخطوة Tags[?Key == 'Data' && contains(Value, 'foo=yes')] هي المكان الذي خرجت فيه عن مسارها. شكرا لك!

* تحديث *

بالنسبة إلى أغراضي ، كان ما يلي نهجًا أسهل بكثير (هذا ما أحصل عليه من الوصول إلى سلسلة رسائل مؤرخة منذ أكثر من عامين):

--filter "Name=tag:aws:cloudformation:stack-name,Values=*$1*"
* رسالة أصلية *

يبدو أن هذا لم يعد يعمل. عملت طوال الطريق حتى الخطوة الأخيرة حيث [؟ تم استبدال العلامات بـ. العلامات .. عندما أقوم بتشغيلها لحالة الاستخدام الخاصة بي ، أحصل على مجموعة فارغة (بعد الحصول بنجاح على ما أتوقع
Reservations[].Instances[].Tags[?Key == 'aws:cloudformation:stack-name' && contains(Value, 'target')][]

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات