AWS CDK中Function.from_function_arn授予DynamoDB权限失效问题
跨栈Lambda获取DynamoDB权限失败的解决方法
问题背景
我创建了以下Lambda和DynamoDB表:
my_lambda = lambda_.Function( self, "my_lambda", function_name="my_lambda", description="A Lambda to test permissions", code=lambda_code, memory_size=512, handler="my_lambda.main", runtime=lambda_.Runtime.PYTHON_3_9, architecture=lambda_.Architecture.ARM_64, timeout=Duration.minutes(1), ) table = dynamodb.Table( self, 'test_table', partition_key=dynamodb.Attribute( name="id", type=dynamodb.AttributeType.STRING, ), )
直接调用table.grant_full_access(my_lambda)可为Lambda授予DynamoDB全权限,功能正常。但通过ARN获取Lambda实例并授予权限时,Lambda完全没有DynamoDB访问权限:
lambda_by_arn = lambda_.Function.from_function_arn( self, "my lambda by arn", my_lambda.function_arn ) table.grant_full_access(lambda_by_arn)
当DynamoDB与Lambda不在同一栈时,只能通过function_from_arn或function_from_attributes方法获取Lambda引用,但均出现无权限的情况,该如何解决?
解决方法
1. 显式传递执行角色给Lambda引用
使用Function.from_function_attributes时,必须传入Lambda的执行角色ARN,因为通过ARN获取的Lambda实例默认没有绑定执行角色元数据,导致CDK无法将权限策略附加到正确的角色上:
lambda_by_attrs = lambda_.Function.from_function_attributes( self, "my_lambda_attrs", function_arn=my_lambda.function_arn, role=iam.Role.from_role_arn(self, "lambda_role", my_lambda.role.role_arn) ) table.grant_full_access(lambda_by_attrs)
2. 手动为执行角色附加权限策略
如果CDK的grant方法无法自动配置,可直接构造IAM策略并附加到Lambda的执行角色:
# 导入Lambda执行角色 lambda_role = iam.Role.from_role_arn(self, "ImportedLambdaRole", "<替换为Lambda执行角色ARN>") # 构造DynamoDB全权限语句 dynamo_full_access = iam.PolicyStatement( actions=["dynamodb:*"], resources=[table.table_arn] ) # 将策略添加到角色 lambda_role.add_to_policy(dynamo_full_access)
3. 跨栈引用传递执行角色(同CDK应用内)
若两个栈属于同一CDK应用,优先用跨栈引用传递执行角色ARN,避免仅传递Lambda ARN:
- Lambda所在栈:导出执行角色ARN
self.export_value(self.my_lambda.role.role_arn, name="LambdaExecutionRoleArn")
- DynamoDB所在栈:导入角色并授权
lambda_role_arn = Fn.import_value("LambdaExecutionRoleArn") lambda_role = iam.Role.from_role_arn(self, "LambdaRole", lambda_role_arn) table.grant_full_access(lambda_role)
内容的提问来源于stack exchange,提问作者Kawobi
相关产品推荐
相关产品推荐

