2

앞으로 특정 시간에 aws 람다 함수를 호출해야하는 cloudwatch 이벤트를 만들고 있습니다. 여기에 설명 된대로 내가 사용하고 AWS nodejs SDK : http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.htmlAws 람다 함수 addPermission 오류 : PolicyLengthExceededException

CloudWatch에서 이벤트를 생성하는 코드 블록은 다음과 같습니다 : 기능 이상

module.exports.createReservationReminder = function (reservationModel, user, restaurant) { 
return new Promise(function (resolve, reject) { 
    const ruleName = "rsv_" + reservationModel.reservationId; 
    const description = "Reservation reminder of `" + user.name + "` @ `" + restaurant.title + "` on `" + reservationModel.time + "`"; 
    let reservationTime = reservationModel.time; 
    let lambdaFunctionName = module.exports.buildLamdaFunctionArn("restaurant") 

    let alertTime = moment(reservationTime).tz(AppConfig.defaultTimezone).subtract(// Create alert 45 minute before a reservation 
      45, 
      'minutes' 
     ); 

    let lambda = new AWS.Lambda({ 
     accessKeyId: AppConfig.accessKeyId, 
     secretAccessKey: AppConfig.secretAccessKey, 
     region: AppConfig.region 
    }); 

    let scheduleExpression1 = "cron(" + alertTime.utc().format('m H D MMM ? YYYY') + ')'; 

    let ruleParams = { 
     Name: ruleName, 
     Description: description, 
     ScheduleExpression: scheduleExpression1, 
     State: 'ENABLED', 
    }; 
    cloudwatchevents.deleteRule({Name: ruleName}, function (err, deleteRuleData) { //remove if a previous rule was created halfway 
     cloudwatchevents.putRule(ruleParams, function (err, ruleData) { //create the rule 
      if (err) { 
       reject(err) 
      } 
      else { 


       let lambdaPermission = { 
        FunctionName: lambdaFunctionName, 
        StatementId: ruleName, 
        Action: 'lambda:InvokeFunction', 
        Principal: 'events.amazonaws.com', 
        SourceArn: ruleData.RuleArn 
       }; 

       let removePermission = { 
        FunctionName: lambdaFunctionName, 
        StatementId: ruleName, 
       } 

       //now to create the rule's target, need to add permission to lambda 
       lambda.removePermission(removePermission, function (err, removeLambdaData) { //remove if rule of same name was added as permission to this lambda before, ignore if rule not found error is thrown 
        lambda.addPermission(lambdaPermission, function (err, lamdaData) { //now add the permission 
         if (err) { 
          reject(err) // FAIL : throws error PolicyLengthExceededException after ~50 cloudwatch events are registered to this lambda function 
         } 
         else { 
          let targetParams = { 
           Rule: ruleName, 
           Targets: [ 
            { 
             Arn: module.exports.buildLamdaFunctionArn("restaurant"), 
             Id: ruleName, 
             Input: JSON.stringify({ 
              func: "notifyUserOfUpcomingReservation", 
              data: { 
               reservationId: reservationModel.reservationId 
              } 
             }), 

            }, 

           ] 
          }; 
          cloudwatchevents.putTargets(targetParams, function (err, targetData) { 
           if (err) { 
            reject(err) 
           } 
           else { 
            resolve(targetData) 
           } 
          }) 
         } 
        }) 
       }) 
      } 
     }); 
    }) 


}) 

}

처음에 잘 작동 ~ 50 배 (따라서 50 개 예약에 대해 쉽게 알릴 수 있습니다.) 그러나 결국에는 항상 실패합니다.

PolicyLengthExceededException 람다 함수 액세스 정책은 20KB로 제한됩니다.

HTTP 상태 코드 : 정책 문서가 너무 큰 수 없기 때문에, 의미가 400

. 그래서이 문제에 접근하는 올바른 방법은 무엇입니까? 람다 함수 대상으로 무제한 클라우드 워치 이벤트 알림을 만듭니다.

+2

당신은 발사해야하는 각각의 이벤트를 만들고 있습니까? 나는 다른 이유로 그것을 확장 할 것이라고 생각하지 않습니다. 더 나은 전략은 매 5 분마다 발생하는 하나의 반복 이벤트이며 테이블 (예 : DynamoDB 또는 RDS)을 쿼리하여 보내지 않은 알림을 "지금"보내야하는지 확인한 다음 두 번째 호출 람다 함수. 생각? –

+0

내가 할 수있는 cloudwatch 이벤트 수 제한으로 인해 정확히 ( –

답변

1

역할을 만들고 해당 역할에 대한 정책이나 권한을 추가하면 람다가 역할을 맡고 실행될 수 있습니다. aws STS 모듈을 사용할 수 있습니다.

매번 권한을 만들고 제거하는 것이 아닙니다. STS는 일시적으로 역할을 맡고 코드를 실행합니다.

+0

)이 문제는 제기 된 올바른 방법입니다. 그러나 최대 예약 된 이벤트 수 제한이 있음이 밝혀졌습니다. (100). 그래서 @ michael-sqlbot이 제안한 것을 끝내었다. –