在Serverless函数中如何获取SQS URL?

17

我正在构建一个无服务器应用程序,其中在资源中定义了一个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个回答

29

这是一个很棒的问题!

我喜欢将队列URL设置为我的应用程序的环境变量!

所以,您将这个队列命名为TheQueue

只需将此片段添加到您的serverless.yml文件中:

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

Serverless将自动从您的CloudFormation中获取队列URL,并将其注入到您的ENV中。

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

const params = {
    MessageBody: 'message body here',
    QueueUrl: process.env.THE_QUEUE_URL,
    DelaySeconds: 5
};

1
太好了,这帮了我不少忙。之前用GetAtt、Url和QueueUrl尝试了好几次都失败了。为什么队列没有Url属性呢? - Tien Do

4
您可以使用 获取队列URL API,但我倾向于将其传递给我的函数。在 CloudFormation 中,QueueUrl 是 SQS 队列的 Ref 值,因此您可以很容易地在 CloudFormation 中找到它。 这个方便的备忘单 对于处理 CloudFormation 属性和引用非常有帮助。

谢谢,但我没有看到@Aaron Stuyvenberg上面回答的内容。 - Tien Do

1
我会走一条不同的路。个人而言,我不喜欢在使用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中,我编写了一个库,只需一行代码即可完成所有操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接