我们目前正在使用AWS构建应用程序,并且需要将msgs推送到SQS。我的问题是,是否有可能让SQS向SNS发布消息,该消息将触发Lambda(向SNS发送)?然后lambda需要向收到消息的SQS返回一个肯定,从而从SQS中删除该消息。
上面列出的情景是否可行?或者是从SQS获取消息,通过Lambda等轮询队列的唯一方法吗?
提前感谢您提供的任何帮助。
对滥用术语表示歉意,但我对AWS相对较新。
答案 0 :(得分:0)
SQS无法向SNS发布消息。 SQS只能存储消息。您必须使用SQS Api来提取消息。
希望这对你有所帮助!
答案 1 :(得分:0)
SQS不支持推送。但是,您可以设置一个lambda函数,该函数可以非常简单地定期从SQS轮询:https://cloudonaut.io/integrate-sqs-and-lambda-serverless-architecture-for-asynchronous-workloads/
答案 2 :(得分:0)
对于将来偶然发现此问题的任何人,在将SQS用作SNS-> Lambda服务的无效信之后,我必须编写此脚本。它不是最漂亮的代码,但可以。
下面是脚本,但您也可以在这里找到它:https://gist.github.com/joshghent/ca4a1272031e2a52af57d5e8ec5d53c5
sqs_to_sns.py
# Usage
# $ python sqs_to_sns.py my-queue-name
import boto3
import sys
import queue
import threading
from datetime import datetime
import json
from uuid import uuid4
work_queue = queue.Queue()
sqs = boto3.resource('sqs')
sns = boto3.client('sns')
sqs_client = boto3.client('sqs')
from_q_name = sys.argv[1]
print(("From: " + from_q_name + " To: SNS"))
from_q = sqs.get_queue_by_name(QueueName=from_q_name)
to_q = sqs.get_queue_by_name(QueueName='backup-queue')
skipped = 0
processed = 0
total = 0
def process_queue():
while True:
messages = work_queue.get()
global total
total = len(messages)
for message in messages:
message_content = json.loads(message.body)
message.delete()
print("Backing up Message to dead letter queue - just in case. Id: " +
message_content['MessageId'])
bodies = list()
bodies.append({'Id': str(uuid4()), 'MessageBody': message.body})
to_q.send_messages(Entries=bodies)
response = sns.publish(
TopicArn=message_content['TopicArn'], Message=message_content['Message'])
print(("Published Message to Topic " + str(message_content['MessageId']) +
". To TopicArn: " + message_content['TopicArn'] + ". Received response " + json.dumps(response)))
global processed
processed = processed + 1
for i in range(10):
t = threading.Thread(target=process_queue)
t.daemon = True
t.start()
while True:
messages = list()
for message in from_q.receive_messages(
MaxNumberOfMessages=10,
VisibilityTimeout=123,
WaitTimeSeconds=20):
messages.append(message)
work_queue.put(messages)
work_queue.join()
print("Processed " + str(processed) + " of " + str(total) +
". Skipped " + str(skipped) + " messages. Exiting")