从 Lambda 函数安排的 CloudWatch 事件

Posted

技术标签:

【中文标题】从 Lambda 函数安排的 CloudWatch 事件【英文标题】:CloudWatch Events scheduled from Lambda function 【发布时间】:2019-10-26 11:15:53 【问题描述】:

我尝试使用 Amazon CloudWatch Events 设置调度,它应该从另一个 Lambda 调用 Lambda 函数 我使用了来自Sending Events to Amazon CloudWatch Events - AWS SDK for javascript 的指南。

问题是,即使在设置 CloudWatch Events IAM 角色之后


                    Sid: 'CloudWatchEventsFullAccess',
                    Effect: 'Allow',
                    Action: ['*'],
                    Resource: '*',
,

和 Lambda 角色相似,当我调用 main 函数时

const cloudWatchEvents = new CloudWatchEvents()

        const ruleParams = 
            Name: projectId,
            ScheduleExpression: crontab,
            State: 'ENABLED',
            RoleArn: apiCloudWatchEventsIamRole,
        

        const targetParams = 
            Rule: projectId,
            Targets: [
                
                    Arn: apiLongTaskFunctionArn,
                    Id: 'lambdaCloudWatch',
                ,
            ],
        


        cloudWatchEvents.putRule(ruleParams, (err, rule) => 
            if (err) 
                console.log(err)
                return err
            
            cloudWatchEvents.putTargets(targetParams, (err, data) => 
                if (err) 
                    console.log(err)
                    return (err)
                
                const eventParams = 
                    Entries: [
                        
                            DetailType: 'Scheduled Event',
                            Source: 'aws.events',
                            Resources: [rule.RuleArn],
                            Detail: '',
                        ,
                    ],
                
                cloudWatchEvents.putEvents(eventParams, (err, data) => 
                    if (err) 
                        console.log(err)
                        return (err)
                    
                    console.log(data)
                )
            )
        )

我从最后一个 console.log 得到响应

 FailedEntryCount: 1,
      Entries: 
       [  ErrorCode: 'NotAuthorizedForSourceException',
           ErrorMessage: 'Not authorized for the source.'  ] 

我不确定我应该在哪里寻找答案,因为我没有在网络上的任何地方看到这个案例。

【问题讨论】:

角色建立信任关系了吗?即“声明”:[“效果”:“允许”,“主体”:“服务”:“events.amazonaws.com”,“行动”:“sts:AssumeRole” @tedsmitt 是的,我设置了声明:[效果:'允许',主体:服务:['lambda.amazonaws.com'],,操作:['sts:AssumeRole'] , , Effect: 'Allow', Principal: Service: ['events.amazonaws.com'], , Action: ['sts:AssumeRole'], , ],适用于 lambda 执行角色和 cloudWatch 事件角色 我认为这里的问题是 aws.* 前缀是保留给 AWS 自己使用的。因此,当您尝试将来源指定为aws.events 时,它会告诉您您无权使用该来源。虽然,除了 blog post 的结尾之外,我似乎找不到任何关于此的文档。 【参考方案1】:

好的,所以添加到 ruleParams

            EventPattern: JSON.stringify(
                source: ['sourceName'],
            ),

并将条目设置为

                    Entries: [
                        
                            DetailType: 'Scheduled Event',
                            Source: 'sourceName',
                            Resources: [rule.RuleArn],
                            Detail: '',
                        ,
                    ],

解决了问题

【讨论】:

嗨,这只是监听每个 cloudwatch 事件。我想运行一个 cron 并将 cloudwatch 事件与有效负载一起传递给 lambda

以上是关于从 Lambda 函数安排的 CloudWatch 事件的主要内容,如果未能解决你的问题,请参考以下文章

为 Lambda 函数设置 CloudWatch 日志组的过期时间

禁用 CloudWatch 以监控 Lambda 函数的日志

如何将值传递给 CloudWatch 中的 Lambda 函数?

Terraform 多个 cloudwatch 事件触发相同的 lambda 函数

javascript CloudWatch到AWS Lambda到Slack Channel Alerts和Charts。通过SNS主题通过Lambda函数将CloudWatch警报发布到Slack通

sh 使用CloudWatch事件规则触发器部署Lambda函数