我有这个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权限?
- 授权资源类型必须支持基于资源的策略(例如s3)。Bucket、sqs.Queue)和
ISomething
的角色引用必须传递给Something.fromSomethingAttributes
该表总结了在各种情况下发生的情况。你的箱子在右下角:
Method | grant有资源策略 | 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 |