#amazon-web-services #aws-lambda #amazon-sqs
#amazon-веб-сервисы #aws-lambda #amazon-sqs
Вопрос:
Я создал очередь SQS, и теперь я хочу прочитать данные из моей функции lambada.Я настроил триггер из SQS для этой функции lambada.
Когда я помещаю сообщение в очередь SQS, оно показывает мне, что 1 сообщение находится в процессе выполнения.Но когда я нажимаю test в функции lambda, это выдает мне
Ошибка
{
"errorMessage": "module initialization error"
}
Я использую приведенный ниже boto3
import boto3
sqs = boto3.client('sqs')
queue_url = 'https://sqs.us-east-1.amazonaws.com/944198216610/My-Queue'
response = sqs.receive_message(
QueueUrl='https://sqs.us-east-1.amazonaws.com/944198216610/My-Queue',
AttributeNames=[
'SentTimestamp'],
MaxNumberOfMessages=1,
MessageAttributeNames=[
'All'
],
VisibilityTimeout=0,
WaitTimeSeconds=0
)
message = response['Messages'][0]
receipt_handle = message['ReceiptHandle']
# Delete received message from queue
sqs.delete_message(
QueueUrl='https://sqs.us-east-1.amazonaws.com/944198216610/My-Queue',
ReceiptHandle=receipt_handle
)
print('Received and deleted message: %s' % message)
Комментарии:
1. Если вы нажмете «проверить» в консоли, то вы ничего не получите из очереди, а вместо этого отправите ей тестовое событие. Видите ли вы какую-либо ошибку в журналах CloudWatch для lambda из события SQS (не тестового события)? Кроме того, вам следует отредактировать такую информацию, как номер вашей учетной записи.
2. У вас должна быть дополнительная информация в разделе «Вывод журнала»
3. Привет, я интегрировал свой SQS с lambada. Итак, когда я отправляю сообщение в SQS, я получаю эту ошибку. ошибка инициализации модуля: «Сообщения»
Ответ №1:
Ваш код вызывает sqs.receive_message, однако для правильной интеграции Lambda с SQS вы можете использовать триггеры событий Lambda. Таким образом, всякий раз, когда событие попадает в очередь, SQS автоматически вызовет вашу лямбда-функцию с этим событием (или несколькими событиями в зависимости от указанного размера пакета).
Смотрите здесь, как настроить триггер события SQS Lambda
Также смотрите Здесь, как настроить обработчик лямбда-кода в python, где параметром события будет событие, с помощью которого SQS запускает ваш лямбда-код (распечатайте его и посмотрите формат события, чтобы вы могли получить представление о том, как использовать данные события).
Таким образом, когда вы отправляете сообщение в SQS, SQS запускает вашу лямбда-функцию, и если ваш лямбда-код возвращается успешно, SQS удаляет сообщение из очереди. Вам не нужно выполнять receive_message или delete_message вручную.
Комментарии:
1. Привет, Дейв, спасибо за твой ответ. Я понял вашу точку зрения использовать метод lambada_handler и затем получать данные в событии. Но просто интересно, что не так с приведенным выше кодом, он также должен работать правильно? Буду признателен, если вы сможете помочь мне разобраться.
2. Всегда пожалуйста. Ваша основная логика действительно выглядит нормально, однако Lambda ищет модуль-обработчик всякий раз, когда он запускается, который включает в себя тестовые триггеры через консоль, и, скорее всего, именно поэтому вы получили «ошибку инициализации модуля». Итак, теоретически, если вы поместите этот код внутрь lambda_handler, как описано в документах, он должен работать, однако лучше всего использовать встроенные триггеры, как упоминалось ранее, и позволить aws управлять очередью, что доставит вам меньше хлопот. Удачи!