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

19
我正在尝试创建一个AWS Eventbridge规则,并将Lambda函数设置为目标。我可以成功添加规则和目标,但是当我尝试通过RoleArn设置Lambda权限时,Cloudformation堆栈部署失败,显示以下错误信息: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"] ]

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

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

非常感谢您的任何想法。


最令人沮丧的是,AWS 在任何地方都没有输出任何错误消息!!!即使在2022年,使用AWS仍然需要很多猜测和试错。 - Xavier Robitaille
1个回答

32

这似乎会进行一些背后的魔法,以添加正确的权限,使得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

1
谢谢,问题解决了 :) 我认为问题出在文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html没有说明RoleArn不适用于lambda。此外,在目标旁边,控制台有一个“角色”列。同样,当目标是lambda时,我想这个列是没有填充的。我会将您的答案标记为已接受,CF代码完全正确。 - kiwichris
@kiwichris 没问题。很高兴它能正常工作 :-) - Marcin
我尝试添加一个角色并将一个带有调用权限的策略附加到它上面,但是没有成功。使用您的简单权限解决了这个问题。谢谢。 - Waleed Ahmad
1
谢谢,这也解决了类似的问题。 我有一个带有RoleArn的AWS :: Events :: Rule,给出了相同的错误。 删除了RoleArn,然后添加了这个解决方案,它起作用了。 - yjsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接