AWS CDK Lambda function_from_arn未按预期工作



我有这个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,
),
)

现在,如果我想让Lambda访问DynameDB表,我就这样做。

table.grant_full_access(my_lambda)

这工作完美。现在,如果我想给这个相同的Lambda访问表,获取它的引用,它不工作。

lambda_by_arn = lambda_.Function.from_function_arn(
self,
"my lambda by arn",
my_lambda.function_arn
)
table.grant_full_access(lambda_by_arn)

上面的操作不起作用,Lambda无法访问DynamoDB函数。

如果您在与Lambda不同的堆栈中创建DynamoDB,则除了使用function_from_arn方法之外,您不能使用任何其他方法(至少,据我所知)。

我尝试从不同的方法获得Lambda:function_from_attributes,但这导致了同样的方式:无法访问。

from_function_arn所做的是导入一个现有的Lambda函数,以便您可以从CDK应用程序引用它。但是它实际上并不是应用程序的一部分,所以你不能用它做很多事情。特别是,您不能授予对它的任何访问权限。

如果您在与Lambda不同的堆栈中创建DynamoDB,则除了function_from_arn方法之外,您不能使用任何其他方法(至少,据我所知)。

如果两个堆栈都在同一个应用程序中,你可以将Lambda函数引用传递给另一个堆栈,CDK将知道如何处理它。

TL;像grant_full_access这样的授予方法有时会处理从Something.fromSomethingAttributes方法返回的外部引用资源。不幸的是,对于DynamoDB表资源,*不是*。

当您synth应用程序时,您应该看到CDK CLI产生的警告:

[Warning at /my_stack/my_lambda_by_arn] Add statement to this resource's role: ...

这是在告诉你CDK没有授予访问权限——你自己去做吧!CDK设计决定发出警告,但不抛出错误1

在什么条件下外部引用ISomething构造可以成功地授予IAM权限?

  1. 授权资源类型必须支持基于资源的策略(例如s3)。Bucket、sqs.Queue)和
  2. ISomething的角色引用必须传递给Something.fromSomethingAttributes

该表总结了在各种情况下发生的情况。你的箱子在右下角:

Methodgrant有资源策略grant没有资源策略
fromSomethingAttributes+role: IRole✅角色ARN添加到资源策略❌UnknownPrincipal assigned, CLI Warning
fromSomethingAttributes, norole❌Synth error:resource imported without a role❌UnknownPrincipal assigned, CLI Warning
fromSomethingArn❌合成错误:resource imported without a role❌UnknownPrincipal assigned, CLI Warning

相关内容

  • 没有找到相关文章

最新更新