การ Monitoring และ Notification บน AWS Backup (ดีกว่าวิธีของ AWS)

Monitoring and Notification For AWS Backup (Better than AWS Methods)

Nopnithi Khaokaew (Game)
6 min readMar 20, 2022

เชื่อว่ามีหลายคนใช้ AWS Backup เข้ามาช่วย backup resource บน AWS ไม่ว่าจะเป็น EC2, EBS, RDS, ฯลฯ แล้วทีม cloud operations ของเราจะรู้ได้ยังไงว่า backup job ที่ run บน AWS Backup นั้นโอเคหรือไม่?

— — — — — — — — —
บทความทั้งหมดของผม
— — — — — — — — —

ที่จริงแล้วใน document ของ AWS Backup เค้ามีแนะนำในเรื่อง monitoring เอาไว้ แต่ทุก solution ที่เป็นการ notify เมื่อเกิด failed job สำหรับผมมันยังไม่ practical มากพอครับ ลองดูครับ

วิธีที่ 1 ใช้ CloudWatch เพื่อ Track Metrics ของ AWS Backup

ที่จริง AWS Backup ก็มี dashboard เหมือนกัน แต่จะดูข้อมูลย้อนหลังได้แค่ 24 ชั่วโมงเท่านั้น ขณะที่ CloudWatch จะได้ตั้งแต่ 3 ชั่วโมงไปถึง 15 เดือน (ขึ้นอยู่กับ period ของ data point)

ส่วนนี้ผมไม่เขียนละเอียดแล้วกันครับ แค่แนะนำเป็นไอเดียไว้ว่ามันก็เอา metrics จาก AWS Backup มาทำ dashboard ตามใจเราได้เหมือนกัน

วิธีที่ 2 ใช้ AWS Backup Vault Notification + SNS

ส่ง email ไปยัง admin ในกรณีที่เจอ backup ไม่สำเร็จ (ผมใช้ AWS CLI ทำนะ แนะนำใช้ AWS CloudShell ช่วยครับ)

2.1 สร้าง SNS Topic

aws sns create-topic \
--name aws-backup-notifications \
--attributes '{"Policy":"{\"Version\":\"2008-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__default_statement_ID\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"backup.amazonaws.com\"},\"Action\":\"SNS:Publish\",\"Resource\":\"arn:aws:sns:ap-southeast-1:<account-id>:aws-backup-notifications\"}]}"}' \
--region ap-southeast-1
  • สร้าง topic aws-backup-notifications
  • กำหนด policy ให้ AWS Backup สามารถ publish message เข้ามาได้
  • แก้ไข <account-id> ให้ถูกต้องด้วย

2.2 สร้าง SNS Subscription

aws sns subscribe \
--topic-arn arn:aws:sns:ap-southeast-1:<account-id>:aws-backup-notifications \
--protocol email \
--notification-endpoint <email> \
--attributes '{"FilterPolicy": "{\"State\":[{\"anything-but\":\"COMPLETED\"}]}"}' \
--region ap-southeast-1 \
  • สร้าง subscription ใต้ topic aws-backup-notifications
  • มี policy ที่ filter เพื่อรับเฉพาะ event ที่ไม่ completed (failed หรืออื่น ๆ)
  • เมื่อได้รับจะส่งไปยัง email ที่กำหนด
  • แก้ไข <account-id> และ <email> ให้ถูกต้องด้วย

จากนั้นไปยัง email ที่ใส่ไว้เพื่อกด Confirm subscription

2.3 Configure เพื่อส่ง Event จาก Backup Vault ไปที่ SNS Topic

aws backup put-backup-vault-notifications \
--backup-vault-name Default \
--sns-topic-arn arn:aws:sns:ap-southeast-1:<account-id>:aws-backup-notifications \
--backup-vault-events BACKUP_JOB_COMPLETED \
--region ap-southeast-1
  • ส่ง event จาก AWS Backup Vault Default ไปยัง topic ที่สร้างไว้
  • สนใจเฉพาะ event ในการ backup

จากนั้นตรวจสอบว่า subscribe ถูกสร้างเรียบร้อยแล้วหรือยัง

aws backup get-backup-vault-notifications \
--backup-vault-name Default \
--region ap-southeast-1

จะได้ประมาณนี้

{
"BackupVaultName": "Default",
"BackupVaultArn": "arn:aws:backup:ap-southeast-1:<account-id>:backup-vault:Default",
"SNSTopicArn": "arn:aws:sns:ap-southeast-1:<account-id>:aws-backup-notifications",
"BackupVaultEvents": [
"BACKUP_JOB_COMPLETED"
]
}

2.4 ผลลัพธ์

จะมี email ส่งมาหาผมทุกครั้งที่ backup job failed แบบนี้

An AWS Backup job failed. Resource ARN : arn:aws:rds:ap-southeast-1:<account-id>:db:<rds-name>. BackupJob ID : 778FE926-4630-3E80-A937-5C4C810BA49D Status Message : Cannot start backup job, RDS DB Instance is currently not in AVAILABLE state. Current state: stopped.

วิธีที่ 3 ใช้ EventBridge Rules + SNS

เริ่มจากสร้าง rule เพื่อรับ event จาก AWS Backup และเมื่อ event เกิดขึ้นก็สามารถนำไป trigger AWS service หรือ application ต่าง ๆ เพื่อทำ event-driven automation ได้ ซึ่งในตัวอย่างนี้ผมใช้กับ Amazon SNS เพื่อส่ง email เมื่อเจอ backup job state เป็น failed

3.1 สร้าง SNS Topic

เดี๋ยวมาใช้ GUI กันบ้าง เริ่มจาก AWS Management Console ให้เข้าไปที่ Amazon SNS → Topics → Create topic และใส่ข้อมูลตามนี้

  • Type: Standard
  • Name: aws-backup-notifications-eventbridge

จากนั้นคลิก Create topic

3.2 สร้าง SNS Subscription

ภายใต้ SNS topic ที่เราสร้างจากข้อ 3.1 ให้คลิก Create subscription

  • Protocol: Email
  • Endpoint: ใส่ email ที่ต้องการรับแจ้งเตือน

แล้วคลิก Create subscription เพื่อสร้าง จากนั้นไปเช็ค email ที่ใส่ไว้เพื่อกด Confirm subscription ครับ

3.3 สร้าง EventBridge Rule

ไปที่ Amazon EventBridge → Events → Rules → Create rule

  • Name: aws-backup-notifications
  • Event bus: default
  • Rule type: Rule with an event pattern

จากนั้นคลิก Next, และในส่วน Build event pattern ก็กรอกข้อมูลตามนี้

  • Event source: Other
  • Event pattern:
{
"source": ["aws.backup"],
"detail-type": ["Backup Job State Change"],
"detail": {
"state": ["FAILED"]
}
}

ตรงนี้เป็นการ filter เอาเฉพาะ event ที่มี state เป็น FAILED เท่านั้น จากนั้นคลิก Next

เมื่อเกิด event จะให้ทำอะไรก็อยู่ตรงนี้แหละครับ ซึ่งเราสามารถเพิ่มได้หลาย target เลย แต่ในบทความนี้ผมเลือก SNS topic จากนั้นทำตาม step ไปจนเสร็จ

3.4 ผลลัพธ์

จะมี email ส่งมาหาผมทุกครั้งที่ backup job failed แบบนี้

{"version":"0","id":"c41048d9-dc0d-ca96-34f6-9a487cab7f5d","detail-type":"Backup Job State Change","source":"aws.backup","account":"<account_id>","time":"2022-03-20T07:45:01Z","region":"ap-southeast-1","resources":[],"detail":{"backupJobId":"6B6007BD-A66B-7F6A-F5A5-35B1F48C196D","backupVaultArn":"arn:aws:backup:ap-southeast-1:<account_id>:backup-vault:Default","backupVaultName":"Default","bytesTransferred":"0","creationDate":"2022-03-20T05:00:00Z","iamRoleArn":"arn:aws:iam::<account_id>:role/service-role/AWSBackupDefaultServiceRole","resourceArn":"arn:aws:rds:ap-southeast-1:<account_id>:db:<rds-name>","resourceType":"RDS","state":"FAILED","statusMessage":"Cannot start backup job, RDS DB Instance is currently not in AVAILABLE state. Current state: stopped.","completionDate":"2022-03-20T07:36:38.116Z","startBy":"2022-03-20T13:00:00Z","percentDone":0.0,"createdBy":{"backupPlanId":"4542d5ab-349a-4387-8774-64d31da82b10","backupPlanArn":"arn:aws:backup:ap-southeast-1:<account_id>:backup-plan:4542d5ab-349a-4387-8774-64d31da82b10","backupPlanVersion":"MTllNGIzNjYtYTk3Yy00MzNhLTk3ODgtYTI3MDViNWQ1NTk3","backupPlanRuleId":"b89a66a9-7283-412d-a01e-73fcb658bc1d"}}}

วิธีที่ 4 ใช้ AWS Backup Report Plan + S3 + Lambda (Python) + SNS

Solution นี้ผมคิดมาเพื่อแก้ pain point จากวิธีที่ 2 และ 3 ซึ่งเราจะถูกบอมบ์ด้วย email จำนวนมากแบบนี้ครับ (ถ้าหากมี failed job จำนวนมาก) และแน่นอนว่าเราคงจะไม่ได้ไล่อ่าน 555

4.1 อธิบายการทำงาน (อย่างสั้น)

  • ในแต่ละวันระบบจะสร้าง backup job report ไปเก็บไว้ที่ S3 bucket
  • ไฟล์ report ที่ถูกสร้างขึ้นจะไป trigger Lambda (Python) เพื่อให้เข้ามา summarize ข้อมูลว่า status ของ job เป็นยังไงบ้าง
  • ผมเพิ่ม status ที่เป็น acceptable failed เข้าไป เพราะในเคสของผมจะมี failed job ที่เกิดขึ้นเพราะ RDS instance ถูก stop เอาไว้ ซึ่งผมยอมรับได้ และไม่ต้องการนับเป็น failed job
  • เมื่อ summarize เสร็จจะส่ง email ด้วย SNS เพื่อแจ้งทีมงาน พร้อมแนบ ARN ของ S3 bucket ที่เก็บ report ของวันนั้น ๆ ไว้
  • ทำ S3 lifecycle policy ลบ report ที่อายุเกิน 90 วันเพื่อไม่ให้ bucket บวม

เชื่อว่าในอนาคต AWS ก็อาจจะออกฟีเจอร์ใหม่มาทำงานคล้ายแบบนี้แหละ (หรือมีแล้วหว่า?) แต่ ณ วันนี้ผมยังไม่เห็นนะ (20 Mar 2022)

4.2 ผลลัพธ์

ทุกวันจะมี email ส่งหาเราแบบด้านล่างนี้แทนที่จะเป็น email หลายสิบหรือร้อยฉบับ

และถ้าเราต้องการรายละเอียดเพิ่มเติมก็ดาวน์โหลด report จาก S3 ได้เลย

จาก email ที่เห็น คิดเล่น ๆ ว่าถ้าผมใช้วิธีที่ 2 หรือ 3 ตามที่ AWS เขียนไว้ใน document ซึ่งจะ notify จาก event โดยตรง แต่ละวันผมจะได้รับ email กี่ฉบับ?!

4.3 วิธีการ Deploy และ Configure

ใครสนใจอยากนำไปใช้งาน หรือต้องการ customize ต่อก็จัดไปครับ สามารถ clone จาก repository นี้ไปได้เลย

โดยผมใช้ Terraform ในการ deploy ทั้งหมด และไม่ขออธิบายวิธีการใช้ Terraform นะครับ ถ้าใช้เป็นอยู่แล้วสิ่งที่ต้องทำจะมีดังนี้

  • แก้ไข terraform/providers.tf = ตรงนี้เป็นการเซ็ต authentication ระหว่าง Terraform กับ AWS ครับ ถ้าเอาง่าย ๆ เพื่อ lab ก็ใส่ profile เป็น API access key ของ account ที่ต้องการ deploy และ configure ไว้บนเครื่องแล้วก็ได้ครับ
  • แก้ไข terraform/nonsecret.tfvars = มี variable หลายตัวที่สามารถ configure ได้ และก็มีความหมายตามชื่อ ที่ต้องใส่ให้ถูกคือ account id ครับ ซึ่งเป็น AWS account ที่เราต้องการจะ deploy นั่นแหละ
  • เปิด terminal และ cd เข้าไปที่ terraform directory, จากนั้นรัน terraform init, terraform plan -var-file="nonsecret.tfvars" และ terraform apply --auto-approve ตามลำดับ
  • เมื่อ deploy เสร็จให้เช็ค inbox ของ email ที่ใส่ไว้เพื่อกด subscribe เพื่อรับ notification ด้วย

Variable ใน nonsecret.tfvars

  • account_id = AWS account ที่ต้องการจะ deploy
  • region = AWS region
  • bucket_name = ชื่อ S3 bucket ที่ใช้เก็บ backup report
  • report_name = ชื่อ report plan ใน AWS Backup
  • report_retention = เก็บ report ใน S3 bucket ไว้กี่วัน
  • function_name = ชื่อ Lambda function
  • function_file = Path ที่เก็บ Python code (.zip)
  • function_log_retention = เก็บ Lambda logs ใน CloudWatch ไว้กี่วัน
  • topic_name = ชื่อ SNS topic
  • subscription_emails = list ของ email ที่ต้องการรับ notification

4.4 อื่น ๆ

ต้องบอกว่า ณ ตอนนี้ยังไม่ support กับกรณีที่เรามีหลาย account ครับ เดี๋ยวถ้ามีเวลาทำจนเสร็จจะเอามาแชร์อีกทีครับ

ถ้าคิดว่าบทความนี้มีประโยชน์ ฝากกด clap, follow และ share บทความนี้ให้ผมด้วยนะครับ ขอบคุณมากครับ ^_^

— — — — — — — — —
บทความทั้งหมดของผม
— — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet