ทริกเกอร์ Lambda ด้วย SQS/SNS
กำหนดค่าฟังก์ชัน Lambda ให้ถูกเรียกใช้โดยคิว SQS และหัวข้อ SNS เพื่อเปิดใช้งานกระบวนการทำงานที่ขับเคลื่อนด้วยเหตุการณ์
ทริกเกอร์ Lambda ด้วย SQS/SNS เป็นบทเรียน Serverless Backend with AWS Lambda & API Gateway ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Serverless Backend with AWS Lambda & API Gateway และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Serverless Backend with AWS Lambda & API Gateway มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
Event-Driven Lambda Triggers
Lambda functions are at the heart of serverless, but how do they know when to run? They respond to events!
An event is anything that happens in your AWS environment, like a file upload to S3, a new item in DynamoDB, or in this lesson, a message arriving in SQS or SNS.
Using SQS and SNS to trigger Lambda enables powerful event-driven architectures. This means services communicate through events, making systems more flexible and scalable.
SQS Triggers for Lambda
Amazon SQS (Simple Queue Service) is a managed message queue service. When you configure an SQS queue as a Lambda trigger, Lambda polls the queue for messages.
Here's how it works:
- Lambda continuously checks the SQS queue.
- When messages are available, Lambda retrieves a batch of them.
- It then invokes your function for each batch or for individual messages, depending on configuration.
- After successful processing, Lambda deletes the messages from the queue.
Setting Up SQS Trigger
To connect an SQS queue to a Lambda function, you typically do it through the AWS Management Console, AWS CLI, or Infrastructure as Code (like AWS SAM or CloudFormation).
Key configurations include:
- Batch size: How many messages Lambda fetches at once (e.g., 1 to 10).
- Batch window: How long Lambda waits to gather a batch (up to 5 minutes).
- Polling frequency: Lambda manages this automatically.
This setup allows your function to process messages asynchronously, decoupling the message producer from the consumer.
Processing SQS Messages
Your Lambda function receives SQS messages in an event object. This object contains a Records array, where each item is an SQS message.
Let's see a simple Python example that processes messages from an SQS queue. Imagine these messages contain user IDs for processing.
import json
def lambda_handler(event, context):
print("Received SQS event:")
for record in event['Records']:
message_body = record['body']
print(f"Processing message: {message_body}")
# Example: parse JSON body if expected
try:
data = json.loads(message_body)
user_id = data.get('userId')
print(f"Extracted userId: {user_id}")
# Add your business logic here
except json.JSONDecodeError:
print(f"Message body is not valid JSON: {message_body}")
return {
'statusCode': 200,
'body': json.dumps('Messages processed successfully!')
}
# --- For local testing (simulated event) ---
if __name__ == '__main__':
# Simulate an SQS event
simulated_sqs_event = {
"Records": [
{
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
"receiptHandle": "AQEBwJnKyrgtLvC5...",
"body": '{"userId": "user123", "action": "signup"}',
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1523232000000",
"SenderId": "AIDAIY234234234234234",
"ApproximateFirstReceiveTimestamp": "1523232000001"
},
"messageAttributes": {},
"md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue",
"awsRegion": "us-east-1"
},
{
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb79",
"receiptHandle": "AQEBwJnKyrgtLvC5...",
"body": '{"userId": "user456", "action": "login"}',
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1523232000000",
"SenderId": "AIDAIY234234234234234",
"ApproximateFirstReceiveTimestamp": "1523232000001"
},
"messageAttributes": {},
"md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:my-queue",
"awsRegion": "us-east-1"
}
]
}
lambda_handler(simulated_sqs_event, None)SQS Event Details
Let's break down the key parts of an SQS event passed to your Lambda function:
event['Records']: A list of SQS messages. Your function will iterate through this.record['body']: The actual message content, usually a JSON string that you'll need to parse.record['messageId']: A unique ID for the message. Useful for logging and idempotency.record['attributes']: Contains metadata likeSentTimestamp.record['eventSource']: Always "aws:sqs" for SQS triggers.
Always assume body is a string and parse it if you expect JSON.
SNS Triggers for Lambda
Amazon SNS (Simple Notification Service) is a fully managed pub/sub messaging service. Unlike SQS, SNS uses a push model to deliver notifications.
When an SNS topic receives a message, it immediately pushes that message to all its subscribed endpoints, which can include Lambda functions.
This is perfect for:
- Fan-out scenarios (one message triggers multiple actions).
- Broadcasting alerts or notifications.
- Decoupling publishers from multiple subscribers.
Setting Up SNS Trigger
Connecting an SNS topic to a Lambda function is straightforward. You subscribe your Lambda function to the SNS topic.
Steps:
- Create an SNS topic.
- Create your Lambda function.
- Add an SNS trigger to your Lambda function, selecting the topic.
- Ensure your Lambda's execution role has permission to be invoked by SNS.
Once configured, any message published to the SNS topic will automatically invoke your Lambda function.
Processing SNS Notifications
When triggered by SNS, your Lambda function receives an event object that contains details about the notification. The most important part is the Message field within the Sns object.
Here's a Python example that logs an SNS notification.
import json
def lambda_handler(event, context):
print("Received SNS event:")
for record in event['Records']:
sns_message = record['Sns']
message_id = sns_message['MessageId']
topic_arn = sns_message['TopicArn']
subject = sns_message.get('Subject', 'No Subject')
message_body = sns_message['Message']
timestamp = sns_message['Timestamp']
print(f"Message ID: {message_id}")
print(f"Topic ARN: {topic_arn}")
print(f"Subject: {subject}")
print(f"Message: {message_body}")
print(f"Timestamp: {timestamp}")
# Add your business logic here, e.g., send an email, update a database
return {
'statusCode': 200,
'body': json.dumps('SNS notification processed!')
}
# --- For local testing (simulated event) ---
if __name__ == '__main__':
# Simulate an SNS event
simulated_sns_event = {
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:my-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Sns": {
"Type": "Notification",
"MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"TopicArn": "arn:aws:sns:us-east-1:123456789012:my-topic",
"Subject": "New Order Confirmation",
"Message": "{\"orderId\": \"ORD-789\", \"customer\": \"Jane Doe\"}",
"Timestamp": "2023-10-27T10:00:00.000Z",
"SignatureVersion": "1",
"Signature": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SigningCertUrl": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem",
"UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:123456789012:my-topic:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"MessageAttributes": {
"EventType": {"Type": "String", "Value": "OrderCreated"}
}
}
}
]
}
lambda_handler(simulated_sns_event, None)SNS Event Details
Similar to SQS, the SNS event also comes with a Records array, but the structure inside is different:
event['Records']: A list, typically containing one SNS notification per invocation.record['Sns']: This object holds the core notification details.record['Sns']['MessageId']: Unique ID for the SNS message.record['Sns']['TopicArn']: The ARN of the SNS topic that published the message.record['Sns']['Subject']: The subject of the notification (optional).record['Sns']['Message']: The actual content of the notification, often a JSON string.
Remember to parse Message if you expect structured data.
Trigger Best Practices
When using SQS and SNS to trigger Lambda, keep these best practices in mind:
- Idempotency: Design your Lambda to handle duplicate messages without unintended side effects, as messages can sometimes be delivered more than once.
- Error Handling: Configure a Dead-Letter Queue (DLQ) for your SQS-triggered Lambda. Failed messages will be sent there for later inspection.
- Batch Processing: For SQS, process messages in batches efficiently. If one message in a batch fails, the entire batch might be retried.
- Permissions: Ensure the Lambda execution role has permissions to access SQS/SNS and other services it interacts with.
Triggering Lambda Quiz
Test your knowledge on SQS and SNS triggers for Lambda!
Recap & Next Steps
Great job! You've learned how to harness event-driven power by integrating Lambda with SQS and SNS.
- SQS Triggers: Enable asynchronous, decoupled message processing with Lambda polling queues.
- SNS Triggers: Facilitate real-time, fan-out notifications by pushing messages to Lambda.
- You've also seen the different event structures and key best practices for building resilient event-driven serverless applications.
Mastering these integrations is crucial for building scalable and robust serverless backends!
เรียนรู้ Serverless Backend with AWS Lambda & API Gateway ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 12
- บทเรียน
- 48
คำถามที่พบบ่อย
บทเรียน “ทริกเกอร์ Lambda ด้วย SQS/SNS” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ทริกเกอร์ Lambda ด้วย SQS/SNS” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Serverless Backend with AWS Lambda & API Gateway ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Serverless Backend with AWS Lambda & API Gateway มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ทริกเกอร์ Lambda ด้วย SQS/SNS”
กำหนดค่าฟังก์ชัน Lambda ให้ถูกเรียกใช้โดยคิว SQS และหัวข้อ SNS เพื่อเปิดใช้งานกระบวนการทำงานที่ขับเคลื่อนด้วยเหตุการณ์ คุณปฏิบัติ Serverless Backend with AWS Lambda & API Gateway ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Serverless Backend with AWS Lambda & API Gateway หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Serverless Backend with AWS Lambda & API Gateway บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ทริกเกอร์ Lambda ด้วย SQS/SNS” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Serverless Backend with AWS Lambda & API Gateway นี้ได้ไหม
ได้ บทเรียน Serverless Backend with AWS Lambda & API Gateway ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การใช้ SQS เพื่อแยกบริการออกจากกัน
- การรับส่งข้อความแบบเผยแพร่และสมัครรับข้อมูลด้วย SNS
- ทริกเกอร์ Lambda ด้วย SQS/SNS
- คิวจดหมายตายและการจัดการความล้มเหลว