为什么 Lambda 函数作为目标添加到 Event Bridge Rule 未被触发?
Why is the Lambda function added as a target to Event Bridge Rule is not triggered?
我正在尝试将规则和 lambda 目标放入 EventBridge 的规则中。规则和目标已成功添加,但未触发目标 Lambda。当我导航到 AWS 控制台上的目标 Lambda 函数时,我看不到相关的触发器。
我正在使用 Serverless Framework 来部署堆栈。 putRuleAndTarget
lambda 是创建规则并将 notifyUser
添加为目标的 lambda。这是 serverless.ts
文件的相关部分:
functions: {
putRuleAndTarget: {
handler: 'src/functions/putRuleAndTarget.handler',
name: 'putRuleAndTarget'
},
notifyUser: {
handler: 'src/functions/notifyUser.handler',
name: 'notifyUser'
}
}
这是 putRuleAndTarget
的代码(我使用的是 aws javascript sdk v3):
import { EventBridgeClient, PutRuleCommand, PutTargetsCommand, } from '@aws-sdk/client-eventbridge'
import type { PutRuleCommandInput, PutTargetsCommandInput } from '@aws-sdk/client-eventbridge'
const client = new EventBridgeClient({ region: 'eu-central-1' })
async function putRuleAndTarget( ) {
try {
const putRuleCommandInput: PutRuleCommandInput = {
Name: 'notifyUserRule',
Description: 'Schedule a lambda to send notification to the user',
ScheduleExpression: 'rate(1 minute)',
}
const putRuleCommand = new PutRuleCommand(putRuleCommandInput)
const putRuleCommandOutput = await client.send(putRuleCommand)
const putTargetsCommandInput: PutTargetsCommandInput = {
Rule: 'notifyUserRule',
Targets: [
{
Arn: 'arn:aws:lambda:eu-central-1:AccountID:function:notifyUser',
Id: 'notifyUser'
},
]
}
const putTargetsCommand = new PutTargetsCommand(putTargetsCommandInput)
const putTargetsCommandOutPut = await client.send(putTargetsCommand)
} catch (error) {
console.log('[ putRuleAndTarget error ]', error)
}
}
export const handler = putRuleAndTarget
以下截图为运行宁putRuleAndTarget
后的截图
在 AWS EventBridge 控制台上创建的规则:
The rule on EventBridge Console
显示目标的规则详情:
Rule details and Target on EventBridge Console
Lambda控制台上的notifyUser
函数,注意缺少触发器:
notifyUser function on Lambda Console
此外,运行ning sls logs -f notifyUser
不会产生任何日志语句,该函数永远不会被调用,尽管它应该 运行 每 1 分钟。
您似乎缺少权限。该规则需要具有调用 lambda 的权限。
This tutorial 显示步骤。特别是检查涵盖
的部分
AWS::Lambda::Permission
评论中的请求示例:
LambdaInvokePermissionsExample:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName:
Fn::GetAtt:
- NameOfYourLambdaResource
- Arn
Principal: events.amazonaws.com
SourceArn:
Fn::GetAtt:
- EventRuleResourceName
- Arn
我正在尝试将规则和 lambda 目标放入 EventBridge 的规则中。规则和目标已成功添加,但未触发目标 Lambda。当我导航到 AWS 控制台上的目标 Lambda 函数时,我看不到相关的触发器。
我正在使用 Serverless Framework 来部署堆栈。 putRuleAndTarget
lambda 是创建规则并将 notifyUser
添加为目标的 lambda。这是 serverless.ts
文件的相关部分:
functions: {
putRuleAndTarget: {
handler: 'src/functions/putRuleAndTarget.handler',
name: 'putRuleAndTarget'
},
notifyUser: {
handler: 'src/functions/notifyUser.handler',
name: 'notifyUser'
}
}
这是 putRuleAndTarget
的代码(我使用的是 aws javascript sdk v3):
import { EventBridgeClient, PutRuleCommand, PutTargetsCommand, } from '@aws-sdk/client-eventbridge'
import type { PutRuleCommandInput, PutTargetsCommandInput } from '@aws-sdk/client-eventbridge'
const client = new EventBridgeClient({ region: 'eu-central-1' })
async function putRuleAndTarget( ) {
try {
const putRuleCommandInput: PutRuleCommandInput = {
Name: 'notifyUserRule',
Description: 'Schedule a lambda to send notification to the user',
ScheduleExpression: 'rate(1 minute)',
}
const putRuleCommand = new PutRuleCommand(putRuleCommandInput)
const putRuleCommandOutput = await client.send(putRuleCommand)
const putTargetsCommandInput: PutTargetsCommandInput = {
Rule: 'notifyUserRule',
Targets: [
{
Arn: 'arn:aws:lambda:eu-central-1:AccountID:function:notifyUser',
Id: 'notifyUser'
},
]
}
const putTargetsCommand = new PutTargetsCommand(putTargetsCommandInput)
const putTargetsCommandOutPut = await client.send(putTargetsCommand)
} catch (error) {
console.log('[ putRuleAndTarget error ]', error)
}
}
export const handler = putRuleAndTarget
以下截图为运行宁putRuleAndTarget
后的截图
在 AWS EventBridge 控制台上创建的规则:
The rule on EventBridge Console
显示目标的规则详情: Rule details and Target on EventBridge Console
Lambda控制台上的notifyUser
函数,注意缺少触发器:
notifyUser function on Lambda Console
此外,运行ning sls logs -f notifyUser
不会产生任何日志语句,该函数永远不会被调用,尽管它应该 运行 每 1 分钟。
您似乎缺少权限。该规则需要具有调用 lambda 的权限。
This tutorial 显示步骤。特别是检查涵盖
的部分AWS::Lambda::Permission
评论中的请求示例:
LambdaInvokePermissionsExample:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName:
Fn::GetAtt:
- NameOfYourLambdaResource
- Arn
Principal: events.amazonaws.com
SourceArn:
Fn::GetAtt:
- EventRuleResourceName
- Arn