서버 접근 로그를 CloudWatch Logs로 전달
서버 접근 로그를 CloudWatch Logs로 전달
Amazon CloudWatch Logs 벤디드 로그 전달(vended log delivery)을 사용해 Amazon S3 서버 접근 로그를 CloudWatch Logs 로그 그룹으로 전달할 수 있어요. 로그가 CloudWatch Logs에 들어오면 CloudWatch Logs Insights로 조회하고, 계정·리전에 걸쳐 집계하고, AWS Key Management Service(AWS KMS)로 암호화하며, 선택적으로 SQL 분석을 위해 Apache Iceberg 형식의 Amazon S3 Tables로 전달할 수 있어요. 또한 로그를 JSON 또는 Apache Parquet 형식으로 Amazon S3에 전달하거나 Amazon Data Firehose로 라우팅할 수도 있어요.
전달은 Amazon S3 API가 아니라 CloudWatch Logs API로 구성해요. 각 소스 버킷에 로그 그룹을 지정해요. 여러 버킷이 같은 로그 그룹을 공유하거나, 각 버킷이 자체 로그 그룹으로 전달할 수 있어요.
팁: 같은 버킷에 여러 목적지를 설정할 수 있어요. 예를 들어 대화형 조회를 위해 CloudWatch Logs 로그 그룹으로 전달하면서 동시에 더 낮은 비용의 장기 보관을 위해 Parquet 형식으로 Amazon S3에 전달할 수 있어요.
참고: CloudWatch Logs 벤디드 로그 전달은 Amazon Data Firehose와 Amazon S3를 전달 목적지로 지원하며, Apache Parquet 출력 형식도 포함해요. 이 페이지는 SQL 분석을 위한 S3 Tables 통합도 지원하는 CloudWatch Logs 로그 그룹 목적지를 다뤄요. Firehose와 Amazon S3 목적지에 대한 정보는 Amazon CloudWatch Logs User Guide의 AWS 서비스에서 로깅 활성화를 참고하세요.
참고: 서버 접근 로그를 일반 용도 Amazon S3 버킷으로 대신 전달하는 방법은 "Amazon S3 서버 접근 로깅 활성화"를 참고하세요.
출처: 문서
본문
사전 요구 사항
전달을 설정하기 전에 다음이 필요해요.
- 일반 용도 Amazon S3 버킷(기록하려는 소스 버킷).
- 소스 버킷과 같은 AWS 리전에 있는 CloudWatch Logs 로그 그룹.
- 호출자에 대한 IAM 권한. 최소한 다음 권한이 필요해요.
logs:PutDeliverySourcelogs:PutDeliveryDestinationlogs:CreateDeliverys3:AllowVendedLogDeliveryForResource(소스 버킷에서)
S3 Tables 통합을 활성화하려면 다음 권한도 필요해요.
observabilityadmin:CreateS3TableIntegrationlogs:AssociateSourceToS3TableIntegrations3tables:CreateTableBuckets3tables:PutTableBucketEncryptions3tables:PutTableBucketPolicy
전달 설정(AWS CLI)
AWS Command Line Interface로 CloudWatch Logs에 서버 접근 로그 전달을 설정하려면 다음 세 단계를 완료하세요.
- 전달 소스를 만듭니다. 이 단계는 Amazon S3 버킷을 CloudWatch Logs의 로그 소스로 등록해요.
aws logs put-delivery-source \
--name my-sal-source \
--resource-arn arn:aws:s3:::my-bucket \
--log-type S3_SERVER_ACCESS_LOGS
- 전달 목적지를 만듭니다. 로그가 전달될 CloudWatch Logs 로그 그룹을 지정해요.
aws logs put-delivery-destination \
--name my-sal-destination \
--delivery-destination-configuration '{"destinationResourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:my-sal-logs"}'
- 전달을 만듭니다. 이 단계는 소스를 목적지에 연결하고 로그 전달을 시작해요.
aws logs create-delivery \
--delivery-source-name my-sal-source \
--delivery-destination-arn arn:aws:logs:us-east-1:123456789012:delivery-destination:my-sal-destination
이 단계를 완료하면 Amazon S3가 서버 접근 로그를 CloudWatch Logs 로그 그룹으로 전달하기 시작해요. 구성이 전파되는 데는 15~20분이 걸려요. 전파 후 로그 전달은 보통 몇 시간 안에 시작돼요. 새 요청만 기록되며 과거 데이터를 역채우기하지는 않아요.
전달 설정(Amazon S3 콘솔)
- https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔에 로그인합니다.
- 왼쪽 탐색 창에서 Buckets을 선택합니다.
- 로깅을 활성화할 소스 버킷의 이름을 선택합니다.
- Properties 탭을 선택합니다.
- Server access log delivery to CloudWatch Logs 섹션에서 Edit을 선택합니다.
- Enable을 선택합니다.
- 전달 목적지로 CloudWatch Logs 로그 그룹을 선택하거나 만듭니다.
- (선택) Apache Iceberg 형식의 S3 Tables로 로그를 전달하려면 Enable S3 Tables integration을 선택합니다.
- Save changes를 선택합니다.
저장하면 Server access log delivery to CloudWatch Logs 섹션에 활성화된 로그 그룹이 표시돼요.
전달 설정(CloudFormation)
AWS CloudFormation으로 CloudWatch Logs에 서버 접근 로그 전달 설정을 자동화할 수 있어요. 다음 템플릿은 IAM 역할, CloudWatch Logs 로그 그룹, 전달 소스, 전달 목적지, 전달을 포함한 필요한 리소스를 만들어요.
AWSTemplateFormatVersion: '2010-09-09'
Description: S3 Access Logs delivery to CloudWatch Logs
Parameters:
SourceBucketArn:
Type: String
Description: ARN of the S3 bucket to enable access logging
LogGroupName:
Type: String
Default: /aws/s3/access-logs
Description: CloudWatch Log Group name for SAL delivery
Resources:
SALLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Ref LogGroupName
RetentionInDays: 180
SALDeliverySource:
Type: AWS::Logs::DeliverySource
Properties:
Name: !Sub '${AWS::StackName}-sal-source'
ResourceArn: !Ref SourceBucketArn
LogType: S3_SERVER_ACCESS_LOGS
SALDeliveryDestination:
Type: AWS::Logs::DeliveryDestination
Properties:
Name: !Sub '${AWS::StackName}-sal-destination'
DestinationResourceArn: !GetAtt SALLogGroup.Arn
SALDelivery:
Type: AWS::Logs::Delivery
Properties:
DeliverySourceName: !Ref SALDeliverySource
DeliveryDestinationArn: !GetAtt SALDeliveryDestination.Arn
S3 Tables 통합 활성화(선택)
S3 Tables 통합을 활성화하면 CloudWatch Logs가 서버 접근 로그를 Apache Iceberg 형식으로 계정의 aws-cloudwatch 관리 테이블 버킷에 자동으로 전달해요. 그런 다음 Amazon Athena, Amazon Redshift 또는 Iceberg 호환 도구로 이 데이터를 조회할 수 있어요.
S3 Tables 통합에서는 저장이나 테이블 유지 관리에 추가 비용이 없어요. CloudWatch Logs 수집 비용과 S3 Tables 요금의 쿼리 요청 비용만 지불해요.
- S3 Tables 통합을 만듭니다(계정당·리전당 한 번).
aws observabilityadmin create-s3-table-integration \
--role-arn arn:aws:iam::123456789012:role/CWLogsS3TableIntegrationRole \
--encryption '{"SseAlgorithm": "AES256"}'
IAM 역할은 logs.amazonaws.com 서비스 보안 주체를 신뢰하고 logs:integrateWithS3Table 권한을 부여해야 해요. 다음은 신뢰 정책의 예시예요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "logs.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name"
}
}
}
]
}
역할에는 다음 권한 정책도 필요해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:integrateWithS3Table",
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "123456789012"
}
}
}
]
}
- 전달 소스를 통합에 연결합니다.
aws logs associate-source-to-s3-table-integration \
--integration-arn integration-arn \
--data-source '{"name":"amazon_s3","type":"server_access"}'
이 단계 후 CloudWatch Logs가 aws-cloudwatch 관리 테이블 버킷을 만들고 Iceberg 형식으로 로그 전달을 시작해요. 데이터는 보통 CloudWatch Logs로의 첫 전달 후 1시간 안에 나타나요.
S3 Tables 통합 조회에 대한 자세한 내용은 "S3 Tables에서 접근 로그 조회"를 참고하세요.
계정 간 및 리전 간 집계
CloudWatch Logs 전달 경로는 두 가지 옵션으로 계정 간·리전 간 로그 집계를 지원해요.
- CloudWatch 계정 간 관측성(Observability) 은 데이터를 복사하지 않고 계정 간에 로그를 제자리에서 조회할 수 있게 해 줘요.
- CloudWatch Logs 중앙화 는 여러 계정과 리전의 로그를 중앙 로그 그룹으로 통합할 수 있게 해 주며, 선택적으로 구독 필터를 사용해 선택적 전달을 할 수 있어요.
다중 계정 설정에서 관리자는 AWS Organizations와 함께 CloudWatch Telemetry Config 활성화 규칙을 사용해 멤버 계정 간에 서버 접근 로그 전달을 자동으로 활성화할 수 있어요.
참고: 활성화 규칙은 현재 S3 Tables 통합의 자동 활성화를 지원하지 않아요. 각 계정에서 통합을 별도로 활성화해야 해요.
암호화
로그 그룹에 AWS KMS 암호화를 구성해 CloudWatch Logs로 전달되는 서버 접근 로그를 암호화할 수 있어요. 서버 접근 로그가 해당 로그 그룹으로 전달되면 AWS KMS 키로 암호화돼요. 이는 SSE-S3 암호화만 지원하는 일반 용도 Amazon S3 버킷 전달 경로의 주요 제한을 해결해요.
AWS KMS로 암호화된 로그 그룹과 함께 S3 Tables 통합을 활성화하면 AWS KMS 키 정책에서 다음 서비스 보안 주체에게 추가 권한을 부여해야 해요.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableCWSystemTablesKeyUsage",
"Effect": "Allow",
"Principal": {
"Service": "systemtables.cloudwatch.amazonaws.com"
},
"Action": [
"kms:DescribeKey",
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
}
}
},
{
"Sid": "EnableS3TablesMaintenanceKeyUsage",
"Effect": "Allow",
"Principal": {
"Service": "maintenance.s3tables.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt"
],
"Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id",
"Condition": {
"StringLike": {
"kms:EncryptionContext:aws:s3:arn": "table-bucket-arn/*"
}
}
}
]
}
systemtables.cloudwatch.amazonaws.com 보안 주체는 CloudWatch Logs가 로그를 S3 Tables에 쓸 때 사용해요. maintenance.s3tables.amazonaws.com 보안 주체는 규합(compaction) 같은 Iceberg 작업에서 S3 Tables가 사용해요.
전달 비활성화
CloudWatch Logs로의 서버 접근 로그 전달을 중지하려면 전달이나 전달 소스를 삭제할 수 있어요.
- 전달 삭제 – 로그 전달을 중지하지만 전달 소스 구성은 그대로 유지해요. 소스를 다시 구성하지 않고 나중에 새 전달을 만들 수 있어요.
aws logs delete-delivery \
--id delivery-id
- 전달 소스 삭제 – 소스 구성을 완전히 제거해요. 버킷을 CloudWatch Logs 전달과 더 이상 연결하고 싶지 않을 때 사용하세요.
aws logs delete-delivery-source \
--name delivery-source-name
이전에 전달된 로그는 로그 그룹과(활성화했다면) S3 Tables 통합에 남아 있어요. 전달을 삭제해도 기존 로그 데이터는 제거되지 않아요.