如何修复 DynamoDB JS API 阻塞和超时我的 Lambda 函数



我正在尝试从 Lambda 函数访问 AWS DynamoDB。当我使用 promise 调用文档客户端的扫描函数时,即使我将函数的超时延长到整分钟,它也永远不会返回。

我使用的是无服务器平台 Node 8.10,并且我已经设置了"iamRoleStatement"以允许 dynamodb 和表的 ARN。

serverless.yml:

provider:
  name: aws
  runtime: nodejs8.10
  timeout: 6
  region: us-east-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:*
      Resource: "[arn from dynamodb]"

处理程序.js:

const dynamodb = new AWS.DynamoDB.DocumentClient()
...
...
...
    try {
      console.log('dynamodb go')
      attributes = await dynamodb.scan(queryParams).promise()
      console.log('dynamodb success')
      console.log(attributes)
    } catch (err) {
      console.log('dynamodb error')
    }

我希望在控制台中得到"dynamodb go",然后是"dynamodb success"甚至"dynamodb error"。但是,在打印"dynamodb go"后,函数挂起并最终超时。我是否以某种方式做错了承诺?根据我所看到的,这似乎是正确的格式。

听起来您的 Lambda 函数无法连接到 DynamoDB。这通常是由一件事引起的 - 您在 VPC 中运行 Lambda 函数,并且 Lambda 函数没有到 DynamoDB 的可行路由(通过公共互联网或通过私有 VPC 终端节点到 DynamoDB)。

据推测,您正在 VPC 内运行 Lambda 函数,以便它可以访问您的私有 RDS 数据库,否则无法通过公共互联网访问该数据库。

您有以下几种选择:

  1. 为 Lambda 函数提供互联网访问权限,以便它可以通过公共互联网访问 DynamoDB
  2. 将 DynamoDB 的 VPC 终端节点添加到 VPC,以便它可以私下访问 DynamoDB

请注意,两者都通过 TLS 进行,因此是安全的。决定是允许 Lambda 函数具有不受限制的出站互联网访问 ,还是将其限制为 DynamoDB 。

相关内容

  • 没有找到相关文章

最新更新