λλ μ΄κ²μ λν΄ λ΄ λ¨Έλ¦¬μΉ΄λ½μ λ½μ μμ μ΄λ€. λ΄ λͺ¨λ μΈμ€ν΄μ€μλ "Data"λΌλ νκ·Έκ° μκ³ "Data" κ°μ "foo=yes,bar=yes", "foo=yes,bar=no", "foo=no,bar" μ€ νλμ
λλ€. =yes", "foo=no,bar=no", "foo=yes"λ₯Ό ν¬ν¨νλ νκ·Έ "Data" κ°μ΄ μλ λͺ¨λ μΈμ€ν΄μ€μ λν΄ InstanceIdλ₯Ό λ°ννλ --query
λ₯Ό μ€ννκ³ μΆμ΅λλ€. κ·Έλμ λκ°
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"
}
]
μ΄μ κ°μ΄ "Data"μΈ ν€κ° μλ νκ·Έκ° νμν©λλ€. .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')
쑰건μ μΆκ°ν©λλ€.
[
[
{
"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λ₯Ό μ ννκΈ° "Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
νλ©΄ λ©λλ€.
[
"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')][]
κ°μ₯ μ μ©ν λκΈ
κ·Έκ²μ νμ€ν κΉλ€λ‘μ΄ κ²μ λλ€! λλ λ€μκ³Ό κ°μ ννμΌλ‘ κ·Έκ²μ κ΄λ¦¬νλ€.
λ무 κΈΈμ΄μ νλμ© μͺΌκ°μ μλλ€. μ°μ λ€μ μν λ°μ΄ν°λ₯Ό μ¬μ©νκ² μ΅λλ€.
λ¨Όμ μΈμ€ν΄μ€ λͺ©λ‘μ κ°μ Έμ€λ €κ³ νλ―λ‘
Reservations[].Instances[]
.μ΄μ κ°μ΄ "Data"μΈ ν€κ° μλ νκ·Έκ° νμν©λλ€.
.Tags[?Key == 'Data']
μ 체 ννμμ λνReservations[].Instances[].Tags[?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')][]
μ 체 ννμκ³Ό κ²°κ³Όμ λν΄[]
λ‘ ν΄λΉ λͺ©λ‘μ νλ©΄ννκ² μ΅λλ€.μ, μ΄μ μνλ νκ·Έκ° μμ§λ§ μ 체 μΈμ€ν΄μ€ λ°μ΄ν°κ° νμν©λλ€. λ°λΌμ ν΄λΉ νκ·Έ νν°λ₯Ό μΈμ€ν΄μ€μ λν νν°λ‘ λ€μ μ΄λν μ μμ΅λλ€. λ°λΌμ μ 체 ννμμ μ΄μ
Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]
μ΄λ©° κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.μ‘°κΈ λ μ€λͺ νμλ©΄
?
λ μ°Έκ°μ νμΈν©λλ€. μ μ ν νκ·Έκ° μλ μΈμ€ν΄μ€μ κ²½μ°?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
λ μλͺ»λ κ°μΈnull
λ₯Ό λ°νν©λλ€.μ΄μ ν΄λΉ λͺ©λ‘μ λ³ν©νκ³ μ 체 ννμ
"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
λ° κ²°κ³Όμ λν΄[].InstanceId
λ‘ μΈμ€ν΄μ€ IDλ₯Ό μ ννκΈ°"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
νλ©΄ λ©λλ€.κ·Έλ¦¬κ³ μ°λ¦¬λ λλ¬μ΅λλ€!