如何在无服务器框架中将 CF 资源定义为函数事件源
How to define CF resource as function event source in serverless framework
我正在尝试使用无服务器框架创建 AWS Lambda。 Lambda 通过 AWS IoT 主题规则触发。如果规则执行失败,我希望执行错误操作。整个配置应该在 serverless.yml.
内进行
据我所知 documentation 没有选项可以描述物联网事件的 errorAction
:
functions:
foobar:
events:
- iot:
errorAction: ?
虽然可以在 serverless.yml:
中定义带有 ErrorAction
的 Cloud Formation 资源
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
但是我不知道如何link 资源作为 Lambda 函数的触发器。
functions:
foobar:
handler: index.handler
events:
- iot:
name: iot_magic_rule
sql: "SELECT * FROM 'my/dedicated/topic'"
enabled: true
sqlVersion: '2016-03-23'
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
RuleName: iot_magic_rule
TopicRulePayload:
AwsIotSqlVersion: '2016-03-23'
RuleDisabled: false
Sql: "SELECT * FROM 'my/dedicated/topic'"
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
使用上述配置,尝试在 AWS 上部署失败,因为 Cloud Formation 尝试创建 AWS IoT 主题规则两次。一次用于 events
中的定义,一次作为定义的资源 FoobarIoTTopicRule1
.
EDIT1
在 IoTTopicRule 资源中定义 Lambda 操作,按预期创建规则,使用 Lambda 操作和错误事件。不幸的是,该规则不会在 Lambda 中显示为触发器。
为了能够使用 ErrorAction
定义 AWS IoT 主题规则,该规则也将在 AWS Lambda 上显示为触发事件,配置应类似于以下内容:
functions:
foobar:
handler: index.handler
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
RuleName: iot_magic_rule
TopicRulePayload:
AwsIotSqlVersion: '2016-03-23'
RuleDisabled: false
Sql: "SELECT * FROM 'my/dedicated/topic'"
Actions:
- Lambda:
FunctionArn: { "Fn::GetAtt": ['FoobarLambdaFunction', 'Arn']}
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
FoobarLambdaPermissionIotTopicRule1:
Type: AWS::Lambda::Permission
Properties:
FunctionName: { "Fn::GetAtt": [ "FoobarLambdaFunction", "Arn" ] }
Action: lambda:InvokeFunction
Principal: { "Fn::Join": ["", [ "iot.", { "Ref": "AWS::URLSuffix" } ]]}
SourceArn:
Fn::Join:
- ""
- - "arn:"
- "Ref": "AWS::Partition"
- ":iot:"
- "Ref": "AWS::Region"
- ":"
- "Ref": "AWS::AccountId"
- ":rule/"
- "Ref": "FoobarIotTopicRule1"
我正在尝试使用无服务器框架创建 AWS Lambda。 Lambda 通过 AWS IoT 主题规则触发。如果规则执行失败,我希望执行错误操作。整个配置应该在 serverless.yml.
内进行据我所知 documentation 没有选项可以描述物联网事件的 errorAction
:
functions:
foobar:
events:
- iot:
errorAction: ?
虽然可以在 serverless.yml:
中定义带有ErrorAction
的 Cloud Formation 资源
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
但是我不知道如何link 资源作为 Lambda 函数的触发器。
functions:
foobar:
handler: index.handler
events:
- iot:
name: iot_magic_rule
sql: "SELECT * FROM 'my/dedicated/topic'"
enabled: true
sqlVersion: '2016-03-23'
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
RuleName: iot_magic_rule
TopicRulePayload:
AwsIotSqlVersion: '2016-03-23'
RuleDisabled: false
Sql: "SELECT * FROM 'my/dedicated/topic'"
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
使用上述配置,尝试在 AWS 上部署失败,因为 Cloud Formation 尝试创建 AWS IoT 主题规则两次。一次用于 events
中的定义,一次作为定义的资源 FoobarIoTTopicRule1
.
EDIT1
在 IoTTopicRule 资源中定义 Lambda 操作,按预期创建规则,使用 Lambda 操作和错误事件。不幸的是,该规则不会在 Lambda 中显示为触发器。
为了能够使用 ErrorAction
定义 AWS IoT 主题规则,该规则也将在 AWS Lambda 上显示为触发事件,配置应类似于以下内容:
functions:
foobar:
handler: index.handler
resources:
Resources:
FoobarIotTopicRule1:
Type: AWS::IoT::TopicRule
Properties:
RuleName: iot_magic_rule
TopicRulePayload:
AwsIotSqlVersion: '2016-03-23'
RuleDisabled: false
Sql: "SELECT * FROM 'my/dedicated/topic'"
Actions:
- Lambda:
FunctionArn: { "Fn::GetAtt": ['FoobarLambdaFunction', 'Arn']}
ErrorAction:
Republish:
RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
Topic: FAILURE
FoobarLambdaPermissionIotTopicRule1:
Type: AWS::Lambda::Permission
Properties:
FunctionName: { "Fn::GetAtt": [ "FoobarLambdaFunction", "Arn" ] }
Action: lambda:InvokeFunction
Principal: { "Fn::Join": ["", [ "iot.", { "Ref": "AWS::URLSuffix" } ]]}
SourceArn:
Fn::Join:
- ""
- - "arn:"
- "Ref": "AWS::Partition"
- ":iot:"
- "Ref": "AWS::Region"
- ":"
- "Ref": "AWS::AccountId"
- ":rule/"
- "Ref": "FoobarIotTopicRule1"