【问题标题】:How to fix DynamoDB JS API blocking and timing out my Lambda function?如何修复 DynamoDB JS API 阻塞和超时我的 Lambda 函数?
【发布时间】:2019-06-09 23:52:46
【问题描述】:

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

我使用的是无服务器平台 Node 8.10,并且我设置了“iamRoleStatements”以允许 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]"

handler.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”后,该函数会挂起并最终超时。我在某种程度上做错了承诺吗?根据我所见,这似乎应该是正确的格式。

【问题讨论】:

  • 您是否尝试过诸如 describeTable() 之类的更简单快捷的方法来确保您实际上已连接到 DynamoDB?
  • @jarmod 我 describeTable() 这似乎也超时了。对于 describeTable(),我只使用了基础 AWS.DynamoDB 对象而不是文档客户端,对吧?
  • 我通过创建 documentclient 对象来编辑我的帖子。我需要做任何配置才能使其正常工作吗? Lambda 函数是从来自具有认知身份的 Web 客户端的经过身份验证的请求中调用的。
  • 您的 Lambda 是否在 VPC 中运行?
  • 任何像这样的连接超时通常是因为您的 Lambda 函数无法访问它尝试连接的网络资源,在这种情况下是 DynamoDB。这通常是由一件事引起的 - 您在 VPC 的私有子网中运行 Lambda 函数,并且该子网没有通过 VPC 端点到 Internet 或 DynamoDB 的可行路由。这可能是这里发生的事情吗?

标签: amazon-web-services aws-lambda amazon-dynamodb serverless-framework aws-serverless


【解决方案1】:

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

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

你有几个选择:

  1. give the Lambda function internet access 以便它可以通过公共互联网访问 DynamoDB
  2. VPC Endpoint for DynamoDB 添加到 VPC,以便它可以私下访问 DynamoDB

请注意,两者都通过 TLS,因此是安全的。决定是允许 Lambda 函数具有不受限制的出站 Internet 访问 (#1),还是将其限制为 DynamoDB (#2)。

【讨论】:

  • 我会尽快尝试并回复您。谢谢!
  • 我真的需要创建一个完整的 EC2 实例来让这两个服务相互通信吗?我对无服务器计算应该如何通过为我处理所有这些任务来帮助我感到有点沮丧,但它带来了所有这些对我来说都是新的挑战。
  • 更新:决定摆脱 VPC,而是尝试让 RDS 实例公开访问。只是让一切变得更容易。
  • @danielhep 将 RDBMS 暴露在公共互联网上并不是一个好主意。您应该能够让 Lambda 访问您的私有 RDS 实例和 DynamoDB 服务,而无需 NAT 网关或公共 Internet 访问。您是否对 DynamoDB 的 VPC 终端节点进行了尝试?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2019-07-10
  • 1970-01-01
相关资源
最近更新 更多