Thiết lập AWS SNS
Trước khi gửi thông báo đầu tiên với SNS, bạn cần thực hiện vài bước thiết lập để mọi thứ sẵn sàng.
Bước 1: Tạo tài khoản AWS
Nếu bạn chưa có tài khoản AWS, cần tạo trước khi bắt đầu dùng SNS.
Truy cập trang chủ AWS và nhấp vào nút "Create an AWS Account" ở góc trên bên phải. Bạn sẽ cần cung cấp địa chỉ email, tạo mật khẩu và nhập một số thông tin cơ bản. AWS cũng sẽ yêu cầu chi tiết thẻ tín dụng — đừng lo, SNS có mức miễn phí khá hào phóng và bạn sẽ không bị tính phí trừ khi vượt ngưỡng.
Khi tài khoản đã sẵn sàng, bạn có thể tiếp tục. Tuy nhiên, tôi khuyến nghị mạnh mẽ tạo một người dùng IAM riêng thay vì dùng tài khoản gốc. Chủ đề này vượt phạm vi bài viết hôm nay, nhưng bạn có thể tham khảo hướng dẫn chính thức để có hướng dẫn chi tiết.
Bước 2: Thiết lập SNS trong bảng điều khiển quản trị AWS
Giờ bạn đã có tài khoản AWS, hãy truy cập dịch vụ SNS.
Đăng nhập AWS Management Console bằng thông tin xác thực và tìm SNS. Bạn có thể làm theo ba cách:
- Gõ "SNS" vào ô tìm kiếm trên đầu bảng điều khiển
- Nhấp "Services" trên thanh điều hướng và tìm SNS trong mục "Application Integration"
- Truy cập trực tiếp bảng điều khiển SNS
Dù theo cách nào, bạn sẽ thấy màn hình như sau:

Hình 1 - Trang dịch vụ AWS SNS
Khi vào bảng điều khiển SNS, bạn sẽ thấy menu bên trái với các tùy chọn như "Topics", "Subscriptions" và "Mobile". Bảng điều khiển cung cấp tổng quan về tài nguyên SNS và hoạt động gần đây.
Với tài khoản mới, mọi thứ sẽ khá trống — điều đó là bình thường. Giờ hãy tạo topic SNS đầu tiên.
Bước 3: Tạo một topic SNS
Topic SNS cơ bản là một kênh liên lạc để nhà phát hành gửi thông điệp và người đăng ký lắng nghe.
Hãy tưởng tượng như một đài phát thanh — đài phát trên tần số cụ thể (topic), và ai dò đúng tần số sẽ nhận được chương trình. Trong SNS, ứng dụng của bạn xuất bản thông điệp lên một topic, và tất cả endpoint đăng ký topic đó sẽ nhận thông điệp.
Cách tạo topic SNS đầu tiên:
- Trên màn hình bạn thấy ở Hình 1, nhập tên topic.
- Nhấp nút "Next step".
- Chọn "Standard" cho loại (topic FIFO có trường hợp sử dụng khác sẽ nói sau).
- (Tùy chọn) Nhập tên hiển thị. Tên này sẽ xuất hiện trong các thông điệp gửi tới người đăng ký SMS hoặc email.
- Giữ nguyên các cài đặt khác theo mặc định.
- Nhấp "Create topic".
Nếu bạn thích xem hình hơn đọc chữ, màn hình sẽ như sau:

Hình 2 - Tạo topic SNS
Khi đã hài lòng, cuộn xuống cho đến khi thấy nút "Create topic":

Hình 3 - Tạo topic SNS (2)
Vậy là xong! Topic SNS của bạn đã sẵn sàng. Bạn sẽ thấy các chi tiết như ARN của topic (Amazon Resource Name), định danh duy nhất cho topic của bạn:

Hình 4 - Chi tiết topic đã tạo
Topic mới của bạn sẵn sàng để thêm đăng ký, nhưng hiện chưa có đăng ký nào, nghĩa là thông điệp bạn xuất bản sẽ không đến đâu cả. Đừng lo, bạn sẽ xử lý ở phần tiếp theo khi thêm người đăng ký.
Người đăng ký và đăng ký SNS
Như đã nói, topic SNS giống như một đài phát thanh. Hiện chưa có thính giả, nhưng điều đó sẽ thay đổi khi bạn thêm người đăng ký để nhận thông điệp.
Người đăng ký SNS là gì?
Người đăng ký là bất kỳ endpoint nào nhận thông báo từ topic SNS của bạn khi một thông điệp được xuất bản.
Hãy liên tưởng như bản tin email. Mỗi lần bạn phát hành số mới (thông điệp), nó sẽ được gửi đến tất cả người trong danh sách gửi thư. SNS tự động hóa và mở rộng quy trình này, đồng thời xử lý toàn bộ hậu cần phân phối cho bạn.
AWS hỗ trợ đa dạng loại người đăng ký, mang lại sự linh hoạt trong cách xử lý thông điệp. Dưới đây là các loại chính:
- Địa chỉ email: Gửi thông báo văn bản thuần trực tiếp tới hộp thư.
- Số SMS: Gửi thông báo tin nhắn văn bản đến điện thoại di động.
- Hàng đợi SQS: Định tuyến thông điệp đến các dịch vụ AWS khác để xử lý tiếp.
- Hàm Lambda: Kích hoạt thực thi mã serverless để phản hồi thông báo.
- Endpoint HTTP/HTTPS: Gửi thông điệp đến ứng dụng web hoặc API.
- Thông báo đẩy di động: Gửi thông báo trực tiếp đến ứng dụng di động.
Mỗi loại có ưu điểm và tình huống sử dụng riêng. Ví dụ, email và SMS phù hợp cho người dùng, còn hàng đợi SQS và hàm Lambda thích hợp cho giao tiếp hệ thống-với-hệ thống.
Bước 1: Thêm một người đăng ký
Giờ bạn đã hiểu người đăng ký là gì, hãy thêm một người vào topic. Trong hướng dẫn này, tôi dùng email vì thiết lập đơn giản nhất.
Cách thêm người đăng ký email vào topic SNS:
- Từ trang chi tiết topic (màn hình trong Hình 4), nhấp nút "Create subscription".
- Trong danh sách "Protocol", chọn "Email".
- Trong trường "Endpoint", nhập địa chỉ email sẽ nhận thông báo.
- Giữ các cài đặt khác ở giá trị mặc định.
- Nhấp "Create subscription".
Màn hình của bạn sẽ tương tự như sau:

Hình 5 - Tạo đăng ký email
Sau khi nhấp "Create subscription", AWS sẽ thêm đăng ký vào topic của bạn, nhưng ở trạng thái "pending confirmation" (đang chờ xác nhận):

Hình 6 - Trạng thái đang chờ xác nhận
Đây là tính năng bảo mật quan trọng, vì AWS cần đảm bảo chủ sở hữu địa chỉ email thực sự muốn nhận các thông báo này.
Bước 2: Xác nhận đăng ký
Sau khi thêm người đăng ký, họ phải xác nhận muốn nhận thông báo từ topic SNS của bạn.
Với đăng ký email, AWS tự động gửi email xác nhận tới địa chỉ bạn chỉ định. Email chứa một liên kết mà người nhận phải nhấp để kích hoạt đăng ký. Trước khi xác nhận, mọi thông điệp xuất bản lên topic sẽ không được chuyển tới endpoint này.
Email xác nhận điển hình trông như sau:

Hình 7 - Email xác nhận SNS
Người nhận chỉ cần nhấp liên kết "Confirm subscription" trong email. Họ sẽ được đưa tới trang xác nhận đăng ký đã kích hoạt:

Hình 8 - Thông báo xác nhận đăng ký
Quy trình với người đăng ký SMS cũng tương tự — AWS gửi một tin nhắn văn bản kèm liên kết xác nhận để người nhận truy cập. Endpoint HTTP/HTTPS cần phản hồi yêu cầu xác nhận từ AWS, trong khi tài nguyên AWS như hàm Lambda và hàng đợi SQS có thể cấu hình xác nhận tự động.
Bạn có thể kiểm tra trạng thái đăng ký bằng cách nhấp vào mục "Subscriptions" ở thanh bên trái của bảng điều khiển SNS. Đăng ký đã xác nhận sẽ hiển thị trạng thái "Confirmed", còn đăng ký đang chờ hiển thị "Pending confirmation".

Hình 9 - Trạng thái đăng ký
Khi đăng ký được xác nhận, bạn sẵn sàng gửi thông điệp! Bất kỳ thông điệp nào xuất bản lên topic sẽ được chuyển đến tất cả người đăng ký đã xác nhận theo giao thức đã chỉ định.
Thiết lập đăng ký SNS chỉ có vậy. Ở phần tiếp theo, bạn sẽ học cách xuất bản thông điệp lên topic và kiểm tra người đăng ký nhận đúng.
Xuất bản thông điệp lên topic SNS
Giờ bạn đã thiết lập topic SNS và thêm người đăng ký, hãy gửi thông báo đầu tiên.
Bước 1: Xuất bản một thông điệp
Một cách khởi đầu tốt là xuất bản thông điệp qua AWS Console.
Để gửi thông điệp đầu tiên, điều hướng tới trang chi tiết topic và nhấp nút "Publish message" ở góc trên bên phải (xem Hình 4). Biểu mẫu xuất bản sẽ mở để bạn soạn thông báo. Bạn sẽ thấy các trường cho tiêu đề và nội dung thông điệp. Tiêu đề là tùy chọn nhưng hữu ích với email vì sẽ trở thành tiêu đề thư.
Với thông điệp kiểm thử đơn giản, bạn có thể nhập như sau:

Hình 10 - Nội dung thông điệp đầu tiên
Khi đã hài lòng, cuộn xuống và nhấp nút "Publish message" ở cuối biểu mẫu:

Hình 11 - Xuất bản thông điệp qua console
Sau khi nhấp, SNS sẽ lập tức phân phối thông điệp tới tất cả người đăng ký đã xác nhận. Nếu bạn đã thiết lập đăng ký email, bạn sẽ nhận thư kiểm thử trong vài giây:

Hình 12 - Thông điệp nhận qua email
Đơn giản phải không? Giờ hãy xem cách tùy biến sâu hơn.
Bước 2: Gửi thông báo SMS và email
SNS cho phép bạn tùy biến cách hiển thị thông điệp cho từng loại người đăng ký.
Khi xuất bản thông điệp, bạn sẽ thấy tùy chọn "Message structure". Mặc định là "Identical payload for all delivery protocols", nghĩa là mọi người đăng ký nhận cùng một thông điệp. Tuy nhiên, bạn có thể chọn "Custom payload for each delivery protocol" để điều chỉnh định dạng thông điệp cho từng loại người đăng ký.
Với thông báo email, bạn có hai định dạng:
- Email-JSON: Gửi payload JSON thô tới endpoint email.
- Email: Gửi email được định dạng với tiêu đề và nội dung thông điệp.

Hình 13 - Tùy biến payload
Với thông báo SMS, lưu ý giới hạn 160 ký tự. SNS vẫn gửi thông điệp dài hơn, nhưng sẽ tách thành nhiều tin. Bạn cũng có thể đặt loại thông điệp SMS là "Promotional" hoặc "Transactional", ảnh hưởng đến tối ưu hóa phân phối:

Hình 14 - Tùy chọn SMS
Bạn đã biết cách gửi và tùy chỉnh thông báo email qua AWS Console. Tiếp theo, bạn sẽ học cách làm tương tự qua CLI và Python.
Bước 3: Dùng AWS CLI hoặc SDK để xuất bản thông điệp
Console rất phù hợp cho kiểm thử thủ công, nhưng trong thực tế, bạn sẽ muốn xuất bản thông điệp bằng lập trình.
AWS Command Line Interface (CLI) giúp gửi thông điệp SNS từ terminal hoặc script tự động trở nên dễ dàng.
Giả sử bạn đã cài đặt và cấu hình AWS CLI, chạy lệnh sau để xuất bản thông điệp qua CLI:
aws sns publish --topic-arn "sns-arn" --subject "CLI Notification" --message "Hello from the AWS CLI!"

Hình 15 - Xuất bản thông điệp qua AWS CLI
Ngay lập tức, bạn sẽ thấy thông điệp tương tự trong hộp thư:

Hình 16 - Xuất bản thông điệp qua AWS CLI (2)
Với các ứng dụng nâng cao, AWS SDK cung cấp khả năng truy cập lập trình tới SNS trong nhiều ngôn ngữ.
Dưới đây là ví dụ đơn giản để xuất bản thông điệp bằng Python với thư viện boto3:
import boto3
# Initialize the SNS client
sns_client = boto3.client("sns", region_name="eu-central-1")
# Topic ARN (Amazon Resource Name)
topic_arn = "sns-arn"
# Publish a simple message
response = sns_client.publish(
TopicArn=topic_arn, Message="Hello from Python!", Subject="Python Notification"
)
# Check if the message was sent successfully
if "MessageId" in response:
print(f"Message published successfully! Message ID: {response['MessageId']}")

Hình 17 - Xuất bản thông điệp qua Python SDK
Một lần nữa, thông điệp được chuyển ngay vào hộp thư của tôi:

Hình 18 - Xuất bản thông điệp qua Python SDK (2)
Chỉ vậy thôi là bạn có thể xuất bản thông điệp với SNS! Giờ bạn có nhiều cách gửi thông báo, từ giao diện console đơn giản đến lập trình bằng AWS CLI hoặc SDK.
> Mới làm quen với AWS Boto trong Python? Đăng ký khóa học để nhanh chóng thành thạo.
Phần tiếp theo, chúng ta sẽ khám phá một số tính năng nâng cao của SNS để nâng tầm hệ thống thông báo của bạn.
Các tính năng nâng cao của SNS
Đến giờ bạn đã nắm cơ bản về SNS. Phần này giới thiệu vài tính năng nâng cao làm nên sức mạnh thật sự của SNS.
Lọc thông điệp trong SNS
Gửi cùng một thông báo cho tất cả người đăng ký thường dẫn đến việc endpoint nhận những thứ họ không quan tâm.
Lọc thông điệp giải quyết vấn đề này bằng cách cho phép người đăng ký lọc thông điệp dựa trên thuộc tính. Hãy coi như bạn thiết lập bộ lọc email — bạn tạo quy tắc để quyết định thông điệp nào được chuyển. Với SNS, các quy tắc này gọi là filter policies (chính sách lọc).
Bạn có thể thiết lập chính sách lọc trên các đăng ký để họ chỉ nhận thông điệp phù hợp:

Hình 19 - Chính sách lọc thông báo
Trong ví dụ này, người đăng ký chỉ nhận thông báo với thuộc tính order_value có giá trị số từ 1500 trở lên.
Giờ, để gửi một thông báo như vậy, bạn có thể dùng đoạn mã Python sau:
import boto3
# Initialize the SNS client
sns_client = boto3.client("sns", region_name="eu-central-1")
# Topic ARN (Amazon Resource Name)
topic_arn = "arn:aws:sns:eu-central-1:105036517833:TestTopic"
response = sns_client.publish(
TopicArn=topic_arn,
Message="A new high-value order has been placed",
Subject="New Order Notification",
MessageAttributes={
"order_value": {"DataType": "Number", "StringValue": "2000"},
"region": {"DataType": "String", "StringValue": "EU"},
"category": {"DataType": "String", "StringValue": "Electronics"},
},
)
print(response)
Đây là những gì bạn sẽ thấy sau khi chạy script Python:

Hình 20 - Gửi thông báo qua Python
Chỉ khi giá trị order_value từ 1500 trở lên, bạn mới nhận được thông báo:

Hình 21 - Nội dung thông báo
Tóm lại, chính sách lọc cho phép bạn gửi thông báo có mục tiêu mà không cần thay đổi mã xuất bản. Hay nhất là việc lọc diễn ra phía AWS, không phải trong ứng dụng của bạn, giúp tăng hiệu quả và giảm lưu lượng không cần thiết.
Hàng đợi thư chết (DLQ) của SNS
Việc phân phối thông điệp đôi khi vẫn có thể thất bại ngay cả với hệ thống đáng tin cậy nhất.
Dead Letter Queue (DLQ) là một hàng đợi Amazon SQS đặc biệt, nơi SNS có thể gửi các thông điệp không thể phân phối đến người đăng ký. Điều này thường xảy ra khi người đăng ký không khả dụng hoặc trả về lỗi. Thay vì mất vĩnh viễn các thông điệp thất bại, SNS chuyển chúng tới DLQ để bạn phân tích hoặc thử gửi lại sau.
Thiết lập DLQ gồm hai bước. Đầu tiên, tạo một hàng đợi SQS làm DLQ của bạn:

Hình 22 - Tạo hàng đợi SQS
Sau đó, cấu hình đăng ký SNS của bạn để dùng hàng đợi này cho thông điệp không thể phân phối:

Hình 23 - Thêm chính sách redrive cho hàng đợi SQS
Cấu hình này yêu cầu quyền phù hợp, vì SNS cần có khả năng gửi thông điệp đến hàng đợi SQS. Trong console AWS, bạn có thể thiết lập bằng một ô chọn đơn giản, nhưng nếu dùng CloudFormation hoặc công cụ hạ tầng dưới dạng mã khác, bạn sẽ cần thêm quyền IAM phù hợp.
Khi có DLQ, bạn có thể giám sát các lỗi phân phối và hành động khi cần. Ví dụ, bạn có thể thiết lập cảnh báo khi DLQ bắt đầu có thông điệp, báo cho bạn về vấn đề tiềm ẩn với người đăng ký — nhưng nội dung đó vượt phạm vi phần này.
Sử dụng AWS Lambda với SNS
Các hàm Lambda mở ra vô số khả năng xử lý thông điệp SNS.
Khi bạn đăng ký một hàm Lambda vào topic SNS, hàm sẽ tự động được kích hoạt mỗi khi có thông điệp xuất bản. Cách tiếp cận serverless của Lambda nghĩa là bạn không cần quản lý hạ tầng xử lý thông điệp, vì nó tự động mở rộng theo khối lượng thông điệp.
Bắt đầu bằng cách tạo một hàm Lambda:

Hình 24 - Tạo hàm Lambda
Sau đó, điền đoạn mã tương tự như sau:
def lambda_handler(event, context):
# SNS messages come in the 'Records' array
for record in event["Records"]:
# Extract the message
message = record["Sns"]["Message"]
subject = record["Sns"]["Subject"]
timestamp = record["Sns"]["Timestamp"]
# Process the message
print(f"Received message: {message}")
print(f"Subject: {subject}")
print(f"Timestamp: {timestamp}")
# Your business logic here
# For example, store the message in a database
# or trigger another AWS service
print("ALL DONE!")
# Return success
return {"statusCode": 200, "body": "Message processed successfully"}

Hình 25 - Mã hàm Lambda
Khi mã đã sẵn sàng, nhấp nút "Add trigger" để kết nối Lambda với SNS:

Hình 26 - Kết nối SNS với Lambda
Hàm giờ đã được kết nối với hàng đợi, nghĩa là bạn có thể gửi thông báo kiểm thử:

Hình 27 - Thông báo kiểm thử
Hàm Lambda cho phép bạn theo dõi log, nghĩa là bạn có thể xem các lần gọi hàm gần đây — kết quả của việc gửi thông báo:

Hình 28 - Log của hàm Lambda
Hàm Lambda có thể làm hầu như mọi thứ với các thông điệp này — lưu vào cơ sở dữ liệu, kích hoạt dịch vụ AWS khác, gửi email hoặc gọi API bên ngoài. Điều này khiến SNS và Lambda trở thành cặp đôi mạnh mẽ để xây dựng kiến trúc hướng sự kiện. Bạn có thể tìm hiểu thêm về Lambda trong hướng dẫn Bắt đầu với AWS Lambda.
Tiếp theo, bạn sẽ học những điều cơ bản về giám sát và ghi log với SNS.
Giám sát và ghi log hoạt động SNS
Theo dõi hoạt động SNS là điều thiết yếu để duy trì hệ thống thông báo đáng tin cậy.
Sử dụng Amazon CloudWatch với SNS
Amazon CloudWatch cung cấp khả năng giám sát toàn diện cho mọi dịch vụ AWS của bạn, bao gồm SNS. Khi thiết lập CloudWatch cho SNS, bạn có cái nhìn về các chỉ số vận hành quan trọng như tỷ lệ phân phối thông điệp, số lần thất bại và mẫu sử dụng API.
Để bắt đầu với giám sát CloudWatch cho SNS, hãy mở bảng điều khiển CloudWatch trong tài khoản AWS của bạn. Tại đây, bạn có thể truy cập các chỉ số SNS được AWS tự động thu thập sẵn.
Các chỉ số SNS giá trị nhất cần theo dõi gồm:
- NumberOfMessagesPublished: Theo dõi số lượng thông điệp được xuất bản lên các topic.
- NumberOfNotificationsDelivered: Hiển thị số lần phân phối thành công tới người đăng ký.
- NumberOfNotificationsFailed: Nổi bật số lần phân phối thất bại, có thể cho thấy vấn đề cấu hình.
- PublishSize: Đo kích thước thông điệp được xuất bản, giúp bạn ở trong giới hạn dịch vụ.

Hình 29 - Bảng điều khiển CloudWatch mặc định cho SNS
Thiết lập cảnh báo CloudWatch cho phép bạn phản ứng nhanh với vấn đề tiềm ẩn trước khi ảnh hưởng đến người dùng. Ví dụ, bạn có thể tạo cảnh báo kích hoạt khi số lần phân phối thất bại vượt ngưỡng:
- Trong bảng điều khiển CloudWatch, điều hướng tới mục "Alarms".
- Nhấp "Create alarm" và chọn chỉ số SNS bạn muốn theo dõi.
- Đặt ngưỡng (ví dụ, hơn 5 lần thất bại trong 5 phút).
- Cấu hình hành động thông báo, như gửi cảnh báo cho đội vận hành.
Nếu bạn thích hình ảnh hơn chỉ dẫn văn bản, hãy bắt đầu tạo cảnh báo cho chỉ số quan tâm, như NumberOfNotificationsFailed. Thiết lập ngưỡng để kích hoạt cảnh báo:

Hình 30 - Tạo cảnh báo
Vậy là xong — cảnh báo đã được tạo và hoạt động:

Hình 31 - Tạo cảnh báo (2)
Những cảnh báo này có thể giúp bạn chủ động xử lý sự cố thay vì chỉ biết đến khi người dùng phàn nàn.
Xem lại log SNS
AWS CloudTrail ghi lại toàn bộ hoạt động API trong tài khoản AWS của bạn, bao gồm các thao tác trong dịch vụ SNS.
Mọi thao tác trên topic SNS — thực hiện qua console, CLI, hay SDK — đều tạo một mục trong log CloudTrail. Những log này cung cấp thông tin giá trị cho phân tích bảo mật, theo dõi thay đổi tài nguyên và tuân thủ.
Để truy cập log SNS trong CloudTrail:
- Mở bảng điều khiển CloudTrail trong tài khoản AWS của bạn (có thể bạn cần tạo trail mới).
- Đi tới "Event history" để xem hoạt động SNS gần đây.
- Lọc sự kiện bằng cách chọn "Event source" và nhập "sns.amazonaws.com".
Một lần nữa, nếu hướng dẫn văn bản là chưa đủ, hãy xem hình dưới. Bắt đầu bằng việc tạo trail mới:

Hình 32 - Tạo trail mới
Sau đó trong "Event history", lọc để chỉ gồm các sự kiện của SNS:

Hình 33 - Lọc log
Log được lưu tự động trong một bucket S3, nghĩa là cách tiếp cận này cung cấp không gian lưu trữ lâu dài và cho phép truy vấn nâng cao.
> Lưu trữ trên AWS hoạt động như thế nào? Đọc hướng dẫn về S3 và EFS.
Tổng kết lại, bằng cách kết hợp chỉ số CloudWatch với log CloudTrail, bạn xây dựng một hệ thống giám sát toàn diện giúp đảm bảo hạ tầng SNS vận hành ổn định.
Thực tiễn tốt nhất khi sử dụng AWS SNS
Bạn đã biết các tính năng cơ bản và nâng cao của AWS SNS. Phần còn lại là các thực tiễn tốt nhất khi tạo topic và gửi thông điệp.
Bảo mật các topic SNS
Bảo mật nên là ưu tiên hàng đầu khi thiết lập hạ tầng SNS. Nếu không có kiểm soát phù hợp, topic của bạn có thể dễ bị truy cập trái phép — rủi ro bảo mật nghiêm trọng.
AWS Identity and Access Management (IAM) cung cấp công cụ bạn cần để bảo vệ topic SNS. Bắt đầu bằng việc tạo policy theo nguyên tắc tối thiểu đặc quyền — chỉ cấp đúng quyền cần thiết cho từng người dùng hoặc dịch vụ. Ví dụ, bạn có thể muốn một số ứng dụng chỉ được xuất bản thông điệp, trong khi số khác chỉ cần đăng ký topic.
Dưới đây là ví dụ policy IAM giới hạn quyền xuất bản vào một topic cụ thể:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "sns-arn"
}
]
}
Bạn cũng có thể dùng policy của topic để kiểm soát tài khoản AWS nào có thể đăng ký topic của bạn. Điều này đặc biệt quan trọng khi chia sẻ dữ liệu qua ranh giới tổ chức.
Đừng quên thường xuyên kiểm toán quyền bằng AWS CloudTrail và loại bỏ quyền truy cập không còn cần thiết.
Quản lý lưu lượng thông điệp
Lưu lượng thông điệp lớn có thể làm quá tải người đăng ký nếu không xử lý đúng. Đây là lúc kết hợp SNS với các dịch vụ AWS khác trở nên quan trọng.
Một mẫu phổ biến là kiến trúc "fanout", trong đó bạn xuất bản thông điệp lên một topic SNS có nhiều hàng đợi SQS đăng ký. Mỗi hàng đợi sau đó cung cấp dữ liệu cho hệ thống xử lý khác nhau theo nhịp độ riêng. Cách này tách rời nhà phát hành khỏi bên tiêu thụ và tạo bộ đệm trong các đợt tăng tải.
Với nhu cầu xử lý theo thời gian thực, hãy cân nhắc đăng ký hàm Lambda vào topic. Lambda tự động mở rộng theo lưu lượng thông điệp, loại bỏ nhu cầu cung cấp và quản lý máy chủ.
Giảm chi phí
Dù SNS tiết kiệm chi phí, nhưng chi tiêu có thể tăng nhanh khi lưu lượng lớn. Một vài lựa chọn chiến lược sẽ giúp bạn kiểm soát chi phí.
Đầu tiên, hãy chọn lọc giao thức đăng ký. Endpoint HTTP/HTTPS thường tiết kiệm chi phí nhất. Thông báo email tuy tiện lợi nhưng nên dùng có chừng mực vì chi phí trên mỗi thông điệp cao hơn.
Lọc thông điệp cũng là công cụ tiết kiệm chi phí mạnh mẽ. Bằng cách áp dụng chính sách lọc trên đăng ký, bạn đảm bảo thông điệp chỉ được gửi tới người thực sự quan tâm. Ví dụ, nếu bạn có topic cho toàn bộ cảnh báo hệ thống, bạn có thể muốn kỹ sư trực ca chỉ nhận cảnh báo nghiêm trọng trong ca của họ, chứ không phải mọi thông báo:
# Subscribe with a filter policy
response = sns.subscribe(
TopicArn="sns-arn",
Protocol="email",
Endpoint="[email protected]",
Attributes={"FilterPolicy": '{"severity": ["critical"]}'},
)
Cuối cùng, thường xuyên xem lại việc sử dụng SNS trong AWS Cost Explorer và tìm cơ hội hợp nhất topic hoặc gỡ đăng ký không dùng. Tài nguyên dư thừa hoặc trùng lặp không chỉ làm tăng chi phí mà còn làm phức tạp kiến trúc của bạn.
Bằng cách tuân theo các thực tiễn tốt nhất này, bạn sẽ xây dựng một triển khai SNS an toàn, có khả năng mở rộng và tiết kiệm chi phí — đủ để có dịch vụ thông báo tin cậy mà không lo phát sinh chi phí hay rủi ro bảo mật ngoài ý muốn.
Tổng kết về AWS SNS
Nếu bạn cần thông báo theo thời gian thực trên các ứng dụng phân tán, AWS SNS là lựa chọn hàng đầu. Dễ sử dụng, tích hợp tốt với dịch vụ AWS khác và mở rộng vô hạn theo nhu cầu.
Mô hình publish-subscribe trong SNS giúp triển khai hệ thống thông báo có thể tiếp cận nhiều kênh đồng thời trở nên đơn giản. Từ tạo topic và quản lý người đăng ký đến áp dụng tính năng nâng cao như lọc thông điệp và DLQ, bạn đã có kiến thức để xây dựng hạ tầng thông báo vững chắc.
Bạn cũng đã tìm hiểu các khía cạnh quan trọng về giám sát, bảo mật và quản lý chi phí để đảm bảo triển khai SNS luôn tin cậy và hiệu quả trong môi trường sản xuất.
Khi ứng dụng ngày càng áp dụng kiến trúc hướng sự kiện, các dịch vụ như SNS càng trở nên giá trị. Dù bạn xây dựng hệ thống cảnh báo đơn giản hay microservice phức tạp, các mẫu trong hướng dẫn này cung cấp nền tảng cho giao tiếp hiệu quả giữa các thành phần hệ thống.
Để tìm hiểu thêm về AWS, hãy theo dõi các khóa học của DataCamp:
Bạn thậm chí có thể dùng DataCamp để chuẩn bị cho các kỳ thi chứng chỉ AWS - AWS Cloud Practitioner (CLF-C02).
FAQs
AWS SNS là gì và khác SQS như thế nào?
AWS SNS (Simple Notification Service) là dịch vụ nhắn tin được quản lý toàn diện, cho phép bạn gửi thông báo từ nhà phát hành tới nhiều người đăng ký. Khác với SQS (Simple Queue Service) sử dụng mô hình hàng đợi, nơi mỗi thông điệp được xử lý bởi một bên tiêu thụ duy nhất, SNS dùng mô hình publish-subscribe để phát sóng một thông điệp tới nhiều người nhận đồng thời. Sự khác biệt cốt lõi này khiến SNS phù hợp cho thông báo sự kiện, còn SQS phù hợp hơn cho xử lý tác vụ.
Những loại endpoint nào có thể đăng ký topic SNS?
AWS SNS hỗ trợ nhiều loại endpoint đăng ký, bao gồm địa chỉ email, số điện thoại SMS, hàng đợi SQS, hàm Lambda, endpoint HTTP/HTTPS và thông báo đẩy di động. Sự đa dạng này mang lại tính linh hoạt cho cách phân phối và xử lý thông báo, cho phép bạn tiếp cận cả người dùng (qua email hoặc SMS) và hệ thống khác (qua Lambda, SQS, hoặc HTTP) chỉ với một thông điệp được xuất bản.
Làm sao để bảo mật các topic SNS?
Bảo mật topic SNS liên quan đến việc áp dụng kiểm soát truy cập phù hợp thông qua policy IAM theo nguyên tắc tối thiểu đặc quyền. Bạn có thể giới hạn ai được xuất bản lên topic và quản lý đăng ký, đồng thời dùng policy của topic để kiểm soát tài khoản AWS nào có thể đăng ký. Với dữ liệu nhạy cảm, AWS SNS hỗ trợ mã hóa phía máy chủ để bảo vệ nội dung thông điệp trong khi truyền tải. Các đợt kiểm toán bảo mật định kỳ bằng log CloudTrail giúp phát hiện nỗ lực truy cập trái phép hoặc lỗ hổng tiềm ẩn trong triển khai SNS của bạn.
Làm thế nào để triển khai lọc thông điệp trong SNS?
Lọc thông điệp trong SNS cho phép người đăng ký chỉ nhận thông báo quan trọng với họ. Điều này được thực hiện thông qua chính sách lọc do người đăng ký định nghĩa dựa trên thuộc tính thông điệp. Khi bạn xuất bản thông điệp kèm thuộc tính cụ thể (như giá trị đơn hàng, khu vực, mức độ ưu tiên), SNS sẽ so sánh các thuộc tính này với chính sách lọc của từng người đăng ký và chỉ phân phối khi có khớp. Việc lọc diễn ra phía AWS thay vì trong ứng dụng của bạn, giúp tăng hiệu quả và giảm lưu lượng không cần thiết.
DLQ (Dead Letter Queue) hoạt động với SNS như thế nào?
Dead Letter Queue đóng vai trò lưới an toàn cho các lần phân phối thất bại trong SNS. Khi một thông điệp không thể được phân phối tới người đăng ký (thường do không khả dụng hoặc trả về lỗi), SNS có thể chuyển hướng nó đến một hàng đợi SQS được chỉ định thay vì mất hoàn toàn. Hệ thống DLQ này cho phép bạn ghi nhận, phân tích và có thể thử phân phối lại các thông điệp thất bại. Nó đặc biệt hữu ích với thông báo quan trọng cho hoạt động kinh doanh, giúp cung cấp khả năng quan sát các vấn đề phân phối vốn có thể bị bỏ sót.

Quản lý thông báo theo thời gian thực trên nhiều ứng dụng có thể là một thách thức lớn — ít nhất là khi bạn chưa có dịch vụ nhắn tin phù hợp.
Amazon Simple Notification Service (SNS) mang đến một giải pháp nhắn tin được quản lý toàn diện để tách rời và mở rộng microservice, hệ thống phân tán và ứng dụng serverless. SNS cho phép bạn gửi thông điệp đến số lượng lớn người đăng ký qua nhiều giao thức truyền tải như HTTP/S, email, SMS và thông báo đẩy trên thiết bị di động. AWS SNS xử lý toàn bộ phần phức tạp của việc phân phối thông điệp, bao gồm đảm bảo độ tin cậy, thử lại và backoff, giúp bạn tập trung xây dựng các tính năng cốt lõi của ứng dụng.
AWS SNS tuân theo mô hình publish-subscribe vừa dễ mở rộng vừa dễ hiểu. Một thông điệp được xuất bản có thể được phân phối đồng thời đến nhiều điểm cuối, khiến SNS trở nên lý tưởng cho kiến trúc hướng sự kiện.
Trong hướng dẫn này, tôi sẽ đưa bạn qua quá trình thiết lập và sử dụng AWS SNS để gửi thông báo qua nhiều kênh khác nhau.
AWS SNS là gì?
Amazon Simple Notification Service (SNS) là dịch vụ nhắn tin pub/sub được quản lý của AWS, cho phép bạn tách rời microservice, hệ thống phân tán và ứng dụng serverless.
SNS hoạt động theo mô hình publish-subscribe đơn giản, trong đó nhà phát hành gửi thông điệp lên chủ đề (topic) và người đăng ký nhận các thông điệp đó. Hãy coi một chủ đề SNS như một kênh liên lạc — bạn xuất bản thông điệp lên kênh này và bất cứ ai đăng ký đều được thông báo ngay. Điểm hay của hệ thống là nhà phát hành không cần biết ai đang nhận thông điệp, và người đăng ký cũng không cần biết ai đang gửi.
Bạn có thể thắc mắc SNS khác gì so với các dịch vụ nhắn tin khác của AWS như Simple Queue Service (SQS). Nói ngắn gọn, SQS dùng mô hình hàng đợi chủ yếu để xử lý tác vụ bất đồng bộ, trong khi SNS tập trung phát sóng thông điệp đến nhiều người nhận cùng lúc. Điều này khiến SNS hoàn hảo cho các tình huống cần thông báo cho nhiều hệ thống về một sự kiện vừa xảy ra. Bạn có thể tìm hiểu thêm về sự khác biệt trong bài viết SQS vs SNS.
SNS hỗ trợ nhiều giao thức phân phối, từ đó đem lại sự linh hoạt trong cách người đăng ký nhận thông báo.
Các tính năng chính của AWS SNS
SNS đi kèm nhiều tính năng khiến bạn chẳng cần thêm dịch vụ thông báo nào khác. Tôi sẽ liệt kê vài điểm:
Nhưng điểm tuyệt nhất của SNS phải là khả năng mở rộng. SNS tự động mở rộng theo nhu cầu ứng dụng. Dù bạn gửi mười hay mười triệu thông báo mỗi ngày, dịch vụ sẽ tự điều chỉnh mà không cần can thiệp thủ công.
Tiếp theo, tôi sẽ hướng dẫn bạn cách thiết lập SNS.