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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:01:13