JQ를 이용한 AWS CLI 출력 필터링 마스터하기: 고급 기술
jq를 AWS CLI JSON 출력과 함께 사용하여 클라우드 데이터를 필터링, 재구성, 내보내기하여 스크립트와 보고서에 활용하세요.
AWS CLI 출력 필터링 마스터하기: JQ 고급 기술
AWS CLI 출력 필터링은 명령어가 깊게 중첩된 JSON을 반환할 때 복잡해집니다. 하나의 인스턴스 ID, 하나의 태그 값, 또는 간단한 CSV 보고서만 필요할 수 있지만, aws ec2 describe-instances 같은 명령어는 그보다 훨씬 많은 데이터를 반환합니다.
AWS CLI에는 JMESPath를 사용하는 내장 --query 옵션이 있으며, 간단한 조회에는 종종 적합한 도구입니다. jq는 더 풍부한 JSON 재구성, 조건부 로직, CSV 출력, 또는 셸 스크립트에서 재사용할 수 있는 필터가 필요할 때 유용합니다.
JSON 출력으로 시작하기
jq는 JSON을 읽으므로, AWS CLI가 명시적으로 JSON을 반환하도록 설정하세요:
aws ec2 describe-instances --output json
aws configure로 JSON을 기본 출력 형식으로 설정할 수도 있지만, 예제와 스크립트에서 --output json을 사용하면 의존성을 명확히 알 수 있습니다.
시스템 패키지 관리자로 jq를 설치하세요:
sudo apt update && sudo apt install jq
sudo dnf install jq
brew install jq
AWS JSON 읽고 검사하기
식별 필터 .는 입력 JSON을 그대로 반환합니다. 응답 구조를 배우는 동안 예쁘게 출력된 결과를 보고 싶을 때 유용합니다:
aws ec2 describe-instances --output json | jq '.'
최상위 키를 선택하려면 점 표기법을 사용하세요:
aws ec2 describe-instances --output json | jq '.Reservations'
대부분의 AWS 명령어는 유용한 데이터를 배열로 감쌉니다. EC2 인스턴스의 경우 구조는 Reservations[] 다음에 Instances[]이므로, 보통 두 수준이 모두 필요합니다.
배열 순회하기
.[]를 사용하여 배열의 각 항목을 출력합니다. 이 명령어는 모든 예약에서 모든 EC2 인스턴스 ID를 출력합니다:
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'
기본적으로 문자열 출력에는 JSON 따옴표가 포함됩니다. 셸 루프나 다른 명령어에 원시 텍스트가 필요할 때는 -r을 추가하세요:
aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[].InstanceId'
관심 있는 필드만 포함하는 더 작은 객체를 만들 수도 있습니다:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, state: .State.Name, type: .InstanceType}'
이렇게 하면 전체 EC2 응답 대신 간결한 JSON 레코드가 생성됩니다.
select()로 필터링하기
조건과 일치하는 레코드만 필요할 때 select()를 사용하세요. 이 예제는 실행 중인 인스턴스 ID를 나열합니다:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId'
jq 필터 내부의 문자열 리터럴은 "running"처럼 큰따옴표를 사용합니다. 전체 jq 프로그램을 작은따옴표로 감싸면 셸이 큰따옴표를 안전하게 전달합니다.
더 구체적인 확인을 위해 인스턴스 유형으로 필터링하세요:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.InstanceType == "t3.micro") | .InstanceId'
선택적 필드 안전하게 처리하기
AWS 리소스는 종종 필드를 생략합니다. 태그가 일반적인 예입니다. 인스턴스에 Tags 배열이 없으면 .Tags[]가 실패할 수 있습니다. 선택적 반복자 .Tags[]?를 사용하세요:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, name: (.Tags[]? | select(.Key == "Name") | .Value)}'
이 방법은 작동하지만 태그가 없을 때 name 값이 없을 수 있습니다. 스크립트에서는 기본값이 일반적으로 더 사용하기 쉽습니다:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {
id: .InstanceId,
name: ((.Tags[]? | select(.Key == "Name") | .Value) // "unnamed")
}'
스트림 대신 배열 반환하기
많은 jq 필터는 값의 스트림을 출력합니다. 다른 도구가 하나의 유효한 JSON 배열을 기대한다면 표현식을 대괄호로 감싸세요:
aws ec2 describe-instances --output json |
jq '[.Reservations[].Instances[].InstanceId]'
이것은 다른 자동화 단계를 위해 JSON 파일을 작성할 때 유용합니다.
CSV 또는 TSV 내보내기
스프레드시트 친화적인 보고서를 위해 필드 배열을 만들고 @csv 또는 @tsv에 전달하세요. -r을 사용하여 jq가 JSON 문자열 대신 원시 CSV 줄을 작성하도록 합니다:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name] | @csv'
헤더 행을 포함하려면 데이터 행 앞에 출력하세요:
aws ec2 describe-instances --output json |
jq -r '["instance_id","instance_type","state"], (.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name]) | @csv'
실용 예제: 연결되지 않은 탄력적 IP 찾기
연결되지 않은 탄력적 IP 주소는 불필요한 비용을 발생시킬 수 있습니다. 이 명령어는 AWS가 AssociationId를 반환하지 않은 공인 IP를 나열합니다:
aws ec2 describe-addresses --output json |
jq -r '.Addresses[] | select(.AssociationId == null) | .PublicIp'
주소가 출력되면 해제 전에 검토하세요:
aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0
결과를 확인하기 전에 발견 쿼리에서 직접 해제 명령어를 파이프로 연결하지 마세요. 짧은 검토 단계가 잘못된 리소스를 삭제하는 것보다 비용이 적게 듭니다.
--query를 사용해야 할 때
간단한 프로젝션에는 AWS CLI --query를 사용하세요. 출력 형식 전에 실행되며 명령어를 자체 포함 상태로 유지합니다:
aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text
결과에 더 많은 변환이 필요할 때 jq를 사용하세요. 예를 들어, 대체 값, CSV 형식, 필드 결합, 또는 jq 구문에서 읽기 쉬운 긴 필터가 필요할 때입니다.
핵심 요약
--output json을 AWS CLI와 jq 사이의 전환점으로 사용하세요. 그런 다음 .[], select(), 객체 생성, // 기본값, -r 원시 출력을 결합하여 큰 AWS 응답을 스크립트나 보고서에 필요한 정확한 데이터로 변환하세요.