【问题标题】:AWS CloudWatch Event isn't triggeringAWS CloudWatch 事件未触发
【发布时间】:2020-05-08 05:18:10
【问题描述】:

我尝试使用以下代码创建 cloudwatch 事件规则。但是,它似乎不起作用。我检查了 AWS CloudWatch Events,我附加了 lambda 函数,规则就在那里。但是,该事件永远不会被触发。我该如何解决这个问题?

async function createCloudWatchEvent(zip){
    if(zip){
        try{
            await putRule(zip);
            await putTarget(zip);
        } catch (e) {
            console.log(`Can't create [${zip}] cloudwatch event`);
        }
    }
}

function putRule (ruleName) {
    let cloudWatchParams = {
      Name: ruleName, // required
      ScheduleExpression: 'rate(1 minute)',
      State: 'ENABLED'
    };

    return new Promise(resolve => {
        cloudwatchevent.putRule(cloudWatchParams, async function(err, data) {
          if(err){
            console.log(err);
            resolve(err);
          }else{
            console.log('Successfully created rule: ' + ruleName);
            resolve();
          }
        });
    });
}

function putTarget (ruleName) {
    let cloudWatchParams = {
      Rule: ruleName, // required
      Targets: [ // required
        {
          Arn: 'xxxxxxxxxx',
          Id: 'Determine_State',
          Input: JSON.stringify({zip: ruleName})
        }
      ]
    };

    return new Promise(resolve => {
        // Attach "Determine_State" target to cloudwatch event
        cloudwatchevent.putTargets(cloudWatchParams, function(err, data) {
          if(err){
            console.log(err);
            resolve(err);
          }else{
            console.log('Successfully attached target [' + cloudWatchParams.Targets[0].Id + '] to rule: ' + ruleName);
            resolve();
          }
        });
    });
}

【问题讨论】:

    标签: amazon-web-services amazon-cloudwatch


    【解决方案1】:

    我不确定您是否已经知道,您为 lambda 函数设置的 cron 计划是 UTC 时间。例如,如果您指定下午 5 点,则为 UTC 时间下午 5 点。也许您正在检查日志,然后再执行。

    登录到 cloudwatch 的 Lambda 权限

    lambda 应该有权登录到 cloudwatch。否则 lambda 函数不会将日志添加到 cloudwatch。这是您可以参考的政策。

    {
        "Statement": [
            {
                "Action": [
                    "logs:CreateLogGroup",
                     "logs:CreateLogStream",
                     "logs:PutLogEvents"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:logs:*:*:*"
            }
        ]
    } 
    

    参考:

    Can't get AWS Lambda function to log (text output) to CloudWatch

    希望这会有所帮助。

    【讨论】:

    • 我把 cron 表达式注释掉,改成 'rate(1 minute)' 进行测试。
    • 您的 lambda 是否有权将日志推送到 cloudwatch
    • 我刚刚做了一个测试,并按照上述政策为我工作。
    • 将权限添加到我的 lambda 执行角色后,我必须重新部署 lambda 以创建日志组。祝你好运
    • 我将此策略添加到 lambda 执行角色。如何重新部署 lambda 以创建日志组?{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" } ] }
    【解决方案2】:

    我认为您需要授予从 CloudWatch 事件(您的规则)调用 lambda 函数的权限。看看this 教程。

    您必须通过 CLI 或从该语言的 AWS API 执行此操作。例如:

    aws lambda add-permission \
    --function-name LogScheduledEvent \
    --statement-id my-scheduled-event \
    --action 'lambda:InvokeFunction' \
    --principal events.amazonaws.com \
    --source-arn arn:aws:events:us-east-1:123456789012:rule/my-scheduled-rule
    

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2019-07-15
      • 1970-01-01
      • 2022-01-27
      • 2020-09-20
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多