AWS 事件规则不起作用

AWS Event Rule doesn't work

我有以下 CFN 事件规则,应该开始 MyLambda。当我 运行 这个 CFN 模板时,我可以看到规则是用正确的间隔创建的,正确的输入 json 并且它是 ENABLED。但它不会启动。我没有看到我的 lambda 创建任何日志(我使用的是打印语句)。

但是当我使用 UI(相同的配置等)创建类似的规则时,它工作正常。我不确定我在这里错过了什么。

CWEventRule:
    Type: "AWS::Events::Rule"
    Properties:
        Description: "Description"
        Name: "CWEventRule"
        ScheduleExpression: "rate(5 minutes)"
        State: "ENABLED"
        Targets:
          -
            Arn:
              Fn::GetAtt:
                - "MyLambda"
                - "Arn"
            Id: "MyLambda"
            Input: "{\"jsonkey\":\"jsonvalue\"}"

已更新具有角色的 cfn 模板

CloudWatchEventRole:
    Type: "AWS::IAM::Role"
    Properties:
        AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
                -   Effect: "Allow"
                    Principal:
                        Service:
                            -   !Sub lambda.amazonaws.com
                            -   !Sub events.amazonaws.com
                    Action: "sts:AssumeRole"
        Path: "/"
        Policies:
            -   PolicyName: CloudWatchEventPolicy
                PolicyDocument:
                    Version: '2012-10-17'
                    Statement:
                        -   Effect: Allow
                            Action:
                                -   "lambda:InvokeFunction"
                            Resource: "*"

CWEventRule:
    Type: "AWS::Events::Rule"
    Properties:
        Description: "Description"
        Name: "CWEventRule"
        ScheduleExpression: "rate(5 minutes)"
        State: "ENABLED"
        RoleArn: !GetAtt [ CloudWatchEventRole, Arn ]
        Targets:
            -
                Arn:
                    Fn::GetAtt:
                        -   "MyLambda"
                        -   "Arn"
                Id: "MyLambda"
                Input: "{\"jsonkey\":\"jsonvalue\"}"

您需要授予调用事件的 Lambda 权限。这可以通过创建 AWS::Lambda::Permission 资源来实现。

"PermissionInvokeLambdaRule": {
    "Type": "AWS::Lambda::Permission",
      "Properties": {
          "FunctionName": { "Fn::GetAtt": ["MyLambdaResouce", "Arn"] },
          "Action": "lambda:InvokeFunction",
          "Principal": "events.amazonaws.com",
          "SourceArn": { "Fn::GetAtt": ["MyEventsRuleResource", "Arn"] }
    }
 },

RoleArn 应与目标相关联,如下所示。可以找到更多信息here

Targets:
    -
        Arn:
            Fn::GetAtt:
                -   "MyLambda"
                -   "Arn"
        Id: "MyLambda"
        Input: "{\"jsonkey\":\"jsonvalue\"}"
        RoleArn:
          Fn::GetAtt:
          - CloudWatchEventRole
          - Arn