import boto3config = boto3.client('config')ses = boto3.client('ses')def lambda_handler(event, context): # 서울 + us-east-1 양쪽 리전 규칙 수집 rules = config.describe_config_rules()['ConfigRules'] for rule in rules: rule_name = rule['ConfigRuleName'] result = config.get_compliance_details_by_config_rule( ConfigRuleName=rule_name, ComplianceTypes=['COMPLIANT', 'NON_COMPLIANT'] ) # 카테고리별 그룹핑 + 목적 태그 + 준수/미준수 상태 집계 # 미준수 리소스 상세 목록 (EC2 Name 태그, IAM UserName 매핑) # 예외 리소스 필터링 # HTML 보고서 생성 후 SES 발송 ses.send_email( Source='[noreply-email]', Destination={'ToAddresses': ['[ops-team-email]']}, Message={ 'Subject': {'Data': '[사내 인프라] AWS Config 규칙 평가 결과 보고서 (YYYY-MM-DD)'}, 'Body': {'Html': {'Data': html_body}} } )
예외 리소스 관리
Lambda 코드 내 EXCEPTION_RESOURCES 딕셔너리에 규칙별 예외 리소스 ID를 관리합니다.
규칙명
예외 사유
ec2-stopped-instance
Standby 인스턴스, 의도적 정지
iam-user-mfa-enabled
서비스 계정 등 MFA 미적용 허용
CloudWatch 알람 검증 규칙 (CPU/메모리/디스크)
모니터링 대상 외 인스턴스
efs-encrypted-check
기존 EFS는 생성 후 암호화 변경 불가
alb-waf-enabled
CloudFront WAF로 보호 중 (ALB 이중 WAF 불필요)
s3-bucket-public-read-prohibited
외부 파일 공유 용도 버킷
Custom Config Rule (Lambda 연동)
AWS 관리형 규칙으로 커버되지 않는 항목은 Lambda를 직접 작성하여 Config Rule로 연동했습니다. 현재 Custom Lambda 규칙은 총 4개입니다.
[Config Rule (Custom, 주기적 트리거)]
↓ 평가 시 Lambda 호출
[Lambda 함수 — 평가 로직 실행]
↓ 평가 결과 반환 (COMPLIANT / NON_COMPLIANT)
[AWS Config 콘솔 반영 + 보고서 포함]
Custom Rule 1: CloudWatch 경보 상태 점검
항목
설정값
Config Rule
cloudwatch-alarm-resource-check
Lambda
CheckCloudWatchAlarmState
평가 주기
3시간
목적
성능
CloudWatch 경보가 'OK'나 'ALARM'이 아닌 '데이터 부족(INSUFFICIENT_DATA)' 상태로 지속되거나, '비활성화(Disabled)' 상태인지 감지합니다. 경보가 데이터 부족이나 비활성 상태면 실제 장애가 발생해도 알림이 오지 않아 모니터링 사각지대가 됩니다.
Custom Rule 2: 디스크 사용률 알람 검증
항목
설정값
Config Rule
cloudwatch-alarm-resource-check-disk_used_percent
Lambda
CloudWatchMetric-disk_used_perrcent-Verification
평가 주기
3시간
목적
성능
EC2 인스턴스에 disk_used_percent 메트릭 기반 CloudWatch 알람이 설정되어 있는지 확인합니다. 디스크 사용률 알람이 없으면 디스크 풀(100%) 상황을 감지하지 못해 서비스 중단 위험이 있습니다.
Custom Rule 3: 메모리 사용률 알람 검증
항목
설정값
Config Rule
cloudwatch-alarm-resource-check-mem_used_percent
Lambda
CloudWatchMetric-mem_used_perrcent-Verification
평가 주기
3시간
목적
성능
EC2 인스턴스에 mem_used_percent 메트릭 기반 CloudWatch 알람이 설정되어 있는지 확인합니다. 메모리 사용률 알람이 없으면 OOM(Out of Memory) 장애를 사전에 감지하지 못합니다.
Custom Rule 2, 3 수정 이력
디스크/메모리 사용률 검증 Lambda에 다음 수정을 적용했습니다:
ALLOWED_NAMESPACES 추가: 기존에는 CWAgent 등 일부 네임스페이스만 허용하여, 커스텀 네임스페이스로 경보가 설정된 인스턴스가 미준수로 잘못 판정되던 문제를 해결했습니다.
StateValue="OK" 필터 제거: 기존에는 경보 상태가 "OK"인 것만 조회하여, "ALARM" 또는 "INSUFFICIENT_DATA" 상태의 경보가 매칭 안 되던 문제를 해결했습니다.
cloudwatch-alarm-resource-check_CPUUtilization은 AWS 관리형 규칙으로 AWS/EC2 네임스페이스만 사용하여 해당 문제가 없습니다.
Custom Rule 4: EC2 종료 방지 설정 검증 (신규)
항목
설정값
Config Rule
ec2-termination-protection-enabled
Lambda
ConfigRule-EC2TerminationProtectionCheck
평가 주기
24시간
목적
보안
EC2 인스턴스에 종료 방지(Termination Protection)가 설정되어 있는지 확인합니다. AWS 관리형 규칙에 EC2 종료 방지를 체크하는 규칙이 없어서 Custom Lambda로 직접 구현했습니다.
종료 방지가 미설정된 인스턴스는 콘솔이나 CLI에서 실수로 삭제(Terminate)할 수 있으며, 운영 중인 인스턴스가 삭제되면 데이터 손실 및 서비스 중단이 발생합니다.
Lambda 동작 흐름:
Config (24시간 스케줄 트리거)
→ Lambda 실행
→ EC2 DescribeInstances (running/stopped 인스턴스 목록)
→ 각 인스턴스별 DescribeInstanceAttribute (disableApiTermination)
→ 종료 방지 ON → COMPLIANT
→ 종료 방지 OFF → NON_COMPLIANT
→ Config PutEvaluations (결과 전송)
EC2 종료 방지 설정 방법:
# CLI로 즉시 적용 (재부팅 불필요)aws ec2 modify-instance-attribute \ --instance-id i-[instance-id] \ --disable-api-termination
비용
항목
월 예상 비용
Config Rules 평가 (44개 규칙)
$810
S3 로그 저장 (Config 이력)
$12
Lambda 보고서 발송
무료 (프리티어)
SES 메일 발송
무료 (프리티어)
총 합계
$1012/월
정리
서울 + us-east-1 멀티 리전에 걸쳐 44개 Config 규칙 운영 (관리형 40개 + Custom Lambda 4개)
보안/성능/비용 3가지 관점으로 규칙을 분류하여 우선순위 기반 대응
AWS 관리형 규칙에 없는 항목(경보 상태 점검, 메트릭 알람 검증, 종료 방지 체크)은 Custom Lambda로 직접 구현