如何通过AWS CDK为Lambda授予DynamoDB表的读写权限?
问题解决:AWS CDK中Lambda访问DynamoDB权限配置错误
错误原因
table.grantReadWriteData()方法的参数要求是IGrantable类型对象(即拥有IAM角色的资源,比如Lambda函数的执行角色),而非直接传入PolicyStatement对象。你提供的代码混淆了权限授予的正确方式,导致类型不匹配错误。
正确实现方式
方式一:使用CDK内置grant方法(推荐)
CDK提供了封装好的权限授予方法,会自动处理IAM角色的权限添加,无需手动创建PolicyStatement。只需将需要授权的Lambda函数传入grantReadWriteData即可:
// 创建DynamoDB表(保持原有配置) const table = new dynamodb.Table(scope, utils.prefixed('stable-diffusion'), { partitionKey: { name: 'ID', type: dynamodb.AttributeType.STRING }, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, tableName: utils.prefixed('stable-diffusion'), }); // 定义你的CRUD Lambda函数(示例配置) const crudLambda = new lambda.Function(scope, utils.prefixed('crud-handler'), { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), // 替换为你的Lambda代码路径 }); // 直接给Lambda授予表的读写权限 table.grantReadWriteData(crudLambda);
方式二:手动创建权限并附加到Lambda角色
如果需要更精细的权限控制(比如仅允许特定DynamoDB操作),可以手动创建PolicyStatement,再将其附加到Lambda的执行角色上:
// 创建DynamoDB表(同上) const table = new dynamodb.Table(scope, utils.prefixed('stable-diffusion'), { partitionKey: { name: 'ID', type: dynamodb.AttributeType.STRING }, billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, removalPolicy: cdk.RemovalPolicy.DESTROY, tableName: utils.prefixed('stable-diffusion'), }); // 定义Lambda函数 const crudLambda = new lambda.Function(scope, utils.prefixed('crud-handler'), { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), }); // 创建自定义权限语句 const dynamoDbPolicy = new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:DeleteItem'], resources: [table.tableArn], }); // 将权限附加到Lambda的执行角色 crudLambda.addToRolePolicy(dynamoDbPolicy);
两种方式对比
- 方式一:CDK自动生成符合最佳实践的权限,覆盖所有读写操作,代码简洁高效。
- 方式二:适合需要严格控制权限粒度的场景,仅开放必要的DynamoDB动作。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

