개요
AWS CLI 관련해서
2022.09.11 - [aws cli] 다중 조건 필터링
2022.09.26 - [JMESPath] JSON 쿼리 기본 - 1
2022.09.27 - [JMESPath] Projections
2022.09.28 - [JMESPath] JSON 쿼리 기본 - 2
등의 글로 정리를 했었는데, 아무래도 TAG를 이용해 필터링을 할 때마다 헷갈려서 예시로 정리해두려고 한다.
명령어는 ec2 describe-instances 기준으로 작성한다.
--filter
특정 TAG 키-값으로 필터링
aws ec2 describe-instances \
--filter Name=tag:<KEY>,Values=<VALUE>
# 값이 여럿인 경우 (OR)
aws ec2 describe-instances \
--filter Name=tag:<KEY>,Values=<VALUE>,<VALUE>...
참고로 Values는 와일드카드를 지원하기 때문에 정확히 특정 문자열과 일치하는 것뿐만 아니라 특정 문자열을 포함하는 경우도 필터링할 수 있다. 아래 예시는 EC2 Name 태그 값에 dev라는 문자열이 포함되는 인스턴스를 찾을 때 사용한다.
# 예시
aws ec2 describe-instances \
--filter Name=tag:Name,Values=*dev*
특정 TAG 키 존재 여부 필터링
Values는 와일드카드를 지원하므로 특정 TAG가 존재하는지를 확인할 때는 아래와 같이 확인할 수 있다.
aws ec2 describe-instances \
--filter Name=tag:<KEY>,Values=*
다만 그 반대인 특정 TAG가 존재하지 않는지를 확인하는 건 어려운 것 같다.
--query
특정 TAG 키-값으로 필터링
JMESPath를 사용하여 필터링할 때에는 && 연산자로 TAG의 키-값이 모두 일치하는지 확인해야 한다.
OR 연산은 || 연산자이다.
aws ec2 describe-instances \
--query "Reservations[].Instances[?Tags[?Key=='<TAG KEY>' && Value=='<TAG KEY>']]"
# 예시
aws ec2 describe-instances \
--query "Reservations[].Instances[?Tags[?Key=='<TAG KEY>' && Value=='<TAG KEY>']].[InstanceId]"
# 출력
[
[],
[],
[
[
"i-09067e460000000002"
]
],
[
[
"i-0000000000000004fb"
]
],
[]
]
+ 조건에 맞지 않는 경우가 있을 때는 빈 JSON array가 포함되어 출력되는데, 파이프를 이용하면 깔끔하게 출력할 수 있다.
aws ec2 describe-instances \
--query "Reservations[].Instances[?Tags[?Key=='<TAG KEY>' && Value=='<TAG VALUE>']].[InstanceId] | []"
# 출력
[
[
"i-09000000000000052"
],
[
"i-0000000300000000"
]
]
특정 TAG 키 존재 여부 필터링
특정 TAG 키가 존재하는 인스턴스만 필터링할 때는 Key 조건만 확인하거나, 보다 정확하게 확인하고 싶을 때는 not_null 함수까지 사용하여 확인하면 된다.
aws ec2 describe-instances \
--query "Reservations[].Instances[?Tags[?Key=='<TAG KEY>']] | []"
# not_null
aws ec2 describe-instances \
--query "Reservations[].Instances[?not_null(Tags[?Key=='<TAG KEY>'].Value)] | []"
반대로 특정 TAG 키가 존재하지 않는 인스턴스만 필터링할 때는 위 조건을 부정으로 바꿔 사용하면 된다..
aws ec2 describe-instances \
--query "Reservations[].Instances[?!(Tags[?Key=='<TAG KEY>'])] | []"
# not_null
aws ec2 describe-instances \
--query "Reservations[].Instances[?!(not_null(Tags[?Key=='<TAG KEY>'].Value))] | []"
출력 형식 필터링
Tag를 출력할 때에는 출력할 태그에 접근한 뒤, 첫번째 요소의 값을 출력하면 된다.
aws ec2 describe-instances \
--query "Reservations[].Instances[?!(Tags[?Key=='TAG KEY'])].{Tags:Tags[?Key=='TAG KEY']|[0].Value} | []"
# JSON Array
aws ec2 describe-instances \
--query "Reservations[].Instances[?!(Tags[?Key=='TAG KEY'])].[Tags[?Key=='TAG KEY']|[0].Value] | []"
참고 문서
https://www.middlewareinventory.com/blog/aws-cli-ec2/
https://stackoverflow.com/questions/42396971/jmespath-find-where-not-exists
https://docs.aws.amazon.com/ko_kr/cli/v1/userguide/cli-usage-filter.html