我有一个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,
)
这似乎正确地创建了一个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)
}
]
)
其中input_string就像{" datasetName":" name"}。我可以在CloudWatch Rules UI中看到该规则,并且可以看到它链接到正确的lambda并且输入文本存在。它也每小时正确触发,但无法调用lambda函数。如果我在UI中查看lambda并在那里添加我在Designer部分中创建的CloudWatch事件规则,那么它正确地启动了lambda,但是有一些方法可以在Python中设置它,所以我没有&#39 ; t必须在UI中完成最后一步吗?
答案 0 :(得分:7)
对于可能在将来寻找答案的任何人 - 您需要为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']
)
答案 1 :(得分:1)
您可能需要添加
event_client.enable_rule(Name=rule_name)
put_rule之后
在这一点上,UI可能会添加一些额外的配置
event_client.put_rule(
Name=rule_name,
ScheduleExpression=schedule_expression)
在启用并运行之后尝试在此规则上使用“DescribeRule”,然后在python中复制任何缺少的字段(如RoleArn)
答案 2 :(得分:0)
@meowseph_furbalin提到的答案将起作用,但是此答案的问题是,对于每个规则,它将为lambda添加新的资源策略。 AWS将资源策略的最大大小限制为2KB左右,因此达到该限制后,将不会触发目标。 解决此问题的一种方法是将通配符匹配添加到lambda,以便它可以匹配单个资源策略中的每个规则。
aws lambda add-permission --function-name lambda_name\
--action 'lambda:InvokeFunction' --principal events.amazonaws.com \
--statement-id '1' \
--source-arn arn:aws:events:us-west-2:356280712205:rule/*
添加此命令后,您不需要动态地向lambda添加权限,并且lambda将接受具有单个资源策略的所有cloudwatch规则。