앞으로 특정 시간에 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
. 그래서이 문제에 접근하는 올바른 방법은 무엇입니까? 람다 함수 대상으로 무제한 클라우드 워치 이벤트 알림을 만듭니다.
당신은 발사해야하는 각각의 이벤트를 만들고 있습니까? 나는 다른 이유로 그것을 확장 할 것이라고 생각하지 않습니다. 더 나은 전략은 매 5 분마다 발생하는 하나의 반복 이벤트이며 테이블 (예 : DynamoDB 또는 RDS)을 쿼리하여 보내지 않은 알림을 "지금"보내야하는지 확인한 다음 두 번째 호출 람다 함수. 생각? –
내가 할 수있는 cloudwatch 이벤트 수 제한으로 인해 정확히 ( –