AWS

[aws cli] EC2 - TAG 필터링

비번변경 2022. 11. 28. 22:38

개요

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