CloudFormation中AWS EventBridge Scheduler调用Lambda需指定RoleArn的疑问
关于AWS Scheduler调度器触发Lambda必须指定RoleArn的问题
核心结论
是的,你必须为AWS::Scheduler::Schedule的Target定义一个服务角色。这个角色用于赋予AWS Scheduler服务调用Lambda函数的权限,和你已添加的Lambda::Permission是互补配置,二者缺一不可。
原因说明
你配置的Lambda::Permission是允许指定主体(这里是events.amazonaws.com,即Scheduler服务)调用Lambda函数;而Scheduler的RoleArn是给Scheduler服务本身授权,让它拥有执行lambda:InvokeFunction动作的权限——这是新版Scheduler的强制要求,缺少该角色,Scheduler无法完成对Lambda的调用。
CloudFormation实现步骤
- 创建Scheduler专属服务角色
定义一个IAM角色,信任策略允许AWS Scheduler服务扮演该角色,同时附加权限策略,仅允许调用目标Lambda函数。 - 在Scheduler的Target中引用该角色
取消RoleArn的注释,关联刚创建的角色ARN即可。
完整示例代码
#... # 1. 创建Scheduler服务角色 SchedulerLambdaInvokeRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: scheduler.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: SchedulerInvokeLambdaPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: !GetAtt LambdaInstSchedDispatcher.Arn # 2. 配置Scheduler调度器,引用上述角色 TriggerStop20dailyCET: Type: AWS::Scheduler::Schedule Properties: Description: Stop RDS and EC2 with Tag 20:00 Name: !Join - '-' - - Ref: Prefix - Ref: Title - "20-00_CET" FlexibleTimeWindow: Mode: FLEXIBLE MaximumWindowInMinutes: 1 ScheduleExpressionTimezone: Europe/Zurich ScheduleExpression: "cron(0 20 * * ? *)" State: "ENABLED" Target: Arn: !GetAtt LambdaInstSchedDispatcher.Arn RoleArn: !GetAtt SchedulerLambdaInvokeRole.Arn # 关联服务角色 Input: '{"action": "stop", "TagValues":["20:00"]}' # 保留原有的Lambda权限配置 PermissionAForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref LambdaInstSchedDispatcher Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: !GetAtt TriggerStop20dailyCET.Arn #...
注意事项
- 角色的信任策略必须指定
scheduler.amazonaws.com作为服务主体,确保只有Scheduler服务能扮演该角色。 - 权限策略中的
Resource要精准指向你的Lambda函数ARN,遵循最小权限原则。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

