为什么Lambda内部的异步ssm请求不起作用?

时间:2019-11-13 10:09:10

标签: javascript node.js aws-lambda

async function getP(){
        var params = {
            Name: 'MY-NAME',
            WithDecryption: true
        };

        var request = await ssm.getParameter(params).promise();

        return request.Parameter.Value;          
    }

    async function getParam(){
        var resp = await getP()

        console.log(resp)
    }

    getParam()

这是我的lambda函数内部的代码,目前无法正常工作,我不确定为什么。

当我将其更改为:

    const x = getParam()
    console.log(x) // it says that this is pending

但是我认为异步等待解决了,有什么想法吗?

编辑:

console.log('first') // never logged
const res = await ssm.getParameter(paramUsername).promise(); // paramUsername deffo exists in SSM
console.log(res, 'res') // never logged
console.log('second') // never logged

3 个答案:

答案 0 :(得分:0)

粗略的回答,您有两个选择,我需要其中的一个输出...

1)

function to(promise) {
    return promise.then((data) => {
        return [null, data]
    }).catch(err => [err])
}

// YOUR CODE AMENDED

console.log('first') // never logged
let [err, res] = await to(ssm.getParameter(paramUsername).promise()); 

if(err){
    console.log(err)
    return 
}

console.log(res, 'res') // never logged
console.log('second') // never logged

OR

2)将该呼叫包含在try catch中,如下所示:

try {

console.log('first') // never logged
const res = await ssm.getParameter(paramUsername).promise(); // paramUsername deffo exists in SSM
console.log(res, 'res') // never logged
console.log('second') // never logged
} catch(e){
  console.log(e)
}

让我知道错误是什么,我敢打赌您的lambda没有访问SSM的权限!将会更新!

答案 1 :(得分:0)

有同样的问题-我发现唯一有效的组合就是在等待后什么都不做,除了一旦解决就返回承诺即可。

因此,如果您将代码更改为:

async function getP(){
        var params = {
            Name: 'MY-NAME',
            WithDecryption: true
        };

        // Do not do anything after the await, only the return
        var request = await ssm.getParameter(params).promise();
        return request.Parameter;          
    }

    async function getParam(){
        // Do not do anything after the await, only the return
        var resp = await getP()
        return resp.Value;
    }

    const val = getParam();
    console.log(val);

它应该在lambda内部工作。这似乎很古怪-我发现从命令行或在调试器中运行我的原始代码版本,效果很好。只是在lambda容器内(在AWS或docker中),它没有解决,只是掉了下来-没有抛出任何错误。

有几个与此主题相关的主题(请参见下文),希望对您有所帮助。

答案 2 :(得分:0)

用作波纹管

def squareEach(nums):
   square = []
   for number in nums:
       number = number ** 2
       square.append(number)
   return square