我在通用 VPC 中运行的 lambda 函数有问题。lambda 函数基本上查询 dynamodb 表并发出请求以从冰川检索 s3 对象。当我不在lambda中指定VPC时,它运行良好,但是当我这样做时,它会给我错误:
"errorMessage": "User: arn:aws:sts::123456789012:assumed-role/NLM-INT-draps-lambda-role/retrieval-1 is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:123456789012:table/S3_log/index/ContentType-LastChecked-index"
角色权限如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:RestoreObject",
"s3:ListObjects",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::nlm-qa-int-draps-bucket",
"arn:aws:s3:::nlm-qa-int-draps-bucket/*"
],
"Effect": "Allow"
},
{
"Action": [
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:UpdateTable"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:123456789012:table/S3_log",
"arn:aws:dynamodb:us-east-1:123456789012:table/S3_log/index/item_status-index",
"arn:aws:dynamodb:us-east-1:123456789012:table/S3_log/index/ContentType-LastChecked-index"
],
"Effect": "Allow"
},
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:us-east-1:123456789012:function:nlm-int-draps-us-east-1-upload",
"arn:aws:lambda:us-east-1::function:retrieval-1",
"arn:aws:lambda:us-east-1:123456789012:function:final_lambda"
],
"Effect": "Allow"
}
]
}
并且该角色还具有信任关系策略,该策略将允许 Lambda 代表上述角色通过 CloudEvent 自动运行:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
我还应该注意,即使我授予 lambda 管理员访问角色权限,如果我在 VPC 内运行 lambda,它仍然会失败,因此我认为该问题可能与权限无关。
在另一个 lambda 函数中,该函数也在由 S3 PUT 触发以写入 dynamodb 的同一 VPC 中运行,我必须为 VPC 创建一个 dynamodb 终端节点才能访问 dynamodb,所以我认为这个问题可能与此相关。 任何帮助不胜感激,谢谢!
鉴于您的情况描述,VPC 终端节点配置似乎导致此 Lambda 函数出现一些问题。您需要诊断原因,或者只需删除 VPC 终端节点。
要授予对链接到 VPC 的 AWS Lambda 函数的互联网访问权限(例如访问 DynamoDB 终端节点(,您需要满足以下条件之一:
- 配置为使用私有子网的 AWS Lambda 函数,该私有子网具有指向公有子网中的NAT 网关的路由表条目,或者
- 分配给 VPC 中显示的 Lambda 函数的弹性网络接口 (ENI( 的弹性 IP 地址
这样就无需为 DynamoDB 配置 VPC 终端节点。