我正在使用 AWS Clouwatch 事件规则调用基于 Cron Schedule 的 python lambda 函数,该函数运行良好。现在我可以使用 AWS Cloudformation 从 cloudwatch 甚至规则将参数传递到此 lambda 函数吗?可以请您指导一下吗? 请参阅下面我的 cfn 模板:
Step1 : parameter.Schedule=cron(0 21 ? * * *)
Step 2: "Schedule": {
"Description": "Schedule for the Lambda function (cron or rate)",
"Type": "String"
},
Step 3: "funcInvokeRule": {
"Type": "AWS::Events::Rule",
"Properties": {
"ScheduleExpression": {"Ref": "Schedule"},
"Targets": [{
"Id": "funcScheduler",
"Arn": {"Fn::GetAtt": ["Function","Arn"]}
}]
}
},
Target
的AWS::Events::Rule
属性类型有Input参数:
传递到目标的有效 JSON 文本。如果使用此属性,则事件文本本身中的任何内容都不会传递到目标。
还有 InputTransformer 您可以使用它来转换现有输入,例如向其添加额外的值。
使您能够根据某些事件数据向目标提供自定义输入的设置。您可以从事件中提取一个或多个键值对,然后使用该数据将自定义输入发送到目标。
遵循 AWS 文档,您的 cloudformation 资源可以简单如下:
Resources:
EventRule:
Type: AWS::Events::Rule
Properties:
Name: {EVENTNAME}
Description: "ScheduledRule"
ScheduleExpression: cron(0 21 ? * * *)
State: "ENABLED"
RoleArn: {ROLE}
将 Name 和 RoleArn 替换为您自己的值。
注意:名称不是必需参数,但有助于识别您的资源。但是,根据文档,如果您替换 cloudformation 模板中的资源,则需要指定一个新名称。
如果您随后也打算使用 severless 对您的 lambda 使用 cloudformation,那么我个人会通过权限将规则附加到 lambda,这样您就可以在规则上附加最多 5 个触发器,而无需每次都修改规则目标。例如
Lambda:
Type: AWS::Serverless::Function
Properties:
FunctionName:{LAMBDANAME}
Description: {Description}
Role: {Role}
Handler: {FileName}.lambda_handler
Runtime: {x}
CodeUri: {ObjectPath}
MemorySize: {x}
Timeout: {x}
Lambdatrigger:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref Lambda
Action: lambda:InvokeFunction
Principal: events.amazonaws.com
SourceArn: !Ref EventRule
正如@Marcin 指出的,
Input
属性的 Targets
参数就是你想要的。请记住,格式是 JSON text,因此请确保您转义特殊字符。以下是使用您的 CloudFormation 资源的示例:
"funcInvokeRule": {
"Type": "AWS::Events::Rule",
"Properties": {
"ScheduleExpression": {"Ref": "Schedule"},
"Targets": [{
"Id": "funcScheduler",
"Arn": {"Fn::GetAtt": ["Function","Arn"]},
"Input": "{\"foo\":\"val\",\"bar\":{\"baz\":\"nested_val\"}}"
}]
}
}