【问题标题】:AWS Event Rule doesn't workAWS 事件规则不起作用
【发布时间】:2018-07-31 11:55:03
【问题描述】:

我有以下 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\"}"

【问题讨论】:

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


    【解决方案1】:

    您需要授予 Event 调用 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"] }
        }
     },
    

    【讨论】:

    • 谢谢。它和我做的方式不同吗?我已经在原始帖子中更新了我的代码。
    • 我不认为 AWS::Events::Rule 支持 RoleArn 作为其属性之一。你可以参考这里的链接docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
    • 你有 cloudtrail 吗?检查那里的详细事件记录
    • 有趣。我对RoleArn 属性感到困惑,它是Target 资源的一部分。只需添加权限,它就可以工作。谢谢:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 2020-11-24
      • 2022-01-13
      • 2019-07-15
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多