我正在构建一个无服务器应用程序,该应用程序在资源中定义了一个SQS队列,如下所示:
tf.data.TextLineDataset.list_files(globpattern)
我想从一个功能中向该队列发送消息。如何从函数内部访问URL?我想把它放在这里:
resources:
Resources:
TheQueue:
Type: "AWS:SQS:Queue"
Properties:
QueueName: "TheQueue"
答案 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中,我编写了一个库,只需一行就可以完成所有这些工作。