Skip to main content

Amazon SNS

Amazon SNS (Simple Notification Service) เป็นบริการส่งข้อความแบบ Pub/Sub (Publish-Subscribe) ที่ช่วยให้สามารถส่งข้อความเพียงครั้งเดียวแต่กระจายไปยังผู้รับหลาย ๆ คนพร้อมกันได้

An image

ความท้าทายของการส่งข้อความไปยังผู้รับหลายคน

ถ้าเราต้องการส่งข้อความเดียวไปหาหลายบริการ เช่น

  • บริการซื้อ (Buying Service) ส่งอีเมลแจ้งเตือน
  • ส่งข้อความไปที่ Fraud Service
  • ส่งข้อความไปที่ Shipping Service
  • ส่งต่อเข้า SQS Queue

วิธีนี้ยุ่งยากมาก เพราะทุกครั้งที่มีการเพิ่มบริการผู้รับใหม่ จะต้องเขียนการเชื่อมต่อ (integration) เพิ่มเองตลอด

รูปแบบ Publish-Subscribe (Pub/Sub Pattern)

Amazon SNS แก้ปัญหานี้โดยใช้รูปแบบ Pub/Sub

  • แอปซื้อขายจะ Publish ข้อความไปยัง SNS Topic
  • Topic จะมีผู้สมัคร (Subscribers) หลายคน
  • ทุกคนที่ Subscribe Topic นั้น จะได้รับข้อความทั้งหมด

SNS ยังสามารถทำ Message Filtering ได้ เพื่อให้ผู้รับบางคนรับเฉพาะข้อความที่ต้องการ

ขีดความสามารถในการขยาย (Scalability Limits)

  • Subscribers ต่อ 1 Topic: มากกว่า 12,000,000 รายชื่อ
  • จำนวน Topics ต่อบัญชี: ได้สูงสุด 100,000 (สามารถขอเพิ่มได้)

ประเภทของ Subscribers ใน SNS

SNS สามารถส่งข้อความไปยัง:

  • Email

  • SMS / การแจ้งเตือนมือถือ

  • HTTP / HTTPS Endpoint

  • AWS Services

    • SQS → ส่งเข้าคิว
    • Lambda → เรียกใช้โค้ดอัตโนมัติ
    • Kinesis Data Firehose → ส่งต่อไปยัง S3 หรือ Redshift

An image

การเชื่อมต่อกับ AWS Services

หลายบริการของ AWS สามารถส่ง Notification เข้า SNS ได้โดยตรง เช่น:

  • CloudWatch Alarms
  • Auto Scaling Group
  • CloudFormation
  • Budgets
  • S3 Buckets
  • DMS, Lambda, DynamoDB, RDS Events

An image

วิธีการทำงานของ SNS

  1. สร้าง Topic
  2. สร้าง Subscriptions (หลายตัวก็ได้)
  3. Publish ข้อความไปที่ Topic
  4. ผู้สมัครทุกคนจะได้รับข้อความอัตโนมัติ

SNS ยังรองรับ Direct Publish สำหรับ Mobile Apps ผ่าน SDK (Google GCM, Apple APNS, Amazon ADM)

ความปลอดภัยของ Amazon SNS

  • Encryption

    • ข้อมูลถูกเข้ารหัสระหว่างทาง (In-Flight)
    • ข้อมูลถูกเข้ารหัสเมื่อถูกเก็บ (At-Rest) ด้วย KMS
    • รองรับ Client-Side Encryption
  • IAM Policies

    • ควบคุมการเข้าถึง SNS APIs
    • รองรับ SNS Access Policies คล้าย S3 Bucket Policy
    • ใช้สำหรับ Cross-Account Access หรือให้บริการ AWS อื่นเขียนเข้า SNS

Amazon SNS และ SQS – Fan-Out Pattern

SNS + SQS Fan-Out Pattern ถูกออกแบบมาเพื่อส่งข้อความไปยังหลาย SQS Queues ได้อย่างมีประสิทธิภาพ แทนที่จะส่งข้อความแยกกันไปยังแต่ละคิว ซึ่งอาจทำให้เกิดปัญหาเช่น แอปล่ม, ส่งข้อความไม่สำเร็จ, หรือยุ่งยากเมื่อต้องเพิ่มคิวใหม่

แนวคิดหลักคือ ส่งข้อความเพียงครั้งเดียวไปยัง SNS Topic แล้วให้หลาย SQS Queues subscribe กับ Topic นั้น เพื่อรับข้อความทั้งหมดอย่างอิสระ

An image

ตัวอย่าง:

  • บริการซื้อขาย (Buying Service) ต้องการส่งข้อความไปยัง 2 คิว SQS
  • ส่งข้อความไปยัง SNS Topic เพียงครั้งเดียว
  • Fraud Service และ Shipping Service แต่ละบริการมี SQS Queue ของตัวเอง Subscribe กับ Topic
  • ทั้งสองคิวสามารถอ่านข้อความทั้งหมดได้อิสระ

รูปแบบนี้ Decoupled อย่างสมบูรณ์ ลดความเสี่ยงการสูญหายของข้อมูล

  • SQS รองรับ Data Persistence
  • รองรับ Delayed Processing และ Retries
  • สามารถเพิ่ม SQS Queue ใหม่ในอนาคตได้ง่าย

หมายเหตุ: SQS Queue ต้องมี Access Policy อนุญาตให้ SNS Topic เขียนข้อมูลเข้า Queue

การประยุกต์กับ S3 Events

An image

S3 Event Rule มีข้อจำกัด เช่น สำหรับ Event Type + Prefix สามารถมีได้ หนึ่ง Rule ต่อการตั้งค่า

  • หากต้องการส่ง S3 Event เดียวไปหลาย SQS Queue → ใช้ Fan-Out Pattern
  • เมื่อสร้าง Object ใน S3 → Event ถูกส่งไปยัง SNS Topic
  • SQS Queues หลายตัว Subscribe Topic → รับข้อความ Event ได้หลายปลายทาง
  • สามารถส่งต่อไปยัง Email, Lambda หรือแอปพลิเคชันอื่นได้

การเชื่อมต่อกับ Kinesis Data Firehose

An image

  • SNS สามารถเชื่อมต่อกับ Kinesis Data Firehose (KDF)
  • บริการซื้อขายส่งข้อมูลไป SNS Topic → KDF รับและส่งต่อไปยังปลายทาง เช่น S3 Bucket หรือบริการอื่นที่รองรับ KDF
  • ทำให้เก็บข้อความจาก SNS Topic ได้อย่างยืดหยุ่น

Fan-Out กับ FIFO Topics และ Queues

An image

  • SNS รองรับ FIFO Topics → รักษาลำดับข้อความ

  • Producer ส่งข้อความเป็นลำดับ (1,2,3,4) → Subscribers (ต้องเป็น SQS FIFO Queues) จะได้รับข้อความตามลำดับ

  • คุณสมบัติของ SNS FIFO:

    • Message Group ID → จัดลำดับ
    • Deduplication ID หรือ Content-based Deduplication → ป้องกันส่งซ้ำ

ทั้ง SQS Standard และ FIFO สามารถเป็น Subscribers ได้ แต่ Throughput ถูกจำกัดตาม SQS FIFO Queue

ตัวอย่าง: Buying Service ส่งข้อความไป SNS FIFO Topic → Fan-Out ไปยัง 2 SQS FIFO Queues → Fraud Service และ Shipping Service อ่านจาก FIFO Queues

An image

Message Filtering ใน SNS

  • SNS รองรับ Message Filtering → ใช้นโยบาย JSON กรองข้อความสำหรับ Subscription
  • หาก Subscription ไม่มี Filter Policy → จะได้รับข้อความทั้งหมด

An image

ตัวอย่าง:

  • Buying Service ส่ง Transaction ไป SNS Topic
  • แต่ละ Transaction มีฟิลด์: order number, product, quantity, state
  • ต้องการให้ SQS Queue รับเฉพาะคำสั่ง Placed → กำหนด Filter Policy {state: "Placed"}
  • SQS Queue อื่นสามารถตั้ง Filter Policy สำหรับ Canceled
  • Subscription Email สามารถใช้ Filter Policy เดียวกันสำหรับ Canceled Order
  • SQS Queue ที่ไม่มี Filter Policy → รับข้อความทั้งหมด

สรุป (Key Takeaways)

  • Amazon SNS ใช้รูปแบบ Pub/Sub ส่งข้อความจากแหล่งเดียวไปหาผู้รับหลายคน
  • รองรับผู้รับหลายประเภท: Email, SMS, HTTP(S), SQS, Lambda, Kinesis Firehose
  • ผสานการทำงานกับหลายบริการใน AWS ได้โดยตรง
  • มีระบบความปลอดภัยทั้งการเข้ารหัส (in-flight & at-rest), client-side encryption และการควบคุมสิทธิ์ด้วย IAM
  • SNS + SQS Fan-Out Pattern → ส่งข้อความครั้งเดียวไปหลาย SQS Queue อย่างเชื่อถือได้ และ Decoupled
  • SNS Topic สามารถมีหลาย SQS Queues Subscribe → รองรับการกระจายข้อความที่ยืดหยุ่น พร้อม Data Persistence และ Retry
  • รองรับ Cross-Region Delivery และเชื่อมต่อกับบริการอื่น เช่น S3 Events, Kinesis Data Firehose
  • SNS FIFO Topic + SQS FIFO Queue → ส่งข้อความตามลำดับ พร้อม Deduplication และสามารถกรองข้อความเฉพาะที่ต้องการ