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 .

Другие вопросы по тегам