JQ를 이용한 AWS CLI 출력 필터링 마스터하기: 고급 기술

JQ 통합을 마스터하여 AWS CLI의 잠재력을 최대한 활용해 보세요. 이 가이드는 AWS 명령에서 나오는 복잡한 JSON 출력을 구문 분석, 필터링 및 재구성하기 위한 고급의 실용적인 기술을 제공합니다. 배열 반복, 조건부 선택 사용 및 데이터를 CSV로 형식화하는 방법을 학습하여 강력한 자동화와 뛰어난 데이터 분석을 실현할 수 있습니다.

32 조회수

JQ를 사용한 AWS CLI 출력 필터링 마스터하기: 고급 기술

Amazon Web Services(AWS) 명령줄 인터페이스(CLI)를 다루는 것은 클라우드 자동화 및 인프라 관리에 필수적입니다. AWS CLI는 강력한 명령을 제공하지만, 기본 JSON 출력은 종종 장황하고 중첩되어 있어 직접적인 스크립팅이나 사람이 읽기에는 번거로울 수 있습니다. 이때 외부 JSON 프로세서인 JQ가 없어서는 안 될 파트너가 됩니다.

이 가이드는 JQ를 AWS CLI와 통합하여 원시 JSON 응답을 정확하게 필터링되고, 형식화되며, 실행 가능한 데이터로 변환하는 방법을 심층적으로 다룹니다. 이러한 고급 필터링 기술을 마스터하면 AWS 생태계 내에서 자동화 스크립트와 실시간 데이터 분석 작업의 효율성과 안정성을 획기적으로 향상시킬 수 있습니다.


효과적인 필터링을 위한 사전 요구 사항

고급 필터링을 시작하기 전에 필요한 도구가 올바르게 설치 및 구성되었는지 확인해야 합니다. JQ는 AWS CLI와는 별도로 설치해야 하는 명령줄 JSON 프로세서입니다.

1. JQ 설치

JQ는 일반적으로 표준 패키지 관리자를 통해 사용할 수 있습니다. 사용하는 운영 체제에 맞는 버전을 설치해야 합니다.

  • Linux (Debian/Ubuntu):
    bash sudo apt update && sudo apt install jq
  • Linux (RHEL/Fedora):
    bash sudo yum install jq # 또는 dnf install jq
  • macOS (Homebrew 사용 시):
    bash brew install jq

2. AWS CLI 출력 구성

JQ가 올바르게 작동하려면 AWS CLI에 결과를 JSON 형식으로 출력하도록 지시해야 합니다. 이는 --output 또는 -o 플래그를 json으로 설정하여 수행됩니다.

aws ec2 describe-instances --output json

기본적으로 AWS CLI는 간단한 필터링을 위해 --query(JMESPath 사용)를 사용하는 경우가 많습니다. 그러나 JQ는 복잡한 조작, 구조 변환 및 데이터 추출에 대해 더 뛰어난 유연성을 제공하므로 JMESPath의 한계에 도달했을 때 이상적입니다.


기본 JQ 구문 및 파이프라이닝

JQ는 JSON 입력을 받아 필터 표현식을 적용하여 작동합니다. 출력은 AWS CLI 명령에서 직접 파이프됩니다.

식별자 필터(.) 및 보기 좋게 출력(Pretty Printing)

가장 간단한 필터는 식별자 연산자(.)로, 전체 입력 구조를 보기 좋게(pretty-printed) 포맷하여 반환합니다.

예시: EC2 인스턴스 보기 좋게 출력

aws ec2 describe-instances --output json | jq '.'

최상위 키 선택

JSON 응답 내의 특정 최상위 개체에 액세스하려면 점 표기법을 사용합니다.

출력 구조가 {"Reservations": [...], "OwnerId": "..."}인 경우, 예약 배열만 선택할 수 있습니다.

aws ec2 describe-instances --output json | jq '.Reservations'

고급 필터링 및 반복

JQ의 진정한 강력함은 AWS 응답에서 흔히 볼 수 있는 리소스 배열을 다룰 때 빛을 발합니다.

배열 반복 (.[])

AWS 명령이 목록(배열)을 반환할 때, 각 항목을 개별적으로 처리할 수 있도록 .[]를 사용하여 배열의 각 항목을 반복합니다.

describe-instances의 구조를 생각해 봅시다. 기본 배열은 Reservations입니다. 각 예약에는 Instances 배열이 포함되어 있습니다.

예시: 모든 인스턴스의 ID 추출

모든 예약에 걸쳐 모든 인스턴스 ID 목록을 얻으려면 다음과 같이 합니다.

aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'

특정 속성 선택

반복 작업을 수행한 후에는 각 개체에서 특정 필드를 선택할 수 있습니다. 위 명령의 출력은 따옴표로 묶인 각 문자열 목록을 반환합니다.

예시: 인스턴스 ID 및 상태

인스턴스 ID와 현재 상태 코드를 보려면 다음과 같이 합니다.

aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | {ID: .InstanceId, State: .State.Name}'

이는 파이프(|) 연산자를 사용하여 반복 결과를 새 개체 구성 {...}로 전달합니다.

조건 기반 필터링 (select())

select(condition) 함수는 SQL의 WHERE 절과 유사하게 조건부 데이터 검색에 중요합니다.

예시: 실행 중인 인스턴스만 찾기

State.Namerunning과 일치하는 인스턴스 배열을 필터링합니다.

aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId'

복잡한 필터링 팁: 문자열을 필터링할 때는 조건에 사용되는 문자열 리터럴("running")에 JQ가 큰따옴표를 요구한다는 점을 기억하십시오.


데이터 형식 지정 및 변환

단순 추출 외에도 JQ를 사용하면 후속 스크립트나 보고서와의 통합을 개선하기 위해 데이터를 재구성할 수 있습니다.

결과 배열 생성

최종 출력이 개별 항목의 스트림이 아닌 깔끔한 JSON 배열이 되도록 하려면 전체 표현식을 대괄호 [...]로 묶습니다.

예시: 모든 인스턴스 ID의 깔끔한 목록

aws ec2 describe-instances --output json | jq '[.Reservations[].Instances[].InstanceId]'

사용자 지정 개체(맵) 생성

구조화된 구성 파일이나 데이터 매핑을 만드는 경우, 키-값 쌍을 사용하여 새 개체를 구성합니다. 이는 내부 AWS ID를 더 깔끔한 이름으로 매핑하는 데 탁월합니다.

예시: 인스턴스 ID를 태그된 이름으로 매핑

이 예제는 인스턴스에 Name 키를 가진 태그가 있다고 가정합니다.

aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | {ID: .InstanceId, Name: (.Tags[]? | select(.Key == "Name") | .Value)}'

선택적 필드 참고 사항: (.Tags[]? | ...) 및 선택적 연산자 ?의 사용에 유의하십시오. 인스턴스에 태그가 없는 경우, 이 필터는 실패하는 것을 방지하며 Name 필드에 대해 단순히 null을 반환합니다.

CSV/TSV 출력으로 형식 지정

스프레드시트 가져오기에 적합한 일반 텍스트 보고서를 생성하려면 @csv 또는 @tsv 형식 지정자를 사용할 수 있습니다. 이를 위해서는 원하는 정확한 필드를 순서대로 포함하는 배열을 구성해야 합니다.

예시: 인스턴스 ID 및 유형의 CSV 출력 생성

aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType] | @csv'
  • -r (raw output) 플래그는 여기에서 필수적입니다. 최종 CSV 문자열에서 주변 따옴표를 제거하여 출력을 진정한 일반 텍스트로 만듭니다.

실제 자동화 예시: 연결되지 않은 Elastic IP 확인

이 예제는 반복, 필터링 및 선택을 결합하여 일반적인 인프라 정리 작업을 해결하는 방법을 보여줍니다.

목표: 현재 인스턴스에 연결되어 있지 않은 모든 탄력적 IP 주소(즉, 연결되지 않은 주소) 목록을 가져옵니다.

# 1. 모든 할당 목록 가져오기
# 2. 각 할당 반복
# 3. AssociationId가 null인 항목만 선택
# 4. PublicIp 추출

aws ec2 describe-addresses --output json | \ 
  jq -r '.Addresses[] | select(.AssociationId == null) | .PublicIp'

이 명령이 IP 주소를 반환하면 해당 리소스가 해제 대상이 될 수 있음을 알 수 있으므로 비용을 절감할 수 있습니다.


결론

AWS CLI와 JQ의 조합은 클라우드 데이터를 관리하기 위한 탁월한 도구 모음을 제공합니다. AWS CLI의 내장된 --query 기능은 간단한 조회에 강력하지만, JQ는 정교한 자동화 파이프라인에 필요한 반복, 복잡한 조건부 논리(select), 심층적인 데이터 변환을 위한 표현력을 제공합니다. 이러한 JQ 기술들(특히 반복([]), 조건부 필터링(select), 원시 출력 형식 지정(-r))을 통합함으로써, 번거로운 JSON 응답을 스크립팅 요구 사항에 정확하게 맞춘 정밀하고 실행 가능한 데이터로 변환할 수 있습니다.