기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
예약된 쿼리 개념 이해
예약된 쿼리를 생성하기 전에 쿼리 실행 방식과 결과가 전달되는 위치에 영향을 미치는 이러한 주요 개념을 이해합니다.
IAM 역할 분리
예약된 쿼리에는 두 개의 개별 IAM 역할이 필요합니다. 하나는 쿼리를 실행하기 위한 역할이고 다른 하나는 Amazon S3 또는 Amazon EventBridge 이벤트 버스에 결과를 전달하기 위한 역할입니다. 이러한 분리가 존재하는 이유를 이해하면 권한을 올바르게 구성하고 해당 권한이 제공하는 보안 및 운영 이점을 사용하는 데 도움이 됩니다.
2역할 아키텍처는 데이터 액세스와 데이터 전송 간의 책임을 나눕니다. 쿼리 실행 역할은 로그 데이터에 액세스하고 쿼리를 실행하는 반면 대상 전송 역할은 선택한 대상에 결과를 기록합니다. 이러한 분리는 최소 권한 원칙을 따릅니다. 각 역할에는 특정 함수에 필요한 권한만 있습니다.
- 쿼리 실행 역할
-
CloudWatch Logs가 사용자를 대신하여 CloudWatch Logs Insights 쿼리를 실행하도록 허용합니다. 이 역할은 로그 그룹에 액세스하고 쿼리를 실행할 수 있는 권한이 필요하지만 대상 리소스에 액세스할 필요는 없습니다. 필요한 권한:
-
logs:StartQuery -
logs:StopQuery -
logs:GetQueryResults -
logs:DescribeLogGroups -
logs:Unmask마스킹 해제 데이터가 필요한 경우
KMS로 암호화된 로그 그룹의 경우: 로그 그룹을 암호화하는 데 사용되는 KMS 키에 대한
kms:Decrypt및kms:DescribeKey권한. 이러한 권한도 추가해야 합니다.신뢰 관계 요구 사항: 쿼리 실행 역할에는 CloudWatch Logs 서비스(
logs.amazonaws.com)가 역할을 수임하도록 허용하는 신뢰 정책이 포함되어야 합니다. 이 신뢰 관계가 없으면 예약된 쿼리가 권한 오류와 함께 실패합니다.쿼리 실행 역할에 대한 신뢰 정책 예제:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }쿼리 실행 역할에 대한 권한 정책 예제:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:StartQuery", "logs:StopQuery", "logs:GetQueryResults", "logs:DescribeLogGroups" ], "Resource": "*" } ] } -
- 대상 전송 역할
-
CloudWatch Logs가 선택한 대상으로 쿼리 결과를 전송하도록 허용합니다. 이 역할에는 최소 권한 원칙에 따라 특정 대상 서비스에 대한 권한만 필요합니다. 필요한 권한은 대상 유형에 따라 다릅니다.
신뢰 관계 요구 사항: 대상 전송 역할에는 CloudWatch Logs 서비스(
logs.amazonaws.com)가 역할을 수임하도록 허용하는 신뢰 정책도 포함되어야 합니다.S3 대상 전송 역할에 대한 권한 정책 예제:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::your-scheduled-query-results-bucket/*" } ] }
이 분리는 운영에 실질적인 이점을 제공합니다. 보안 관점에서 결과가 전달되는 위치를 변경해야 하는 경우 쿼리 실행 권한을 변경하지 않고 대상 전달 역할만 수정합니다. 규정 준수 및 감사를 위해 민감한 로그 데이터에 액세스하는 역할과 외부 시스템에 쓰는 역할을 명확하게 추적할 수 있습니다. 이렇게 하면 로그 분석 인프라가 보안 모범 사례를 따르고 있음을 더 쉽게 입증할 수 있습니다.
교차 리전 및 교차 계정 사용
예약된 쿼리는 특정 리전에서 생성되며 해당 리전에서 실행됩니다. 그러나 로그 그룹을 쿼리하고 리전 및 계정 간에 결과를 전달할 수 있습니다. 하나 이상의 AWS 계정을 모니터링 계정으로 설정하고 여러 소스 계정과 연결해야 합니다. 모니터링 계정은 소스 AWS 계정에서 생성된 관찰성 데이터를 보고 상호 작용할 수 있는 중앙 계정입니다. 소스 계정은 해당 계정에 있는 리소스에 대한 관찰성 데이터를 생성하는 개별 AWS 계정입니다. 소스 계정은 관측성 데이터를 모니터링 계정과 공유합니다. 따라서 연결된 모든 계정의 로그 그룹을 사용하여 모니터링 계정에서 예약된 쿼리를 설정할 수 있습니다.
- 교차 리전 로그 그룹 쿼리
-
예약된 쿼리는 모든 리전의 로그 그룹에 액세스할 수 있습니다. 전체 ARN 형식을 사용하여 로그 그룹을 지정합니다
arn:aws:logs:region:account-id:log-group:log-group-name. 쿼리 실행 역할에는 모든 대상 리전의 로그 그룹에 대한logs:StartQuery및logs:GetQueryResults권한이 필요합니다.
중요
로그 그룹을 쿼리하거나 리전 간에 결과를 전송할 때 로그 데이터는 리전 경계를 넘어갑니다. 다음을 고려하세요.
-
데이터 레지던시 요구 사항 - 리전 간 데이터 전송이 조직의 데이터 거버넌스 정책 및 규제 요구 사항을 준수하는지 확인합니다.
-
데이터 전송 비용 - 리전 간 데이터 전송에는 추가 요금이 발생합니다.
-
네트워크 지연 시간 - 먼 리전의 로그 그룹에 액세스하는 쿼리는 지연 시간이 길어질 수 있습니다.
최적의 성능과 비용 효율성을 위해 기본 로그 그룹과 동일한 리전에서 예약된 쿼리를 생성합니다.
대체 접근 방식: CloudWatch Logs 중앙 집중화를 사용하여 여러 계정 및 리전의 로그 데이터를 중앙 모니터링 계정으로 복제합니다. 이렇게 하면 중앙 집중식 로그에 모두 액세스하는 단일 리전에서 예약된 쿼리를 생성하여 리전 간 쿼리를 방지하고 IAM 권한 관리를 간소화할 수 있습니다.
일정 표현식 및 시간대 처리
정의한 일정에 따라 쿼리 실행 시기와 실행 빈도가 결정됩니다. 올바른 일정 표현식을 선택하면 결과를 받는 시기와 쿼리하는 데이터의 양에 영향을 줍니다. 표현식 유형을 이해하면 단순성과 정밀도 중에서 선택할 수 있습니다.
Cron 표현식을 사용하면 타이밍을 정확하게 제어할 수 있으므로 정확한 시간, 요일 또는 요일을 지정할 수 있습니다. 특정 업무 시간에 실행하거나 운영 일정에 맞게 쿼리를 실행해야 하는 경우 cron 표현식을 사용합니다. 콘솔에서 간편한 일정 옵션을 사용하여 쿼리를 예약할 수도 있습니다.
- cron 표현식
-
특정 시간에 쿼리를 실행합니다. 형식:
cron(minute hour day-of-month month day-of-week year)예시:-
cron(0 9 * * ? *)- 매일 오전 9시 UTC -
cron(0 18 ? * MON-FRI *)- 평일 오후 6시 UTC -
cron(0 0 1 * ? *)- 매월 1일 자정 UTC -
cron(0 12 ? * SUN *)- 매주 일요일 정오 UTC -
cron(30 8 1 1 ? *)- 1월 1일 오전 8시 30분 UTC
-
모든 예약된 쿼리는 현지 시간대 또는 AWS 리소스의 위치에 관계없이 UTC에서 실행됩니다. 이는 업무 시간 또는 시간에 민감한 분석을 위한 쿼리를 예약할 때 특히 중요합니다. 예를 들어 미국 동부 시간으로 비즈니스를 운영하고 오전 9시에 일일 보고서를 원하는 경우 UTC 오프셋(일광 절약 시간 중 14:00 UTC, 그렇지 않으면 13:00 UTC)을 고려해야 합니다. 쿼리가 의도한 시간에 실행되도록 UTC를 염두에 두고 일정 표현식을 계획합니다.
쿼리 언어 선택
예약된 쿼리는 세 가지 쿼리 언어를 지원하며, 선택 사항은 쿼리를 작성하는 방법과 팀이 쿼리를 쉽게 유지 관리할 수 있는 방법에 영향을 미칩니다. 올바른 언어는 분석 요구 사항과 팀의 기존 기술에 따라 달라집니다.
주로 로그 데이터를 필터링하고 집계하는 경우 CloudWatch Logs Insights 쿼리 언어는 가장 간단한 구문을 제공합니다. 여러 단계를 통해 데이터를 재구성하거나 보강해야 하는 복잡한 데이터 변환의 경우 PPL의 파이프라인 접근 방식을 사용하면 로직을 더 쉽게 따를 수 있습니다. 데이터베이스 작업과 유사한 조인 또는 복잡한 집계를 수행해야 하는 경우 SQL은 데이터베이스 경험 팀이 빠르게 채택할 수 있는 친숙한 구문을 제공합니다.
- CloudWatch Logs Insights 쿼리 언어(CWLI)
-
직관적인 구문으로 로그 분석을 위해 특별히 설계되었습니다. 다음 경우에 가장 적합합니다.
-
텍스트 기반 로그 분석 및 필터링
-
시계열 집계 및 통계
-
로그 분석을 처음 사용하는 팀
-
- OpenSearch Service Piped Processing Language(PPL)
-
강력한 데이터 변환 기능을 갖춘 파이프라인 기반 쿼리 언어입니다. 다음 경우에 가장 적합합니다.
-
복잡한 데이터 변환 및 보강
-
다단계 데이터 처리 워크플로
-
파이프라인 기반 처리에 익숙한 팀
-
- OpenSearch Service Structured Query Language(SQL)
-
익숙한 데이터베이스 스타일 쿼리를 위한 표준 SQL 구문입니다. 다음 경우에 가장 적합합니다.
-
복잡한 조인 및 집계
-
비즈니스 인텔리전스 및 보고
-
강력한 SQL 경험을 갖춘 팀
-
대상 선택 및 사용 사례
쿼리 결과를 전송하는 위치에 따라 쿼리 결과를 사용하여 수행할 수 있는 작업이 결정됩니다. 이 선택은 장기 분석 구축, 자동 응답 트리거 또는 둘 다에 관계없이 전체 다운스트림 워크플로를 구성합니다. 각 대상 유형의 강점을 이해하면 사용 사례에 적합한 아키텍처를 설계하는 데 도움이 됩니다.
Amazon S3 대상은 스토리지 및 배치 처리에 최적화되어 있습니다. 쿼리 결과를 몇 개월 또는 몇 년 동안 유지하거나, 시간 경과에 따른 추세를 분석하거나, 데이터를 분석 플랫폼에 제공해야 하는 경우 Amazon S3는 무제한 보존으로 비용 효율적인 스토리지를 제공합니다. EventBridge 대상은 실시간 자동화에 최적화되어 있습니다. 쿼리 결과가 알림 전송, 워크플로 시작 또는 시스템 업데이트와 같은 즉각적인 작업을 트리거해야 하는 경우 EventBridge는 애플리케이션이 즉시 응답할 수 있는 이벤트로 결과를 제공합니다. 기본적으로 모든 쿼리 완료 이벤트는 이벤트로 기본 이벤트 버스로 자동 전송되므로 다운스트림 처리 시스템, Lambda 함수 또는 기타 이벤트 기반 아키텍처와 통합할 수 있습니다. 쿼리가 성공적으로 실행된 경우에만 결과가 대상에 게시됩니다.
- Amazon S3 대상
-
장기 보존 및 배치 처리를 위해 쿼리 결과를 JSON 파일로 저장합니다. 다음 경우에 가장 적합합니다.
-
기록 분석 및 데이터 아카이빙
-
데이터 레이크 및 분석 플랫폼과의 통합
-
규정 준수 및 감사 요구 사항
-
대규모 결과 집합의 비용 효율적인 스토리지
-
- EventBridge 대상
-
쿼리 결과를 실시간 처리 및 자동화를 위한 이벤트로 전송합니다. 30일 동안 결과를 저장할 때만 최대 30일 동안 이벤트에서 전송된 queryId를 사용하여 쿼리 결과를 검색할 수 있습니다. 다음 경우에 가장 적합합니다.
-
쿼리 결과에 대한 자동 응답 트리거
-
서버리스 워크플로 및 Lambda 함수와 통합
-
실시간 알림 및 알림 시스템
-
이벤트 기반 아키텍처 및 마이크로서비스
-
쿼리 결과 형식 및 구조
Amazon S3 대상의 경우 - 쿼리 결과는 GetQueryResults API 응답과 동일한 구조의 JSON 형식으로 전달됩니다. Amazon EventBridge의 경우 예약된 쿼리 결과의 형식을 이해하면 다운스트림 처리 및 통합 워크플로를 설계하는 데 도움이 됩니다.
쿼리 결과는 다음 구조의 JSON 형식으로 제공됩니다.
{ "version": "0", "id": "be72061b-eca2-e068-a7e1-83e01d6fe807", "detail-type": "Scheduled Query Completed", "source": "aws.logs", "account": "123456789012", "time": "2025-11-18T11:31:48Z", "region": "us-east-1", "resources": [ "arn:aws:logs:us-east-1:123456789012:scheduled-query:477b4380-b098-474e-9c5e-e10a8cc2e6e7" ], "detail": { "queryId": "2038fd57-ab4f-4018-bb2f-61d363f4a004", "queryString": "fields @timestamp, @message, @logStream, @log\n| sort @timestamp desc\n| limit 10000", "logGroupIdentifiers": [ "/aws/lambda/my-function" ], "status": "Complete", "startTime": 1763465460, "statistics": { "recordsMatched": 0, "recordsScanned": 0, "estimatedRecordsSkipped": 0, "bytesScanned": 0, "estimatedBytesSkipped": 0, "logGroupsScanned": 1 } } }
주요 요소는 다음과 같습니다.
-
statistics- 일치, 스캔, 바이트 처리 및 예상 건너뛰기 데이터를 포함한 성능 지표 쿼리 -
startTime- 쿼리 실행이 시작된 시간(Unix 타임스탬프) -
queryString- 실행된 실제 쿼리 -
queryId- 결과를 검색할 수 있는 쿼리의 쿼리 ID -
logGroupIdentifiers- 쿼리된 로그 그룹 목록 -
status- 쿼리 실행 상태(완료, 실패 등)