서론
AWS CLI도큐먼트에서 다중 조건 (Multi Condition)에 대한 정보를 찾기 어려워서 정리하여 작성했다.
모든 예시는 aws ec2 describe-instances를 기준으로 진행했지만 aws cli 에서 filter, query 방식은 대동소이하다.
Filter 다중 조건
EC2 목록 전체가 아닌 원하는 인스턴스 목록만 출력할 때 사용한다.
•
--filter 뒤에 Name=[속성 이름],Values=[조건] 형태로 작성한다.
•
Tag를 필터링 하는 경우 Name=tag:[태그 이름],Values=[조건] 형태로 작성한다.
•
다중 조건은 띄어쓰기로 구분한다. (키-값 쌍을 쌍따옴표" " 로 묶으면 보기 편하다.)
--filters "Name=instance-state-name,Values=running" "Name=tag:backup,Values=yes"
•
예시
#Instance 상태가 Running이면서 Backup이라는 태그의 값이 yes인 EC2를 조회하는 명령어
aws ec2 describe-instances --region us-west-2 --filters Name=instance-state-name,Values=running Name=tag:backup,Values=yes
Shell
복사
Query 다중 조건
--query 옵션은 JMESPath 쿼리문법을 따른다.
AWS CLI 모든 범위에서 지원하는 파라미터로 원하는 조건에 맞춰 값을 쿼리한다. 사용한다. (출력 리스트 목록 or 출력 속성 목록을 다룬다.)
•
쿼리 옵션은 --query 'Reservations[*].Instances[*][*]'와 같은 형식으로 사용한다.
[] 내부에 * 대신 원하는 필터 조건을 넣는다.
•
Tag를 쿼리하는 경우 --query 'Reservations[].Instances[][Tags[?Key == `Name`]]' 와 같은 형식으로 작성한다.
•
다중 조건은 컴마로 구분해서 작성한다.
--query 'Reservations[].Instances[][InstanceId,Tags[?Key == `dcv-user`]]'
•
예시
# Name 태그가 Null이 아닌 EC2를 쿼리 -> 결과값 중 InstanceId,backup 태그의 값, connection 태그의 값만 출력하는 쿼리문
aws ec2 describe-instances --region ap-northeast-2 --query 'Reservations[*].Instances[?not_null(Tags[?Key == `Name`].Value)].[InstanceId,Tags[?Key == `backup`]|[0].Value,Tags[?Key == `connection`]|[0].Value]'
Shell
복사
대소비교
•
Query 내부에서 대소 비교를 위한 조건은 다음과 같이 사용한다.
#Linux date 함수의 시간 기준으로 이보다 일찍 생성된 인스턴스를 쿼리하는 옵션
--query 'Reservations[].Instances[?LaunchTime<=`date`][]'
#예시 : 현재 시간보다 12시간 전에 켜진 인스턴스 중 실행중인 인스턴스 쿼리 (장기 사용 EC2)
date10=$(date --d="-12 hours" +%Y-%m-%dT%H-%M)
aws ec2 describe-instances --region us-west-2 --filters "Name=instance-state-name,Values=running" --query 'Reservations[].Instances[?LaunchTime<=`date10`]'
Shell
복사
결론
•
Filter는 ec2 describe-instances 내부에서, Query는 AWS CLI 전체에서 사용된다.
•
→ 그래서 filter는 전처리, query는 후처리의 느낌이 강하다. (다음 포스팅에서 짧게 다뤄볼 예정)
•
이번에 Filter와 Query를 공부하며 --query 옵션이 JMESPath 문법을 따르는 것을 처음 알았는데 덕분에 다음부터 AWS CLI ~~ 말고도 JMESPath ~~~키워드로 구글링 가능..!
•
AWS CLI Document 에서 명령어의 자세한 설명을 제공하지만, 더 많은 예제를 제공했으면 좋겠다. 대부분 정말 기초적인 옵션에 대한 사용법만 제공하고 심화 예제는 찾아보기 힘들다...