【问题标题】:AWS Lambda Function Appears to HangAWS Lambda 函数似乎挂起
【发布时间】:2021-06-02 08:05:59
【问题描述】:

这很可能是我的误解,但它就是这样。我有一个 lambda 函数。它目前唯一要做的就是从秘密管理器那里检索一个秘密。如果我在调试器(在本例中为 cloud9)中的异步函数中运行它,它可以工作。一旦我将它放入处理程序并将函数上传到 lambda 然后对其进行测试,它就会超时。目前该功能的超时设置为 1 分 30 秒。这应该远远超过它所需要的,因为它在 Cloud9 中几乎立即返回。我在 CloudWatch 中看不到任何有用的东西。我觉得要么我的方法不正确,要么我遗漏了一些明显的东西,或者只是误解了一些基本的东西。

示例函数

    async function GetSecrets(secretName) {
    // Load the AWS SDK
    var AWS = require('aws-sdk'),
        region = "Region Secret is in",
        secretName = secretName,
        secret,
        decodedBinarySecret;

    // Create a Secrets Manager client
    var client = new AWS.SecretsManager({
        region: region
    });

    return new Promise((resolve,reject)=>{
        client.getSecretValue({SecretId: secretName}, function(err, data) {
            // In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
            // See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
            // We rethrow the exception by default.
            if (err) {
                reject(err);
            }
            else {
                // Decrypts secret using the associated KMS CMK.
                // Depending on whether the secret is a string or binary, one of these fields will be populated.
                if ('SecretString' in data) {
                    console.log("I got here and here is the data: " + data)
                    resolve(data.SecretString);
                } else {
                    let buff = new Buffer(data.SecretBinary, 'base64');
                    resolve(buff.toString('ascii'));
                }
            }
        });
    });
}
// This Works in Cloud9 
/*(async myFunc =>{
     var value = await GetSecrets('SecretName')
     console.log(value)
})();
*/

// inside handler - this times out in lambda
exports.handler =  async function(event, context) {
    var value = await GetSecrets('SecretName')
    const response = {
    statusCode: 200,
    body: JSON.stringify({ message: 'hello world' })
  }
  return response
}

【问题讨论】:

  • 您找到解决方案了吗?我也有同样的问题。如果没有挂起,我无法通过 sdk 调用任何其他 AWS 服务。我已经让我的 Lambda 完全访问它需要的一切。我什至用等效的 SDK 调用和相同的执行角色测试了一个 python 脚本,它可以工作!我已经在 .net core 3 和 2 上进行了测试,两者都挂起。

标签: node.js aws-lambda aws-secrets-manager aws-cloud9


【解决方案1】:

你没有调用回调函数。 试试

    exports.handler = (event, context, callback) =>{
    var value = await GetSecrets('SecretName')
    const response = {
    statusCode: 200,
    body: JSON.stringify({ message: 'hello world' })
    }
    callback(null, 'success');
    }

回调函数用于返回成功或失败。需要传递此参数才能完成 lambda 函数。 如果您想返回对 lambda 的响应,请使用 response 而不是 'success'

【讨论】:

  • 这不是真的。您不需要需要调用回调函数来从异步处理程序函数返回(OP 使用async function 作为处理程序)。你可以从一个异步处理函数中return,这将是一个承诺,Lambda JavaScript 运行时将等待它解决。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 2016-05-15
  • 1970-01-01
  • 2015-06-19
  • 2012-08-08
  • 1970-01-01
  • 2018-06-22
  • 2013-03-11
相关资源
最近更新 更多