AWS RDS 감사 로그를 S3 버킷 인스턴스로 자동으로 내보내는 방법은 무엇입니까?

게시 됨: 2022-03-05

Export RDS logs to S3 Bucket

RDS 감사 로그를 S3로 자동으로 내보내는 방법을 배우기 전에 AWS CloudWatch가 RDS DB 로그를 자동으로 저장한다는 사실을 알고 계셨습니까? 예, 하지만 DB 인스턴스에 대한 일반 로그만 저장합니다. 이제 로그에서 특정 쿼리나 데이터를 찾으려면 어떻게 해야 할까요? 특정 쿼리를 수행한 사용자 또는 IP 주소는 무엇입니까? 누가 DB 테이블에서 특정 레코드를 삭제했습니까?

또한 어떻게 든 RDS 인스턴스의 모든 감사 로그를 CloudWatch로 내보낼 수 있었습니다. 훌륭합니다. 하지만, 당신은 알고 있습니까? CloudWatch는 해당 로그를 30일 동안만 보관합니다!! 장기간 보관하려면 CloudWatch 로그를 S3 버킷으로 내보내야 합니다. CloudWatch 대시보드에서 수동으로 수행할 수 있습니다. 그러나 이것을 자동화하려면 어떻게 해야 합니까?

이 가이드는 이러한 모든 이벤트를 자동으로 기록하는 데 필요한 모든 단계를 안내합니다!!

AWS 전문가를 찾고 계십니까? 여기에서 체크아웃

이 가이드에는 다음이 포함됩니다.

1) RDS 설정을 조정하여 CloudWatch에 감사 로그를 보냅니다.
2) S3 버킷 생성(CloudWatch 감사 로그 저장용)
3) IAM 역할 생성(Lambda 자동화에 사용)
4) Lambda (CloudWatch Logs를 S3로 내보내기 자동화하는 기능)

의 시작하자!

CloudWatch에 감사 로그를 보내도록 RDS 설정 조정

먼저 특정 로그를 CloudWatch로 보내도록 RDS를 조정해야 합니다. 이를 위해 하나의 옵션 그룹과 하나의 매개변수 그룹을 생성합니다.

옵션 그룹 생성

⇒ Amazon RDS 대시보드를 방문하십시오.
⇒ 옵션 그룹으로 이동합니다.
⇒ 그룹 생성 버튼을 클릭합니다.

Create an Option Group

⇒ 이 그룹의 이름과 설명을 입력합니다.
⇒ 엔진: mysql 및 엔진 버전: 8.0을 선택합니다. 만들기를 클릭합니다.

Create an Option Group

⇒ 생성한 옵션 그룹을 클릭합니다.
⇒ 옵션 섹션에서 옵션 추가 버튼을 클릭합니다.
⇒ "SERVER_AUDIT_EVENTS*" 옵션에서 감사할 값(예: CONNECT, QUERY, QUERY_DDL, QUERY_DML, QUERY_DCL, QUERY_DML_NO_SELECT)을 입력합니다. 테이블에서 실행되는 모든 쿼리를 기록하려면 이 필드에 QUERY를 입력하기만 하면 됩니다.
⇒ 즉시 적용을 "예"로 설정합니다. 옵션 추가를 클릭합니다.

Option Group Settings

AWS 전문가를 찾고 계십니까? 여기에서 체크아웃

매개변수 그룹 생성

⇒ Amazon RDS 대시보드를 열어봅시다.
⇒ 파라미터 그룹을 클릭합니다.
⇒ 파라미터 그룹 생성 버튼을 클릭합니다.

Create Parameter Group

⇒ "파라미터 그룹 패밀리" 선택: mysql8.0
⇒ "유형" 선택: DB 파라미터 그룹
⇒ 그룹 이름과 설명을 입력합니다. 만들기를 클릭합니다.

Create Parameter Group

⇒ 이제 생성한 파라미터 그룹을 클릭합니다.
⇒ 매개변수에서 특정 매개변수를 편집하고 다음 값을 설정합니다.
⇒ 매개변수 편집: "log_output" ⇒ 값을 TABLE에서 FILE로 변경
⇒ 매개변수 편집: "slow_query_log" ⇒ 값을 BLANK에서 1로 변경
⇒ 매개변수 편집: "general_log" ⇒ 값을 BLANK에서 1로 변경

이제 옵션 그룹과 매개변수 그룹이 모두 설정되었습니다. 이제 이 그룹을 RDS에 할당해 보겠습니다.

⇒ RDS 대시보드로 이동합니다.
⇒ 생성한 RDS를 클릭합니다.
⇒ 수정을 클릭합니다.
⇒ 페이지를 아래로 스크롤하여 "데이터베이스 옵션" 섹션으로 이동합니다.
⇒ "DB 파라미터 그룹"에서 생성한 파라미터 그룹을 선택합니다.
⇒ "옵션 그룹"에서 생성한 옵션 그룹을 선택합니다.

Tweak RDS Settings

이제 RDS가 준비되었습니다. 위 단계를 완료했으면 CloudWatch에 데이터를 채우는 데 20~30분 정도 소요됩니다(참고: 로그 크기에 따라 시간이 더 걸릴 수 있음).

CloudWatch가 모든 로그를 수집하면 CloudWatch 대시보드 아래에 감사 로그가 표시됩니다. 다음 이미지와 같이 표시됩니다.

CloudWatch Log Groups

AWS 전문가를 찾고 계십니까? 여기에서 체크아웃

S3 버킷 생성(CloudWatch 감사 로그 저장용)

⇒ Amazon S3 대시보드로 이동합니다.
⇒ 새 버킷을 만듭니다.
⇒ 버킷을 생성했으면 버킷을 열고 권한 탭으로 이동합니다.
⇒ CloudWatch가 버킷에 객체를 넣을 수 있도록 허용해야 합니다(쓰기 액세스).
⇒ 버킷 정책 편집 버튼을 클릭합니다. 다음 코드를 입력합니다.

{
"버전": "2012-10-17",
"성명": [
{
"효과": "허용",
"주요한": {
"서비스": "logs.YOUR-REGION.amazonaws.com" // 즉, logs.us-east-1.amazonaws.com
},
"액션": "s3:GetBucketAcl",
"리소스": "arn:aws:s3:::BUCKET_NAME_HERE"
},
{
"효과": "허용",
"주요한": {
"서비스": "logs.YOUR-REGION.amazonaws.com"
},
"액션": "s3:PutObject",
"리소스": "arn:aws:s3:::BUCKET_NAME_HERE/*",
"상태": {
"StringEquals": {
"s3:x-amz-acl": "버킷 소유자 전체 제어"
}
}
}
] }

IAM 역할 생성(Lambda 자동화에 사용)

이제 Lambda 함수 설정에 사용할 IAM 역할을 생성합니다. AWS Lambda 서비스는 이벤트를 기록하고 우리가 생성한 S3 버킷에 쓸 수 있는 권한이 필요합니다.

"AmazonS3FullAccess", "CloudWatchLogsFullAccess" 및 "CloudWatchEventsFullAccess" 정책을 사용하여 "Export-RDS-CloudWatch-to-S3-Lambda" IAM 역할을 생성합니다.

⇒ AWS IAM 대시보드를 엽니다.
⇒ 역할로 전환하고 역할 생성 버튼을 클릭합니다.
⇒ "사용 사례"에서 Lambda를 선택하고 다음을 클릭합니다.
⇒ "AmazonS3FullAccess"를 검색하여 선택합니다.
⇒ "CloudWatchLogsFullAccess"를 검색하여 선택합니다.
⇒ "CloudWatchEventsFullAccess"를 검색하여 선택합니다.
⇒ 역할 이름 설정: “Export-RDS-CloudWatch-to-S3-Lambda” 및 역할 생성을 클릭합니다.

AWS 전문가를 찾고 계십니까? 여기에서 체크아웃

Lambda(CloudWatch Logs를 S3로 내보내기 자동화하는 기능)

Lambda 함수를 사용하면 함수 아래에 코드를 넣고 트리거에서 실행할 수 있습니다. 서버가 필요하거나 이를 위해 설정할 필요가 없습니다. 매우 쉽고 효율적입니다!

⇒ AWS Lambda 대시보드로 전환합니다.
⇒ 함수를 클릭한 다음 함수 생성 버튼을 클릭합니다.

Create Lambda Function

⇒ "Author for Scratch"를 선택한 상태로 유지합니다.
⇒ "함수 이름" 설정: Export-RDS-CloudWatch-Logs-To-S3
⇒ "런타임"에서 Python 3.x를 선택합니다.
⇒ "권한"에서 "기존 역할 사용"을 선택하고 이전 단계에서 생성한 IAM 역할을 선택합니다.

Configure Lambda Function

⇒ 생성 기능을 클릭하고 코드 보기로 이동하여 다음 스크립트를 입력합니다.

가져오기 boto3
수입 OS
날짜 시간 가져오기

GROUP_NAME = os.environ['GROUP_NAME'] DESTINATION_BUCKET = os.environ['DESTINATION_BUCKET'] PREFIX = os.environ['PREFIX'] NDAYS = os.environ['NDAYS'] nDays = int(NDAYS)

현재 시간 = datetime.datetime.now()
StartDate = currentTime – datetime.timedelta(days=nDays)
EndDate = currentTime – datetime.timedelta(days=nDays – 1)

fromDate = int(StartDate.timestamp() * 1000)
날짜 = int(EndDate.timestamp() * 1000)

BUCKET_PREFIX = os.path.join(PREFIX, StartDate.strftime('%Y{0}%m{0}%d').format(os.path.sep))

def lambda_handler(이벤트, 컨텍스트):
클라이언트 = boto3.client('로그')
client.create_export_task(
logGroupName=GROUP_NAME,
fromTime=from날짜,
to=toDate,
목적지=DESTINATION_BUCKET,
destinationPrefix=BUCKET_PREFIX
)

⇒ 이제 구성 ⇒ 환경 변수를 클릭합니다.
⇒ 4개의 변수를 생성해야 합니다.
⇒ DESTINATION_BUCKET: <S3 버킷 이름>
⇒ GROUP_NAME: <내보내고 있는 로그의 그룹 이름>
⇒ NDAYS: 1
⇒ 접두사: 내보낸 로그

Lambda Environment Variables

⇒ 이제 설정이 완료되었습니다. 함수를 저장합니다.

이제 이 람다 함수를 실행하도록 자동화를 설정해 보겠습니다.

⇒ 이제 CloudWatch 대시보드를 방문하십시오.
⇒ 이벤트 ⇒ 규칙으로 이동합니다.
⇒ 규칙 만들기를 클릭합니다.
⇒ 이벤트 소스에서 일정을 선택합니다.
⇒ 고정 비율 또는 cron 표현식을 설정하여 람다 함수를 자동으로 실행합니다.
⇒ 대상에서 Lambda 함수를 선택합니다.
⇒ 함수에서 이전 단계에서 생성한 함수를 선택합니다.

Cron to Execute Lambda Function

이게 전부입니다. 이제 RDS 로그를 S3로 자동으로 내보내는 환경을 설정했습니다. 원하는 기간 동안 로그를 유지할 수 있습니다. 그러나 여전히 문제가 발생하면 여기에 의견을 게시하십시오. 여러분의 의견을 듣고 싶습니다!!

AWS 전문가를 찾고 계십니까? 여기에서 체크아웃