Получить URL SQS из функции без сервера? - PullRequest
2 голосов
/ 25 февраля 2020

Я создаю приложение без сервера, которое определяет очередь SQS в ресурсах следующим образом:

resources:
  Resources:
    TheQueue:
      Type: "AWS:SQS:Queue"
      Properties:
        QueueName: "TheQueue"

Я хочу отправлять сообщения в эту очередь из одной из функций. Как я могу получить доступ к URL из функции? Я хочу разместить его здесь:

const params = {
    MessageBody: 'message body here',
    QueueUrl: 'WHATS_THE_URL_HERE',
    DelaySeconds: 5
};

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Это отличный вопрос!

Мне нравится устанавливать URL-адрес очереди в качестве переменной ENV для моего приложения!

Итак, вы назвали очередь TheQueue.

Просто добавьте этот фрагмент в файл serverless.yml:

provider:
  name: aws
  runtime: <YOUR RUNTIME>
  environment:
    THE_QUEUE_URL: { Ref: TheQueue }

Безсерверный сервер автоматически извлечет URL-адрес очереди из вашего CloudFormation и вставит его в ENV.

Затем вы сможете получить доступ параметр как:

const params = {
    MessageBody: 'message body here',
    QueueUrl: process.env.THE_QUEUE_URL,
    DelaySeconds: 5
};
1 голос
/ 25 февраля 2020

Вы можете использовать API-интерфейс Get Queue URL , хотя я, как правило, также передаю его своей функции. QueueUrl - это значение Ref для очереди SQS в CloudFormation, так что вы можете легко получить ее в своей CloudFormation. Этот удобный шпаргалка действительно полезен для работы с атрибутами и ссылками CloudFormation.

0 голосов
/ 27 февраля 2020

I go немного другой маршрут. Лично мне не нравится хранить информацию в переменных окружения при использовании лямбды, хотя мне очень нравится решение Аарона Стайвенберга. Поэтому я храню информацию примерно так: AWS SSM Parameter store.

Затем в своем коде я просто призываю ее при необходимости. Прости мои JS прошло много времени с тех пор, как я это сделал. В основном я делаю python

var ssm = new AWS.SSM();
const myHandler = (event, context) => {
    var { Value } = await ssm.getParameter({Name: 'some.name.of.parameter'}).promise()

    const params = {
        MessageBody: 'message body here',
        QueueUrl: Value,
        DelaySeconds: 5
    };
}

Возможно, произошла некоторая деконструкция структуры возвращаемых данных, я ошибся, но это примерно то, что я делаю. В python я написал библиотеку, которая делает все это одной строкой.

...