【发布时间】:2017-11-12 15:02:09
【问题描述】:
我正在开发一个需要安排任务的应用程序,因此我使用 AWS Lambda 来处理它。但是,安排的时间是动态的,因为它取决于用户请求,因此无法使用 AWS 控制台进行安排,所以我使用 AWS Javascript SDK 来安排它。 这是流程:
- 创建 CloudWatch 规则(这样就成功了,我可以在控制台看到正在创建的规则
- 为 lambda 的策略添加权限,以便 cloudwatch 事件可以调用它(所有请求的 Lambda 函数代码都是相同的,所以我在 AWS 控制台中创建了一个 lambda 函数,而不是使用 SDK)
- 将目标添加到步骤 1 中创建的规则(此步骤失败)。我得到的错误是 RoleArn is not supported for target arn:aws:lambda:eu-west-1:629429065286:function:prebook。
下面是我写的Node.js代码
schedule_aws_lambda: function(booking_id, cronTimeIST, callback){
var event = new AWS.CloudWatchEvents({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
region: 'eu-west-1'
});
var lambda = new AWS.Lambda({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
region: 'eu-west-1'
});
var year = cronTimeIST.utc().year();
var month = cronTimeIST.utc().month() + 1;
var date = cronTimeIST.utc().date();
var hour = cronTimeIST.utc().hour();
var minute = cronTimeIST.utc().minute();
var cronExpression = "cron(" + minute + " "+ hour + " " + date + " " + month + " ? " + year +")";
var hour_minute = cronTimeIST.format("HH_mm");
var ruleParams = {
Name: 'brodcast_' + booking_id + '_' + hour_minute,
Description: 'prebook brodcast for ' + booking_id + '_' + hour_minute,
ScheduleExpression: cronExpression,
RoleArn: 'arn:aws:iam::629429065286:role/service-role/prebook_lambda_role',
State: 'ENABLED',
};
event.putRule(ruleParams).promise()
.then(data => {
var lambdaPermission = {
FunctionName: 'arn:aws:lambda:eu-west-1:629429065286:function:prebook',
StatementId: 'brodcast_' + booking_id + '_' + hour_minute,
Action: 'lambda:*',
Principal: 'events.amazonaws.com',
};
return lambda.addPermission(lambdaPermission).promise();
})
.then(data => {
var targetParams = {
Rule: ruleParams.Name,
Targets: [
{
Id: 'default',
Arn: 'arn:aws:lambda:eu-west-1:629429065286:function:prebook',
RoleArn: ruleParams.RoleArn,
Input: JSON.stringify({booking_id: booking_id})
}
]
};
return event.putTargets(targetParams).promise();
})
.then(data => {
callback(null, data);
})
.catch(err => {
callback(err)
});
}
我知道这与没有权限的角色有关,我无法弄清楚确切原因,我已为角色 提供以下访问权限
这是政策文件
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
基本上,我想将许多触发器(我不知道触发时间取决于用户请求)附加到 lambda 函数,但是,所有的 lambda 函数代码都是相同的。
【问题讨论】:
-
你有没有得到任何地方?
-
不,目前我们正在使用 node-cron 而不是 lambda 进行调度,但是,这不是正确的方式,因为如果服务器崩溃或重新启动,cron 调度将丢失。我们正在尝试替代解决方案,例如 Firebase 云函数和 Firebase DB。
标签: javascript amazon-web-services aws-lambda aws-sdk amazon-cloudwatch