使用Python AWS CDK创建EventBridge触发的Lambda函数报错求助
AWS CDK EventBridge添加Lambda目标报错TypeError: target.bind is not a function的解决方案
问题背景
使用Python版AWS CDK创建EventBridge规则,监控CodeCommit仓库的分支创建/删除事件以触发Lambda函数时,执行代码抛出以下错误:
RuntimeError: TypeError: target.bind is not a function
错误原因
- 重复定义Lambda资源:代码中两次创建了同名的
my_lambda_function,属于冗余操作,还可能引发资源冲突 - 目标类型不匹配:调用
lambda_rule.add_target()时,传入的是_lambda.Function.from_function_arn()返回的IFunction接口实例,但EventBridge Rule的add_target方法要求传入实现IRuleTarget接口的对象。在同一个栈中直接引用已创建的Lambda实例即可,无需通过ARN重新导入。
修复步骤
- 移除重复的Lambda函数创建代码块
- 直接将已创建的
my_lambda_function实例作为目标传入add_target方法
修正后的完整代码
# 先加载Lambda配置文件 with open(template_dir+lambda_file_name, 'r') as f: function_config = yaml.safe_load(f) # 仅创建一次Lambda函数 my_lambda_function = _lambda.Function( self, 'LambdaFunction', code=_lambda.Code.from_inline(function_config['code']), handler=function_config['handler'], runtime=_lambda.Runtime.PYTHON_3_9, role=role, function_name='lambda-function-liberty-stack' ) print("Deploy Lambda Function") # 定义EventBridge规则 lambda_rule = events.Rule(self, "Create_Pipeline_Rule", description="Rule to run lambda function which builds code pipeline. This monitors code repos in project.", rule_name="event-rule-code-pipeline-lambda", event_pattern= events.EventPattern( source= ["aws.codecommit"], detail_type= ["CodeCommit Repository State Change"], detail= { "event": ["referenceDeleted", "referenceCreated"], "referenceType": ["branch"], } ) ) # 直接传入已创建的Lambda实例作为规则目标 lambda_rule.add_target(my_lambda_function)
跨栈Lambda引用补充说明
如果需要引用跨栈的Lambda函数(必须通过ARN导入),则需要使用events_targets.LambdaFunction包装IFunction实例,代码示例:
from aws_cdk import aws_events_targets as events_targets # 通过ARN导入跨栈Lambda函数 cross_stack_lambda = _lambda.Function.from_function_arn( self, 'CrossStackLambda', function_arn='arn:aws:lambda:region:account-id:function:function-name' ) # 用LambdaFunction包装后作为EventBridge规则目标 lambda_rule.add_target(events_targets.LambdaFunction(cross_stack_lambda))
内容的提问来源于stack exchange,提问作者Pablo CA
相关产品推荐
相关产品推荐

