S3 Tables에서 접근 로그 조회

S3 Tables에서 접근 로그 조회

Amazon S3 Tables 통합을 활성화하면 Amazon CloudWatch Logs가 서버 접근 로그를 Apache Iceberg 형식으로 aws-cloudwatch 관리 테이블 버킷에 전달해요. 데이터가 Iceberg 형식이므로 Apache Iceberg를 지원하는 어떤 도구로도 조회할 수 있어요. 지원 도구는 다음과 같아요.

  • Amazon Athena – S3 Tables 카탈로그를 사용해 Athena 콘솔에서 직접 SQL 쿼리를 실행해요.
  • Amazon SageMaker Unified Studio – 기본 제공 SQL 편집기로 다른 분석 워크로드와 함께 로그 데이터를 조회해요.
  • Amazon Redshift – Redshift Spectrum이나 직접 통합을 통해 Iceberg 테이블을 조회해요.
  • Amazon EMR의 Apache Spark – Iceberg 커넥터로 Spark SQL이나 DataFrame API를 사용해요.
  • 오픈 소스 도구 – Trino, DuckDB, PyIceberg처럼 Apache Iceberg REST 카탈로그를 지원하는 모든 도구.

참고: CloudWatch Logs Insights에서 대화형으로 로그를 조회하려면(SQL 미사용) "CloudWatch Logs Insights로 로그 조회"를 참고하세요.

출처: 문서

본문

사전 요구 사항

S3 Tables에서 접근 로그를 조회하려면 먼저 다음을 완료해야 해요.

  • S3 Tables 통합을 활성화합니다. "S3 Tables 통합 활성화(선택)"를 참고하세요.
  • 분석 서비스와 S3 Tables 통합을 활성화합니다. Amazon S3 콘솔에서 Table buckets으로 이동해 Enable integration을 선택해요. 이렇게 하면 Data Catalog에 s3tablescatalog 페더레이션 카탈로그가 생성되고 테이블이 분석 서비스에 표시돼요. 기본적으로 접근은 IAM 권한으로 제어돼요. 선택적으로 AWS Lake Formation으로 세분화된 접근 제어를 사용할 수 있어요. 자세한 내용은 AWS 분석 서비스와 S3 Tables 통합을 참고하세요.
  • 데이터가 채워질 때까지 기다립니다. 데이터는 보통 CloudWatch Logs로의 첫 전달 후 1시간 안에 나타나요.

Amazon Athena 연결

  1. https://console.aws.amazon.com/athena/에서 Athena 콘솔을 엽니다.
  2. 쿼리 편집기의 데이터 소스 드롭다운에서 Amazon S3 Tables 카탈로그를 선택합니다.
  3. 로그 테이블이 logs 네임스페이스 아래의 데이터베이스 목록에 나타납니다.

서버 접근 로그 테이블 이름은 amazon_s3__server_access예요. 정규화된 테이블 참조는 다음과 같아요.

"s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"

트래픽 분석

시간 경과에 따른 요청 볼륨 예시

SELECT date_trunc('minute', request_time) AS interval,
  COUNT(*) AS requests
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY date_trunc('minute', request_time)
ORDER BY interval ASC;

작업 유형별 요청 구성 예시

SELECT operation, COUNT(*) AS cnt
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY operation
ORDER BY cnt DESC;

버킷별 트래픽 예시

SELECT bucket_arn, COUNT(*) AS requests, SUM(bytes_sent_size) AS bytes_out
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY bucket_arn
ORDER BY requests DESC;

오류 문제 해결

오류율 분석 예시

SELECT http_status, error_code, operation, COUNT(*) AS error_count
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE http_status >= 400
GROUP BY http_status, error_code, operation
ORDER BY error_count DESC;

403 Access Denied 요청 예시

SELECT key_name, remote_ip, requester, COUNT(*) AS denied_count
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE http_status = 403
GROUP BY key_name, remote_ip, requester
ORDER BY denied_count DESC;

404 Not Found 요청 예시

SELECT key_name, error_code, remote_ip, COUNT(*) AS miss_count
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE http_status = 404
GROUP BY key_name, error_code, remote_ip
ORDER BY miss_count DESC;

503 SlowDown(스로틀링) 이벤트 예시

SELECT key_name, remote_ip, COUNT(*) AS throttle_count
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE http_status = 503
GROUP BY key_name, remote_ip
ORDER BY throttle_count DESC;

접근 패턴

소스 IP별 트래픽 예시

SELECT remote_ip,
  COUNT(*) AS total_requests,
  SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors,
  SUM(bytes_sent_size) AS bytes_transferred
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY remote_ip
ORDER BY total_requests DESC;

요청자별 작업 예시

SELECT requester, operation, COUNT(*) AS requests
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY requester, operation
ORDER BY requests DESC;

가장 많이 접근한 키 예시

SELECT key_name, COUNT(*) AS access_count, SUM(bytes_sent_size) AS bytes_out
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT')
GROUP BY key_name
ORDER BY access_count DESC
LIMIT 10;

대기 시간 분석

작업 유형별 대기 시간 예시

SELECT operation,
  AVG(total_duration) AS avg_ms,
  APPROX_PERCENTILE(total_duration, 0.5) AS p50_ms,
  APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms,
  MAX(total_duration) AS max_ms,
  COUNT(*) AS requests
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT')
GROUP BY operation;

p95 대기 시간 기준 가장 느린 키 예시

SELECT key_name,
  AVG(total_duration) AS avg_ms,
  APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms,
  COUNT(*) AS requests
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation = 'REST.GET.OBJECT'
GROUP BY key_name
ORDER BY p95_ms DESC
LIMIT 10;

시간 경과에 따른 대기 시간 예시

SELECT date_trunc('minute', request_time) AS interval,
  AVG(total_duration) AS avg_ms,
  APPROX_PERCENTILE(total_duration, 0.95) AS p95_ms
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT')
GROUP BY date_trunc('minute', request_time)
ORDER BY interval ASC;

비용 배분

작업별 데이터 전송 예시

SELECT operation,
  SUM(bytes_sent_size) AS total_bytes_out,
  SUM(object_size) AS total_object_bytes,
  COUNT(*) AS request_count
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation IN ('REST.GET.OBJECT', 'REST.PUT.OBJECT', 'REST.DELETE.OBJECT')
GROUP BY operation
ORDER BY total_bytes_out DESC;

서비스 중인 가장 큰 객체 예시

SELECT key_name, MAX(object_size) AS max_size, AVG(object_size) AS avg_size, COUNT(*) AS reads
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE operation = 'REST.GET.OBJECT' AND bytes_sent_size > 0
GROUP BY key_name
ORDER BY max_size DESC
LIMIT 10;

보안 분석

오류율이 높은 IP 예시

SELECT remote_ip,
  COUNT(*) AS total,
  SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) AS errors
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY remote_ip
HAVING SUM(CASE WHEN http_status >= 400 THEN 1 ELSE 0 END) > 10
ORDER BY errors DESC;

키별 실패한 접근 시도 예시

SELECT remote_ip, key_name, operation, http_status, COUNT(*) AS attempts
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
WHERE http_status >= 400
GROUP BY remote_ip, key_name, operation, http_status
ORDER BY attempts DESC
LIMIT 20;

TLS 버전 분포 예시

SELECT tls_version, COUNT(*) AS cnt
FROM "s3tablescatalog/aws-cloudwatch"."logs"."amazon_s3__server_access"
GROUP BY tls_version
ORDER BY cnt DESC;

AI 에이전트로 Amazon S3 서버 접근 로그 조회

MCP 호환 AI 에이전트는 Amazon S3 서버 접근 로그가 포함된 S3 테이블을 발견하고, SQL 쿼리를 생성하며, 결과를 분석할 수 있어요. Amazon S3 서버 접근 로그가 aws-cloudwatch 테이블 버킷의 Iceberg 테이블로 내보내지므로, 에이전트는 Amazon Athena, Amazon EMR, Amazon Redshift 또는 Iceberg 호환 도구와 함께 사용하는 것과 같은 S3 Tables 카탈로그를 통해 테이블을 조회할 수 있어요.

AWS 용 Agent Toolkit은 에이전트에게 AWS 데이터 작업을 위한 검증된 절차를 제공하는 스킬을 제공해요. Querying CloudWatch Logs system tables 스킬은 S3 Tables로 내보낸 CloudWatch Logs 데이터(S3 Tables 버킷의 Amazon S3 서버 접근 로그 포함)에 대해 SQL 쿼리를 실행해요. 사용하려면 GitHub 저장소에서 스킬을 다운로드해 에이전트의 스킬 디렉터리에 추가하세요.

예를 들어 에이전트에게 지난 24시간 동안 S3 서버 접근 로그에서 요청 수 기준 상위 10개 소스 IP 주소를 보여달라고 요청할 수 있어요. 에이전트는 스킬을 사용해 접근 로그 테이블을 찾고 Athena에서 쿼리를 실행해요.

더 알아보기 (Learn more)