AWS CDK(Python)如何为Lambda添加DynamoDB GSI的Query权限
故障现象
通过AWS CDK部署的Python Lambda函数执行DynamoDB表Query操作时报权限错误,具体报错信息:
(AccessDeniedException) when calling the Query operation: User: arn:aws:sts::xxx is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:ap-southeast-2:xxx/index/my-index because no identity-based policy allows the dynamodb:Query action
当前权限配置
当前通过CDK内置方法给Lambda分配DynamoDB表和S3存储桶权限的代码如下:
# 为Lambda授予DynamoDB表和S3存储桶的读写权限 table.grant_read_write_data(lambda_function) table.grant_read_data(api_lambda_function) bucket.grant_read_write(lambda_function) bucket_storage.grant_read_write(lambda_function) bucket_storage.grant_read(api_lambda_function)
故障原因
table.grant_read_data、table.grant_read_write_data方法默认仅授予DynamoDB表本身的操作权限,不会自动覆盖表下挂载的全局二级索引(GSI)资源,因此查询索引时会触发权限拒绝。
修复方案
单个全局二级索引授权
先获取目标索引的CDK资源对象,再调用和表权限一致的grant方法分配权限即可:
- 如果索引是在当前CDK栈中通过
add_global_secondary_index方法创建的,直接保留创建时返回的索引对象 - 如果是引用已存在的索引,通过表的
indexes属性按索引名获取:target_gsi = table.indexes["my-index"] - 给对应Lambda分配索引权限:
# 给执行读写操作的Lambda分配索引读写权限 target_gsi.grant_read_write_data(lambda_function) # 给只读API的Lambda分配索引读权限 target_gsi.grant_read_data(api_lambda_function)
批量给所有全局二级索引授权
如果需要给表下所有GSI统一配置权限,直接遍历表的GSI列表批量授权即可:
# 遍历表下所有全局二级索引 for gsi_config in table.global_secondary_indexes: gsi = table.indexes[gsi_config.index_name] gsi.grant_read_write_data(lambda_function) gsi.grant_read_data(api_lambda_function)
注意事项
- 优先使用CDK原生的grant方法配置权限,不要手动拼接索引ARN编写自定义IAM策略,原生方法会自动处理资源路径、权限条件、依赖关系,避免配置冗余或资源漂移
- 权限配置修改后重新执行
cdk deploy部署生效即可,不需要手动在IAM控制台修改策略,避免后续CDK同步时覆盖手动配置
内容的提问来源于stack exchange,提问作者JamesMatson
相关产品推荐
相关产品推荐

