أنا على وشك تمزيق شعري بسبب هذا. تحتوي جميع مثيلاتي على علامة باسم "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'
لكن هذا لا يعمل.
هذا بالتأكيد أمر صعب! تمكنت من ذلك بالتعبير التالي:
"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')][]
التعليق الأكثر فائدة
هذا بالتأكيد أمر صعب! تمكنت من ذلك بالتعبير التالي:
هذا طويل ، لذا سأقسمه قطعة قطعة. بالنسبة للمبتدئين ، دعنا نستخدم هذه البيانات النموذجية:
أولاً ، نريد الحصول على قائمة المثيلات ، لذلك نبدأ بـ
Reservations[].Instances[]
:نريد الآن العلامات التي لها مفتاح بالقيمة "البيانات":
.Tags[?Key == 'Data']
للتعبير الكاملReservations[].Instances[].Tags[?Key == 'Data']
والنتيجة:نريد الآن أيضًا أن تحتوي قيمة هذه العلامة على "foo = yes" لذلك نضيف الشرط
&& contains(Value, 'foo=yes')
للتعبير الكاملReservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
والنتيجة:حسنًا ، لنقم الآن بتسوية هذه القائمة بـ
[]
للتعبير الكاملReservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
والنتيجة:حسنًا ، لدينا الآن العلامات التي نريدها ، ولكن ما نريده هو بيانات المثيل الكاملة. لذلك دعونا نقل مرشح العلامة هذا مرة أخرى كمرشح على الحالات. إذن ، أصبح التعبير الكامل الآن
Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]
مع النتيجة:لشرح أكثر قليلاً ، يتحقق
?
وجود قيمة صحيحة. بالنسبة لتلك الحالات التي لا تحتوي على العلامة المناسبة ، سيتم إرجاعnull
?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
null
، وهي قيمة خاطئة.كل ما تبقى الآن هو تسوية هذه القائمة وتحديد معرفات المثيل بـ
[].InstanceId
للتعبير الكامل"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
والنتيجة:وانتهينا!