AWS SQS SendMessage не работает с serverless-offline-sqs
Я работаю с бессерверным режимом, портируя две функции: одна (назовите ее генератором), которая в настоящее время является длительным процессом узла, а другая (назовите это проверкой), запускаемая cron, так что они обе будут лямбдами, проверка запускается расписание и генератор, получив уведомление SQS. Я также большой поклонник возможности заниматься локальным разработчиком, поэтому добавил serverless-offline и serverless-offline-sqs (при поддержке ElasticMQ).
Генератор перенесен, он развертывается и отлично работает локально. Вот функция, определенная в serverless.yml:
reportGenerator:
handler: src/reportGenerator.handleReportRequest
events:
- sqs:
arn:
Fn::GetAtt:
- ReportRequestQueue
- Arn
Я могу использовать интерфейс командной строки AWS для запуска сообщений через ElasticMQ (учетная запись aws # обфусцирована):
$ aws sqs send-message --queue-url https://sqs.us-west-1.amazonaws.com/000000000000/local-report-request --message-body file://./test/reportGenerator/simple_payload.json --endpoint-url http://localhost:9324
{
"MD5OfMessageBody": "267bd9129a76e3f48c26903664824c13",
"MessageId": "12034cd8-3783-403a-92eb-a5935c8759ae"
}
$
И сообщение получено нормально, срабатывает генератор лямбда:
{
"requestId": "ckokpja2e0001nbyocufzdrxk",
"function": "src/reportGenerator.js::exports:14",
"level": "info",
"message": "Found 0 waiting report request(s)"
}
offline: (λ: reportGenerator) RequestId: ckokpja2e0001nbyocufzdrxk Duration: 214.53 ms Billed Duration: 215 ms
Теперь я хочу сделать эту SQS-отправку программно для второй функции, что в значительной степени является единственным реальным изменением этой существующей (не лямбда-функции). Он также отлично разворачивается / запускается, но функция библиотеки aws-sdk для отправки того же сообщения не работает.
Вот определение функции в serverless.yml. Обратите внимание, что я закомментировал обычное расписание cron, поскольку оно не поддерживается serverless-offline, и просто использовал 10-минутную скорость для тестирования:
reportChecker:
handler: src/reportScheduler.check
environment:
REPORT_REQUEST_QUEUE_URL: "https://sqs.us-west-1.amazonaws.com/${self:custom.awsAccountId}/${opt:stage, self:custom.defaultStage}-report-request"
events:
# note that cron does not work for offline. Comment these out, and uncomment the rate to test locally
# - schedule:
# rate: cron(0 11 ? * 3 *)
# input:
# reportType: weekly
# - schedule:
# rate: cron(0 11 2 * ? *)
# input:
# reportType: monthly
- schedule:
rate: rate(10 minutes)
input:
reportType: weekly
Вот что я добавил к остальной функции в качестве версии узла указанной выше командной строки:
const AWS = require('aws-sdk');
AWS.config.update({region: process.env.AWS_REGION});
...
try {
const sqs = new AWS.SQS({endpoint: 'http://localhost:9324'});
logger.debug('SQS info', {queueUrl: process.env.REPORT_REQUEST_QUEUE_URL, endpoint: sqs.endpoint});
await sqs.sendMessage({
QueueUrl: process.env.REPORT_REQUEST_QUEUE_URL,
MessageBody: `{"reportType":${checkType}}`
})
.promise();
}
catch(err) {
logger.error('SQS failed to send', {error: err});
}
Результатом этих операторов регистратора является
{
"requestId": "ckokpulxw0002nbyo19sj87g2",
"function": "src/reportScheduler.js::exports:100",
"data": {
"queueUrl": "https://sqs.us-west-1.amazonaws.com/000000000000/local-report-request",
"endpoint": {
"protocol": "http:",
"host": "localhost:9324",
"port": 9324,
"hostname": "localhost",
"pathname": "/",
"path": "/",
"href": "http://localhost:9324/"
}
},
"level": "debug",
"message": "SQS info"
}
{
"requestId": "ckokpulxw0002nbyo19sj87g2",
"function": "src/reportScheduler.js::exports:109",
"data": {
"error": {
"message": "The specified queue does not exist for this wsdl version.",
"code": "AWS.SimpleQueueService.NonExistentQueue",
"time": "2021-05-12T00:20:00.497Z",
"requestId": "e55124c3-248e-5afd-acce-7dd605fe1fe5",
"statusCode": 400,
"retryable": false,
"retryDelay": 95.52839314049268
}
},
"level": "error",
"message": "SQS failed to send"
}
offline: (λ: reportChecker) RequestId: ckokpulxw0002nbyo19sj87g2 Duration: 477.95 ms Billed Duration: 478 ms
Мне кажется, что в коде используются все те же значения, что и в командной строке, но это просто не работает. Надеюсь, кто-то другой увидит здесь что-то очевидное.
Спасибо.
1 ответ
Разве переменная env REPORT_REQUEST_QUEUE_URL не должна локально указывать на ElasticMQ? Например , http://0.0.0.0:9324/queue/local-report-request .