我在编写cloudwatch事件触发器的cloudformation脚本时遇到了一些麻烦,我开始通过控制台完成它,但我的要求是我需要在cloudformation中配置所有内容。我按照文档进行操作,它仍然无法为我工作,我不断收到错误:
模板包含错误:无效的模板属性或属性 [rPermissionForEventsToInvokeLambda,rLambdaScheduledRule]
有人可以指出我的cloudformation脚本的这部分有什么问题吗?我几乎跟着文件跟着文件仍然有错误,当我试图验证它时,即使文档中的示例也有相同的错误。我的cloudformation代码如下,任何帮助表示赞赏!
rLambdaScheduledRule:
Type: AWS::Events::Rule
Properties:
ScheduleExpression: rate(1 hour)
State: ENABLED
Targets:
Ref:
Fn::ImportValue:
Fn::Sub: rUploadLambda
Action: lambda:InvokeFunction
rPermissionForEventsToInvokeLambda:
Type: AWS::Lambda::Permission
Properties:
FunctionName:
Ref:
Fn::ImportValue:
Fn::Sub: rUploadLambda
Action: lambda:InvokeFunction
Principal: events.amazonaws.com
SourceArn:
Fn::GetAtt:
- rLambdaScheduledRule
- Arn
答案 0 :(得分:1)
1)您必须在创建lambda函数的CloudFormation模板中导出 Lambda函数ARN 。您需要将 Lambda函数ARN 作为输入传递给cloudwatch事件(AWS::Events::Rule
目标属性需要资源ARN)。
请参阅下面的示例脚本:
Resources:
# Create Controlled Lambda Function
myLambda:
Type: "AWS::Lambda::Function"
Properties:
Code:
S3Bucket: "lambda-bucket"
S3Key: "myhandler.zip"
Description: "Lambda handler"
FunctionName: "myhandler"
Handler: myhandler.myhandler
MemorySize: 128
Role: "arn:aws:iam::xxxxxxxxxxx:role/myLambdaExecutionRole-NC7FA7TUSZ5B"
Runtime: "python3.6"
Timeout: 10
# Output of the cf template
Outputs:
myLambdaArn:
Description: Arn of the my_lambda_function
Value: !GetAtt myLambda.Arn
Export:
Name: !Sub "${AWS::StackName}-LambdaArn"
2)当您创建 CloudWatch Event 时,您需要将在步骤1中创建的lambda函数的 ARN 作为目标。
请参阅下面的示例脚本:
Resources:
# Cloudwatch event to trigger lambda periodically
rLambdaScheduledRule:
Type: "AWS::Events::Rule"
Properties:
Description: "CloudWatch Event to trigger lambda fn"
ScheduleExpression: "rate(1 hour)"
State: "ENABLED"
Targets:
-
Arn:
Fn::ImportValue:
!Sub "${NetworkStackName}-LambdaArn"
Id: "targetevent_v1"
PermissionForEventsToInvokeLambda:
Type: "AWS::Lambda::Permission"
Properties:
FunctionName:
Fn::ImportValue:
!Sub "${NetworkStackName}-LambdaArn"
Action: "lambda:InvokeFunction"
Principal: "events.amazonaws.com"
SourceArn:
Fn::GetAtt:
- rLambdaScheduledRule
- Arn
${NetworkStackName}
的值应为Step1中的 StackName 。
您需要在模板中更正的一些问题:
rLambdaScheduledRule
的目标属性。rLambdaScheduledRule
中删除操作属性。rPermissionForEventsToInvokeLambda
的 FunctionName 属性。将上面的示例作为参考,更正您的模板并重试。