我正在尝试从 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 数据库,否则无法通过公共互联网访问该数据库。
您有以下几种选择:
- 为 Lambda 函数提供互联网访问权限,以便它可以通过公共互联网访问 DynamoDB
- 将 DynamoDB 的 VPC 终端节点添加到 VPC,以便它可以私下访问 DynamoDB
请注意,两者都通过 TLS 进行,因此是安全的。决定是允许 Lambda 函数具有不受限制的出站互联网访问 ,还是将其限制为 DynamoDB 。