cloudwatch事件触发cloudformation

时间:2017-11-09 06:02:31

标签: amazon-web-services yaml amazon-cloudformation

我在编写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

1 个答案:

答案 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 属性。

将上面的示例作为参考,更正您的模板并重试。