จะส่งออกบันทึกการตรวจสอบ AWS RDS ไปยังอินสแตนซ์ S3 Bucket โดยอัตโนมัติได้อย่างไร

เผยแพร่แล้ว: 2022-03-05

Export RDS logs to S3 Bucket

ก่อนที่เราจะเรียนรู้วิธีการส่งออกบันทึกการตรวจสอบ RDS ไปยัง S3 โดยอัตโนมัติ คุณทราบหรือไม่ว่า AWS CloudWatch จัดเก็บบันทึก RDS DB โดยอัตโนมัติ ใช่ พวกเขาทำ แต่จะเก็บบันทึกทั่วไปสำหรับอินสแตนซ์ DB ของคุณเท่านั้น ตอนนี้ ถ้าคุณต้องการค้นหาข้อความค้นหาหรือข้อมูลเฉพาะจากบันทึกล่ะ ผู้ใช้รายใดดำเนินการสืบค้นข้อมูลเฉพาะหรือจากที่อยู่ IP ใด ใครลบบันทึกบางรายการออกจากตารางฐานข้อมูลของคุณ?

นอกจากนี้ คุณยังสามารถส่งออกบันทึกการตรวจสอบทั้งหมดของอินสแตนซ์ RDS ไปยัง CloudWatch ได้อีกด้วย ซึ่งถือว่ายอดเยี่ยม แต่คุณรู้หรือไม่? CloudWatch จะเก็บบันทึกเหล่านั้นไว้ 30 วันเท่านั้น!! หากต้องการเก็บไว้เป็นเวลานาน คุณต้องส่งออกบันทึก CloudWatch ไปยังบัคเก็ต S3 คุณสามารถทำได้ด้วยตนเองจากแดชบอร์ด CloudWatch แต่ถ้าคุณต้องการมีระบบอัตโนมัติสำหรับสิ่งนี้

คู่มือนี้จะแนะนำคุณผ่านขั้นตอนทั้งหมดที่จำเป็นในการบันทึกเหตุการณ์ดังกล่าวทั้งหมดโดยอัตโนมัติ!!

กำลังมองหา AWS EXPERTS อยู่ใช่ไหม ชำระเงินที่นี่

คู่มือนี้รวมถึง:

1) ปรับแต่งการตั้งค่า RDS เพื่อส่งบันทึกการตรวจสอบไปยัง CloudWatch
2) สร้าง S3 Bucket (เพื่อจัดเก็บบันทึกการตรวจสอบ CloudWatch)
3) สร้างบทบาท IAM (เราจะใช้สำหรับระบบอัตโนมัติของแลมบ์ดา)
4) แลมบ์ดา (ฟังก์ชันเพื่อส่งออกบันทึก CloudWatch ไปยัง S3) โดยอัตโนมัติ

เอาล่ะ!

ปรับแต่งการตั้งค่า RDS เพื่อส่งบันทึกการตรวจสอบไปยัง CloudWatch

ก่อนอื่น เราต้องปรับแต่ง RDS เพื่อส่งบันทึกเฉพาะไปยัง CloudWatch ในการดำเนินการนี้ เราจะสร้างกลุ่มตัวเลือกหนึ่งกลุ่มและกลุ่มพารามิเตอร์หนึ่งกลุ่ม

สร้างกลุ่มตัวเลือก

⇒ ไปที่แดชบอร์ด Amazon RDS ของคุณ
⇒ ไปที่กลุ่มตัวเลือก
⇒ คลิกที่ปุ่มสร้างกลุ่ม

Create an Option Group

⇒ ป้อนชื่อและคำอธิบายสำหรับกลุ่มนี้
⇒ เลือก Engine: mysql และ Engine Version: 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 EXPERTS อยู่ใช่ไหม ชำระเงินที่นี่

สร้างกลุ่มพารามิเตอร์

⇒ มาเปิด Amazon RDS Dashboard กันเถอะ
⇒ คลิกที่กลุ่มพารามิเตอร์
⇒ คลิกที่ปุ่มสร้างกลุ่มพารามิเตอร์

Create Parameter Group

⇒ เลือก “กลุ่มพารามิเตอร์กลุ่ม”: mysql8.0
⇒ เลือก “ประเภท”: DB Parameter Group
⇒ ป้อนชื่อกลุ่มและคำอธิบาย คลิกที่สร้าง

Create Parameter Group

⇒ ตอนนี้ คลิกที่กลุ่มพารามิเตอร์ที่คุณสร้างขึ้น
⇒ ภายใต้ Parameter เราจะแก้ไขพารามิเตอร์บางอย่างและตั้งค่าต่อไปนี้:
⇒ แก้ไขพารามิเตอร์: “log_output” ⇒ เปลี่ยนค่าจาก TABLE เป็น FILE
⇒ แก้ไขพารามิเตอร์: “slow_query_log” ⇒ เปลี่ยนค่าจาก BLANK เป็น 1
⇒ แก้ไขพารามิเตอร์: “general_log” ⇒ เปลี่ยนค่าจาก BLANK เป็น 1

ตอนนี้ เราพร้อมแล้วกับกลุ่มตัวเลือกและกลุ่มพารามิเตอร์ ตอนนี้ มาจัดสรรกลุ่มเหล่านี้ให้กับ RDS ของเรากัน

⇒ ไปที่แดชบอร์ด RDS ของคุณ
⇒ คลิกที่ RDS ที่คุณสร้างขึ้น
⇒ คลิกที่แก้ไข
⇒ เลื่อนหน้าลงและไปที่ส่วน "ตัวเลือกฐานข้อมูล"
⇒ ภายใต้ “กลุ่มพารามิเตอร์ DB” ให้เลือกกลุ่มพารามิเตอร์ที่คุณสร้างขึ้น
⇒ ภายใต้ “กลุ่มตัวเลือก” เลือกกลุ่มตัวเลือกที่คุณสร้างขึ้น

Tweak RDS Settings

ตอนนี้เราพร้อมแล้วกับ RDS เมื่อคุณทำตามขั้นตอนข้างต้นเสร็จแล้ว โปรดรอ 20-30 นาทีเพื่อเติมข้อมูลใน CloudWatch (หมายเหตุ: อาจใช้เวลามากขึ้นขึ้นอยู่กับขนาดของบันทึก)

เมื่อ CloudWatch รวบรวมบันทึกทั้งหมดแล้ว คุณจะเห็นบันทึกการตรวจสอบภายใต้แดชบอร์ด CloudWatch ของคุณ มันจะดูเหมือนภาพต่อไปนี้:

CloudWatch Log Groups

กำลังมองหา AWS EXPERTS อยู่ใช่ไหม ชำระเงินที่นี่

สร้าง S3 Bucket (เพื่อจัดเก็บบันทึกการตรวจสอบ CloudWatch)

⇒ ไปที่แดชบอร์ด Amazon S3
⇒ สร้างถังใหม่
⇒ เมื่อคุณสร้างถังแล้ว ให้เปิดและไปที่แท็บการอนุญาต
⇒ เราจะต้องอนุญาตให้ CloudWatch วางอ็อบเจ็กต์ลงในบัคเก็ต (Write Access)
⇒ คลิกที่ปุ่มแก้ไขสำหรับนโยบายถัง ป้อนรหัสต่อไปนี้:

{
“เวอร์ชั่น”: “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/*”,
"สภาพ": {
“สตริงเท่ากับ”: {
“s3:x-amz-acl”: “bucket-owner-full-control”
}
}
}
] }

สร้างบทบาท IAM (เราจะใช้สำหรับระบบอัตโนมัติของแลมบ์ดา)

ตอนนี้ เราจะสร้างบทบาท IAM ที่จะใช้ในการตั้งค่าฟังก์ชัน Lambda บริการ AWS Lambda จะต้องได้รับอนุญาตในการบันทึกเหตุการณ์และเขียนไปยังบัคเก็ต S3 ที่เราสร้างขึ้น

เราจะสร้างบทบาท IAM “ส่งออก-RDS-CloudWatch-to-S3-Lambda” ด้วยนโยบาย “AmazonS3FullAccess”, “CloudWatchLogsFullAccess” และ “CloudWatchEventsFullAccess”

⇒ เปิดแดชบอร์ด AWS IAM ของคุณ
⇒ สลับไปที่บทบาทและคลิกที่ปุ่มสร้างบทบาท
⇒ ภายใต้ “กรณีการใช้งาน” เลือก Lambda แล้วคลิกถัดไป
⇒ ค้นหา “AmazonS3FullAccess” แล้วเลือก
⇒ ค้นหา “CloudWatchLogsFullAccess” และเลือก
⇒ ค้นหา “CloudWatchEventsFullAccess” แล้วเลือก
⇒ ตั้งชื่อบทบาท: “ส่งออก-RDS-CloudWatch-to-S3-Lambda” และคลิกที่สร้างบทบาท

กำลังมองหา AWS EXPERTS อยู่ใช่ไหม ชำระเงินที่นี่

Lambda (ฟังก์ชันเพื่อส่งออกบันทึก CloudWatch ไปยัง S3) โดยอัตโนมัติ

ฟังก์ชันแลมบ์ดาช่วยให้คุณวางโค้ดของคุณไว้ใต้ฟังก์ชันและเรียกใช้บนทริกเกอร์ได้ คุณไม่จำเป็นต้องมีเซิร์ฟเวอร์หรือตั้งค่าสำหรับสิ่งนี้ ง่ายและมีประสิทธิภาพมาก!

⇒ เปลี่ยนไปใช้แดชบอร์ด AWS Lambda
⇒ คลิกที่ฟังก์ชันแล้วคลิกปุ่มสร้างฟังก์ชัน

Create Lambda Function

⇒ เลือก "Author for Scratch" ไว้
⇒ ตั้งค่า “ชื่อฟังก์ชัน”: Export-RDS-CloudWatch-Logs-To-S3
⇒ ใต้ “รันไทม์” ให้เลือก Python 3.x
⇒ ภายใต้ "การอนุญาต" เลือก "ใช้บทบาทที่มีอยู่" และเลือกบทบาท IAM ที่เราสร้างขึ้นในขั้นตอนก่อนหน้า

Configure Lambda Function

⇒ คลิกที่ฟังก์ชันสร้างและไปที่มุมมองโค้ดแล้วป้อนสคริปต์ต่อไปนี้:

นำเข้า boto3
นำเข้าระบบปฏิบัติการ
นำเข้าวันที่เวลา

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 (วัน = n วัน)
EndDate = currentTime – datetime.timedelta (วัน = n วัน – 1)

fromDate = int(StartDate.timestamp() * 1000)
toDate = 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=fromDate,
ถึง=วันนี้,
ปลายทาง=DESTINATION_BUCKET,
ปลายทางPrefix=BUCKET_PREFIX
)

⇒ ตอนนี้ คลิกที่การกำหนดค่า ⇒ ตัวแปรสภาพแวดล้อม
⇒ เราจำเป็นต้องสร้าง 4 ตัวแปร:
⇒ DESTINATION_BUCKET: <ชื่อถัง S3 ของคุณ>
⇒ GROUP_NAME: <ชื่อกลุ่มของบันทึกที่คุณกำลังส่งออก>
⇒ วัน: 1
⇒ PREFIX: ส่งออกบันทึก

Lambda Environment Variables

⇒ เอาล่ะ คุณพร้อมแล้ว บันทึกฟังก์ชัน

ตอนนี้ มาตั้งค่าระบบอัตโนมัติเพื่อเรียกใช้ฟังก์ชันแลมบ์ดานี้

⇒ ไปที่แดชบอร์ด CloudWatch ของคุณ
⇒ ไปที่กิจกรรม ⇒ กติกา
⇒ คลิกที่สร้างกฎ
⇒ ใต้แหล่งที่มาของเหตุการณ์ เลือกกำหนดการ
⇒ ตั้งค่าอัตราคงที่หรือนิพจน์ cron เพื่อเรียกใช้ฟังก์ชันแลมบ์ดาของเราโดยอัตโนมัติ
⇒ ใต้เป้าหมาย ให้เลือกฟังก์ชันแลมบ์ดา
⇒ ภายใต้ Function ให้เลือกฟังก์ชันที่เราได้สร้างไว้ในขั้นตอนก่อนหน้า

Cron to Execute Lambda Function

นี่คือทั้งหมดที่. ตอนนี้ คุณได้ตั้งค่าสภาพแวดล้อมเพื่อส่งออกบันทึก RDS ไปยัง S3 โดยอัตโนมัติแล้ว คุณสามารถเก็บบันทึกได้นานเท่าที่คุณต้องการ แต่ถ้าคุณยังคงประสบปัญหาใด ๆ โปรดโพสต์ความคิดเห็นที่นี่ เราชอบที่จะได้ยินจากคุณ !!

กำลังมองหา AWS EXPERTS อยู่ใช่ไหม ชำระเงินที่นี่