【发布时间】: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