我尝试通过创建规则动态触发我的 lambda,将 lambda 添加为该规则的目标,并向规则添加调用 lambda 的权限,如下所示:
const client = new CloudWatchEventsClient({
region: region,
credentials: { accessKeyId, secretAccessKey }
});
//for simplicity i make constant variables here:
const ruleName = "sendEmail-test-1"
const cron= "(10 10 ? * * *)"
const event = {foo:"boo"}
const putRule = async () => {
const command = new PutRuleCommand({
Name: ruleName,
ScheduleExpression: cron,
State: 'ENABLED',
Description: Description
});
return await client.send(command);
putRule
返回状态码为 200 的元数据。在用户界面中我也可以看到新规则。
然后我将目标添加到该规则中,如下所示:
const putTarget = async (ruleName: string, event: RuleObjectType['event']) => {
const command = new PutTargetsCommand({
Rule: ruleName,
Targets: [
{
Id: ruleName,
Arn: lambdaARN,
Input: JSON.stringify(event)
}
]
});
return await client.send(command);
};
同样,响应中的状态代码为 200 ,我可以在 UI 中看到该规则有一个新目标,即我的 lambda。
但是,如果我进入 lambda,我在中还没有看到触发新规则,因此我在 lambda 内添加对此规则的权限,如下所示:
const addLambdaPermission = async (ruleName: string) => {
const command = new AddPermissionCommand({
Action: 'lambda:InvokeFunction',
FunctionName: lambdaARN,
Principal: 'events.amazonaws.com',
SourceArn: `arn:aws:events:${region}:${IAM_ID}:rule/${ruleName}`,
StatementId: `myProject-MyLambda-${ruleName}-permission` // Unique statement ID
});
return await client.send(command as any);
};
响应的状态代码再次为 200,但我仍然没有看到任何变化 在 lambda 权限内我没有看到这个新权限 在 lambda 触发器内,我没有看到我刚刚添加的规则。
我错过了什么?
我担心您有 IAM 角色吗?你能显示抛出异常消息吗?把它放入 try catch 并找出来。我不太清楚,但我认为
EventBusName
和 RoleArn
非常重要。