Amazon web services 来自CloudWatch规则的AWS SAM Lambda函数触发器
我有一个Lambda和一个触发Lambda的CloudWatch规则。当我通过web控制台设置这些时,我可以在Lambda控制台中看到它的触发器实际上是CloudWatch规则 现在我想从AWS SAM YAML模板设置它,触发器确实按照预期创建,但在lambda web控制台中,它没有将CloudWatch规则显示为触发器 另外,我需要在YAML中设置lambda的VPC,但对lambda没有影响 如果有人能看看YAML并为我指出正确的方向,我将不胜感激:Amazon web services 来自CloudWatch规则的AWS SAM Lambda函数触发器,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我有一个Lambda和一个触发Lambda的CloudWatch规则。当我通过web控制台设置这些时,我可以在Lambda控制台中看到它的触发器实际上是CloudWatch规则 现在我想从AWS SAM YAML模板设置它,触发器确实按照预期创建,但在lambda web控制台中,它没有将CloudWatch规则显示为触发器 另外,我需要在YAML中设置lambda的VPC,但对lambda没有影响 如果有人能看看YAML并为我指出正确的方向,我将不胜感激: Resources: checkN
Resources:
checkNoSessionLambda:
Type: AWS::Serverless::Function
Properties:
Description: 'checkNoSessionLambda at every 1 minute'
Handler: checkNoSessionLambda.handler
Runtime: nodejs8.10
Timeout: 60
CodeUri: ./src
Role: ***
VpcConfig:
SecurityGroupIds:
- "***"
SubnetIds:
- "***"
- "***"
Events:
CheckNoSessionClouadwatchRule:
Properties:
EventPattern:
source:
- "aws.events"
Type: AWS::Events::Rule
CheckNoSessionClouadwatchRule:
Type: AWS::Events::Rule
Properties:
Description: "Invoke checkNoSession lambda every 1 minute"
ScheduleExpression: "rate(1 minute)"
State: "ENABLED"
Targets:
-
Arn: "***"
Id: "checkNoSessionLambdaTargetId"
编辑:
Lambad在堆栈中,因此仅使用GetAtt没有帮助您是在硬编码ARN吗?这将不起作用,因为您要指向的资源(lambda函数)尚不存在,并且将由CFN模板本身创建 您必须将
Fn::GetAtt
与定义的无服务器函数的逻辑ID一起使用,以获取ARN
Targets:
-
Arn: !GetAtt checkNoSessionLambda.Arn
Id: "checkNoSessionLambdaTargetId"
你是在硬编码ARN吗?这将不起作用,因为您要指向的资源(lambda函数)尚不存在,并且将由CFN模板本身创建 您必须将
Fn::GetAtt
与定义的无服务器函数的逻辑ID一起使用,以获取ARN
Targets:
-
Arn: !GetAtt checkNoSessionLambda.Arn
Id: "checkNoSessionLambdaTargetId"
您需要允许cloudwatch调用lambda函数,请签入。通常的流程是
- Lambda函数
- 事件规则
- 向事件授予Lambda调用权限
Type: AWS::Lambda::Permission
Properties:
FunctionName:
Ref: "checkNoSessionLambda"
Action: "lambda:InvokeFunction"
Principal: "events.amazonaws.com"
SourceArn:
Fn::GetAtt:
- "CheckNoSessionClouadwatchRule"
- "Arn"
您需要允许cloudwatch调用lambda函数,请签入。通常的流程是
- Lambda函数
- 事件规则
- 向事件授予Lambda调用权限
Type: AWS::Lambda::Permission
Properties:
FunctionName:
Ref: "checkNoSessionLambda"
Action: "lambda:InvokeFunction"
Principal: "events.amazonaws.com"
SourceArn:
Fn::GetAtt:
- "CheckNoSessionClouadwatchRule"
- "Arn"
我最近做过这件事。您不应该在函数上设置事件,只需删除函数上的整个
Events
部分。您只需要3个资源:AWS::Serverless::Function
,AWS::Events::Rule
(根据下面的答案使用!GetAtt
),以及一个AWS::Lambda::Permission
来授予规则访问权以调用您的函数。@404我们不需要AWS::Events::Rule。相反,我们可以在Serverless::Function资源中使用事件。这将在部署模板时创建事件规则。细节:我最近做过这件事。您不应该在函数上设置事件,只需删除函数上的整个Events
部分。您只需要3个资源:AWS::Serverless::Function
,AWS::Events::Rule
(根据下面的答案使用!GetAtt
),以及一个AWS::Lambda::Permission
来授予规则访问权以调用您的函数。@404我们不需要AWS::Events::Rule。相反,我们可以在Serverless::Function资源中使用事件。这将在部署模板时创建事件规则。详细信息:嗨,Lambda是堆栈的一部分,因此每个堆栈部署后的名称不同。嗨,Lambda是堆栈的一部分,因此每个堆栈部署后的名称不同。