【问题标题】:How to get AWS SQS queue ARN in nodeJS?如何在 nodeJS 中获取 AWS SQS 队列 ARN?
【发布时间】:2020-08-06 01:00:33
【问题描述】:

我正在尝试使用基本的客户端-服务器基础架构构建应用程序。服务器基础设施托管在 AWS 上,当客户端登录时,它会向服务器发送一条消息以设置各种基础设施注意事项。其中一个基础设施是一个 SQS 队列,客户端可以从中轮询以从服务器获取更新(最终我想构建一个推送服务,但我现在不知道如何做)。

我正在使用 Node AWS 开发工具包在 NodeJS 中构建此应用程序。我遇到的问题是我需要队列 ARN 来执行各种操作,例如将 SQS 队列订阅到应用程序使用的 SNS 主题,但创建队列 API 返回队列 URL,而不是 ARN。所以我可以使用 getQueueAttributes API 从 URL 获取 ARN,但它似乎不起作用。每当我调用它时,我都会得到未定义的响应。这是我的代码,请告诉我我做错了什么:

exports.handler = (event, context, callback) => {

    new aws.SQS({apiVersion: '2012-11-05'}).createQueue({
            QueueName: event.userId
        }).promise()
    )
    .then(data => { /* This has the Queue URL */
        new aws.SQS({apiVersion: '2012-11-05'}).getQueueAttributes({
            QueueUrl: data.QueueUrl,
            AttributeNames: ['QueueArn']
        }).promise()
    })
    .then(data => {
        console.log(JSON.stringify(data)); /* prints "undefined" */
    })
/* Some more code down here that's irrelevant */
}

谢谢!

【问题讨论】:

  • 你试过All而不是QueueArn,它返回了什么?
  • 我尝试了 'All'、['All']、['QueueArn'] 和 'QueueArn'。所有这些都返回未定义。
  • 您是否尝试在现有队列上调用 getQueueAttributes - 我的意思是如果 aws 正在异步创建队列,那么即使 createQueue 完成,您也可能无法取回它。
  • 是的,我尝试创建队列,然后从 AWS 控制台注释掉创建队列部分并在队列 URL 中硬编码。那也没用。顺便说一句,因为这可能是您的下一个问题,所以我确实尝试从控制台使用 AWS CLI,并且效果很好。
  • yes :) - 这个 lambda 的执行角色怎么样 - 这个 lambda 的角色允许访问 SQS 吗?

标签: node.js aws-sdk amazon-sqs aws-sdk-js aws-sdk-nodejs


【解决方案1】:
const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

exports.handler = async(event, context, callback) => {

    var params = {
        QueueUrl: 'my-queue-url',
        AttributeNames: ['QueueArn']
    };

    let fo = await sqs.getQueueAttributes(params).promise();
    console.log(fo);
};

打印出来了

{
    ResponseMetadata: { RequestId: '123456-1234-1234-1234-12345' },
    Attributes: {
        QueueArn: 'arn:aws:sqs:eu-west-1:12345:my-queue-name'
    }
}

【讨论】:

  • Lambda 控制台(部分输出):“errorMessage”:“SyntaxError: await is only valid in async function”,
  • 请检查 > exports.handler = async(event, context, callback) => {
  • 当我将 await 更改为 Promise.then() 时,它就起作用了。我今天在这方面花了太多时间,明天我会尝试对此进行扩展并回复您。您是否尝试以我尝试的方式链接承诺,通过创建队列然后尝试从中读取?明天我回到这个问题时,我会试试。
  • 没有尝试,只是尝试使用当前代码接收它。您可以在 lambda 中使用 async/await,这可以使您免于回调。 AFAIK 几乎所有 aws-sdk 库方法都支持 async/await。
  • 好的,如果我让我的函数异步,然后我将我的 Promise.then 链分成一堆等待调用,那么它就可以工作了。我会对为什么会这样的一些见解感兴趣(我是 NodeJS 的初学者,所以我不明白)。
【解决方案2】:

在 Ersoy 的帮助下,我意识到我正在使用块格式(带有 {})来编写我的 Promise,但我从未从这些块中返回任何内容。我原以为 Promise 块中的最后一个值是默认的返回值,但似乎并非如此。当我在 SQS API 命令之前添加return 时,它就起作用了(不使用 async/await)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2020-08-22
    • 2018-09-24
    • 2016-04-13
    • 2019-11-07
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多