[英]AWS CDK - Create role conditionally in Lambda Function
我正在尝试使用 AWS CDK 在 Python 中创建一个 Lambda function。 挑战在于,这个 function 的角色属性来自输入参数。 如果输入参数值为 ARN,则应在创建 lambda 时使用它。如果输入参数值为空字符串,则显式创建新角色并分配权限。 我能够通过分配一个虚拟角色 arn 然后再次分配它来让它工作。
myLambdaFunction = _lambda.CfnFunction(self,
id = "myFunction",
function_name = "myLambdaFunction",
description = My Lambda Function",
memory_size = 1024,
timeout = 30,
vpc_config=_lambda.CfnFunction.VpcConfigProperty(
security_group_ids=["sg-00000000000000000"],
subnet_ids=["subnet-00000000"]
),
runtime = "PYTHON_3_9",
handler = "lambda-handler.main",
code=_lambda.S3Code(
bucket=my_lambda_code_bucket,
key=inputParams.myLambdaFunctionPackage
),
role = "arn:aws:iam::111111111111:role/Lambda-Role-DUMMY"
)
myLambdaFunction.node.default_child.add_property_deletion_override("Role")
myLambdaFunction.node.default_child.add_property_override(
"Role",
cdk.Fn.condition_if(
"createrolecondition",
my_lambda_role.role_arn,
RoleARNFromInputParameter
)
)
这很好用。
但是,当我将事件源添加到此 lambda function 时,问题就开始了。它会自动尝试使用虚拟角色 11111 创建策略。
myLambdaFunction.add_event_source(
_lambda_event_source.SqsEventSource(
my_queue,
batch_size=10
)
)
如果我在添加事件源后运行 cdk synth,它会自动添加一个新的 SQS 策略并允许 SQS 访问这个 lambda 并且它有这个甚至不存在的虚拟 Arn。
请建议在创建 lambda 时设置角色时是否有更好的使用条件的方法。
使用 CloudFormation 参数(部署时解析)的要求给 CDK 带来了复杂性,CDK 针对合成时解析进行了优化。 要支持参数条件性,您必须重复 OP 中的转义影线属性覆盖模式,以在参数值出现的任何地方注入CfnCondition 。
一种这样的情况是当您将 SQS 事件源添加到Function
目标时。 CDK 使用this.queue.grantConsumeMessages(target);
( github 来源),您注意到这是有问题的。 因此,您需要将另一个CfnCondition
注入到生成的策略资源中。 您也可以手动连接事件目标并从头开始创建您自己的权限,但这似乎并不容易。
有没有更好的办法? 避免参数:
一般而言,我们建议不要将 AWS CloudFormation 参数与 AWS CDK 一起使用。 与上下文值或环境变量不同,这是将值传递到您的 AWS CDK 应用程序而无需对其进行硬编码的常用方法,参数值在合成时不可用,因此无法轻松地用于您的 AWS CDK 应用程序的其他部分,特别是对于控制流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.