You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法分配权限即可:

  1. 如果索引是在当前CDK栈中通过add_global_secondary_index方法创建的,直接保留创建时返回的索引对象
  2. 如果是引用已存在的索引,通过表的indexes属性按索引名获取:
    target_gsi = table.indexes["my-index"]
    
  3. 给对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:57:16