从无服务器功能中获取SQS URL?

时间:2020-02-25 03:45:15

标签: amazon-sqs serverless-framework serverless

我正在构建一个无服务器应用程序,该应用程序在资源中定义了一个SQS队列,如下所示:

tf.data.TextLineDataset.list_files(globpattern)

我想从一个功能中向该队列发送消息。如何从函数内部访问URL?我想把它放在这里:

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

3 个答案:

答案 0 :(得分:5)

这是一个很好的问题!

我想将队列URL设置为我的应用程序的ENV变量!

因此,您已将队列命名为from kafka import KafkaProducer class KafkaOpcUaSubHandler(object): def __init__(self): self.msg={} def connect_kafka(self, server, port): kafka_producer = KafkaProducer( bootstrap_server ='{}:{}'.format(server, port), retries=0, batch_size=0, compression_type=None ) def kafka_message_producer(self, kafka_topic, msg): kafka_producer = self.connect_kafka(kafka_server, kafka_port) your_kafka_message = kafka_producer .send(kafka_topic, json.dumps(msg, default=str) .encode('utf-8')) kafka_producer.flush() def datachange_notification(self, node, val, data): self.your_function(node, val, self.msg, data) def your_function(self, node, val, msg, data): payload = [] payload = [val, str(data.monitored_item.Value.SourceTimestamp)] self.kafka_message_producer(kafka_topic, payload)

只需将此代码段添加到您的TheQueue文件中即可:

serverless.yml

无服务器会自动从您的CloudFormation中获取队列URL,并将其注入到您的ENV中。

然后您可以通过以下方式访问该参数:

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

答案 1 :(得分:2)

您可以使用Get Queue URL API,尽管我也倾向于将其传递给函数。 QueueUrl是CloudFormation中SQS队列的Ref值,因此您可以在CloudFormation中轻松获得它。 This handy cheat sheet对于使用CloudFormation属性和引用确实很有帮助。

答案 2 :(得分:0)

我走了一条不同的路。我个人不喜欢使用lambda时将信息存储在环境变量中,尽管我真的很喜欢Aaron Stuyvenberg解决方案。因此,我将这样的信息存储为AWS SSM参数存储。

然后在我的代码中,仅在需要时调用它。原谅我的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中,我编写了一个库,只需一行就可以完成所有这些工作。