已配置全权限IAM角色仍无法调用DAX的BatchGetItem权限错误
解决DAX集群BatchGetItem权限报错问题
问题背景
部署DAX集群缓存DynamoDB查询后,除BatchGetItem操作外其余功能均正常运行,报错信息如下:
[ERROR] DaxServiceError: An error occurred (Unknown) when calling the BatchGetItem operation: Client does not have permission to invoke BatchGetItem
已为Lambda及DAX集群配置dynamodb:*、dax:*通配符权限,也曾尝试单独添加dax:BatchGetItem权限,均未解决问题。
DAX集群IAM角色定义:
DynamoDAXCacheClusterIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: - sts:AssumeRole Effect: Allow Principal: Service: - dax.amazonaws.com Version: '2012-10-17' RoleName: ${file(env.yml):${opt:stage}.DAX_CLUSTER_ROLE} Policies: - PolicyName: ${file(env.yml):${opt:stage}.DAX_POLICY_NAME}-dax PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Resource: '*' Action: - 'dax:*' - PolicyName: ${file(env.yml):${opt:stage}.DAX_POLICY_NAME}-dynamo PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Resource: '*' Action: - 'dynamodb:*' ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
Lambda权限策略:
- Effect: Allow Action: - dynamodb:DescribeTable - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem - dynamodb:BatchGetItem Resource: "arn:aws:dynamodb:us-east-1:*:*" - Effect: Allow Action: - sqs:SendMessage - sqs:PurgeQueue - sqs:ListQueues Resource: "arn:aws:sqs:us-east-1:*:*" - Effect: "Allow" Action: - "execute-api:Invoke" Resource: ["arn:aws:execute-api:*:*:**/@connections/*"] - Effect: "Allow" Resource: "arn:aws:sns:us-east-1:*:*" Action: - "sns:*" - Effect: Allow Resource: "arn:aws:dax:us-east-1:*:*/*" Action: - 'dax:*'
解决思路
- 验证DAX对BatchGetItem的支持:先确认DAX官方文档中的API支持列表,排除功能本身不支持的可能性。
- 细化IAM权限资源范围:将Lambda中DAX权限的资源从通配符
arn:aws:dax:us-east-1:*:*/*替换为具体的DAX集群ARN(格式为arn:aws:dax:us-east-1:ACCOUNT_ID:cache/CLUSTER_NAME),避免通配符格式不匹配导致的权限识别问题。 - 绕过DAX测试原生调用:用Lambda直接调用DynamoDB的
BatchGetItem接口,如果成功则问题出在DAX集群侧;如果同样报错,排查DynamoDB表的权限配置。 - 等待IAM权限生效:IAM权限变更后可能需要5-10分钟同步,等待足够时间后重新测试。
- 确认DAX角色的DynamoDB权限覆盖:DAX执行
BatchGetItem时会通过自身IAM角色调用DynamoDB,可尝试将该角色的dynamodb:*权限替换为具体表ARN,验证是否存在资源匹配问题。 - 检查请求参数格式:部分场景下服务会将参数错误(如表名拼写错误、主键格式不符)返回为权限错误,核对
BatchGetItem的请求参数是否符合DAX和DynamoDB的要求。 - 排查VPC安全组配置:确认Lambda所在安全组允许访问DAX集群的默认端口(8111),DAX集群安全组允许来自Lambda的入站流量。
内容的提问来源于stack exchange,提问作者bldcaveman
相关产品推荐
相关产品推荐

