将 lambda 目标角色添加到 Cloudformation 中的 AWS Eventbridge 规则失败

kiw*_*ris 20 amazon-web-services aws-cloudformation amazon-iam aws-lambda aws-event-bridge

我正在尝试创建一个以 Lambda 函数作为目标的 AWS Eventbridge 规则。我可以很好地添加规则和目标,但是当我尝试通过RoleArnCloudformation 堆栈部署设置 lambda 权限时失败,并显示: RoleArn is not supported for target arn:aws:lambda:us-east-1:1234567890:function:contacts-lambda-consume-new-customer. (Service: AmazonCloudWatchEvents; Status Code: 400; Error Code: ValidationException; Request ID: xxxxx-ec5d-45e8-b45d-xxxxxx; Proxy: null)

这是我的 Cloudformation 堆栈代码:

  EventRuleNewCustomer: 
    Type: AWS::Events::Rule
    Properties: 
      Name: new-customer
      EventBusName: myEventBus
      # RoleArn: !Join ["", ["arn:aws:iam::",!Ref "AWS::AccountId", ":role/my-role"] ] #no error but doesn't add the permissions
      Description: "New customer event rule"
      EventPattern: 
        detail-type: 
          - "NewCustomer"
      State: "ENABLED"
      Targets: 
        - 
          Arn: !Join ["", ["arn:aws:lambda:" ,!Ref "AWS::Region", ":", !Ref "AWS::AccountId", ":function:contacts-lambda-consume-new-customer"] ]
          Id: "NewCustomer"
          RoleArn: !Join ["", ["arn:aws:iam::",!Ref "AWS::AccountId", ":role/my-role"] ]
Run Code Online (Sandbox Code Playgroud)

我尝试RoleArn在规则本身上设置 a ,这在创建堆栈时不会给出错误,但也不会添加执行 Lambda 所需的权限。

我使用的解决方法是在 AWS Eventbridge 控制台中编辑 lambda 目标。这似乎在幕后做了一些魔法,为 Eventbridge 添加正确的权限,以便能够执行 lambda

任何想法不胜感激。

Mar*_*cin 33

这似乎在幕后做了一些魔法,为 Eventbridge 添加正确的权限,以便能够执行 lambda

对于 lambda,权限是使用Lambda 的基于资源的策略设置的。

因此,您应该在 CloudFormation 中使用AWS::Lambda::Permission来允许 EventBridge 调用您的函数,而不是使用RoleArn.

因此,您的权限将如下所示(仅作为示例):

EventBridgeLambdaPermission:
  Type: AWS::Lambda::Permission
  Properties:
    FunctionName: !GetAtt function.Arn
    Action: lambda:InvokeFunction
    Principal: events.amazonaws.com
    SourceArn: !GetAtt EventRuleNewCustomer.Arn
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您解决了问题:)我认为文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html列出了一个RoleArn不用说它不适用于 lambda。此外,控制台在目标旁边有一个“角色”列。再次,我认为当目标是 lambda 时,不会填充此内容我会将您的答案标记为已接受 CF 代码完全正确 (2认同)