Cloudwatch事件不会触发我的lambda函数,即使它是一个目标

meo*_*lin 4 python amazon-web-services amazon-cloudwatch boto3 aws-lambda

我有一个lambda函数,它接受一个数据集名称,并专门为该数据集创建一个新的lambda.这是设置它的代码:

    lambda_response = lambda_client.create_function(
        FunctionName=job_name,
        Runtime='python3.6',
        Role=role_name,
        Handler='streaming_data_lambda.lambda_handler',
        Code={
            'S3Bucket': code_bucket,
            'S3Key': 'streaming_data_lambda.py.zip'
        },
        Timeout=30,
    )
Run Code Online (Sandbox Code Playgroud)

这似乎正确地创建了一个lambda,并且在我手动启动它时起作用.我想让这个创建的lambda每小时运行一次,因此原始的lambda脚本会创建以下规则和目标:

rule_response = event_client.put_rule(
    Name=rule_name,
    ScheduleExpression=schedule_expression
)

event_client.put_targets(
    Rule=rule_name,
    Targets=[
        {
            'Id': lambda_response['FunctionName'],
            'Arn': lambda_response['FunctionArn'],
            'Input': json.dumps(input_string)
        }
    ]
)
Run Code Online (Sandbox Code Playgroud)

其中input_string就像{"datasetName":"name"}.我可以在CloudWatch Rules UI中看到规则,并且可以看到它链接到正确的lambda并且输入文本存在.它也每小时正确触发,但无法调用lambda函数.如果我在UI中查看lambda并添加我在Designer部分创建的CloudWatch事件规则作为触发器,那么它正确地启动lambda,但是有一些方法可以在Python中设置它,所以我不这样做用户界面必须做最后一步吗?

meo*_*lin 8

对于可能在将来寻找答案的任何人 - 您需要为cloudwatch事件添加添加权限以调用您的lambda函数,如下所示:

    lambda_client.add_permission(
         FunctionName=lambda_response['FunctionName'],
         StatementId=some_random_number,
         Action='lambda:InvokeFunction',
         Principal='events.amazonaws.com',
         SourceArn=rule_response['RuleArn']
    )
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要拥有(大量)动态创建的规则,则这不是可行的解决方案,因为您将达到 lambda 策略限制 (20kb)。 (2认同)