【问题标题】:Why is my async ssm request inside lambda not working?为什么我在 lambda 中的异步 ssm 请求不起作用?
【发布时间】:2020-03-09 02:35:27
【问题描述】:
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

【问题讨论】:

  • 您需要await getParam()。方法是async,所以如果你不等待就直接调用它,你会得到一个承诺。要么await它,要么使用通常的promise方法解决它。
  • 这也没有用。我认为ssm.getParamater 坏了:/
  • 这不是因为我一直在使用它。你只需要正确地等待它。
  • 例如,如果 lambda 处理程序是 async handler() { const res = await ssm.getParameter(...).promise(); console.log(res); },那应该会得到你的结果,显然 ... 替换为 ssm 参数等。
  • @404 很明显这里有些东西坏了。我的 lambda 是异步的,我已将其放入:请检查已编辑的问题 lambda 超时,即使设置为 90 秒

标签: javascript node.js aws-lambda


【解决方案1】:

粗略的回答,你有两个选择,我需要任何一个的输出......

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

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 的权限!会更新!

【讨论】:

    【解决方案2】:

    如下使用:

    import AWS from "aws-sdk";
    
    const ssm = new AWS.SSM()
    
    const params = (name) => {
        return {
            Name: name,
            WithDecryption: true,
        };
    };
    
    export const getParameter = async (key) => (await ssm.getParameter(params(key)).promise()).Parameter.Value;
    

    【讨论】:

      【解决方案3】:

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

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

      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 中)内,它没有解析并简单地退出 - 没有抛出要捕获的错误。

      有几个线程与这个主题相关(见下文),所以我希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,解决方法是在 lambda 安全组中设置一个 egress outbound。

        【讨论】:

        • 这是一个我也有这个问题的评论,不是答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2019-10-26
        相关资源
        最近更新 更多