serverless-framework - 如何在无服务器框架中将 CF 资源定义为函数事件源
问题描述
我正在尝试使用无服务器框架创建 AWS Lambda。Lambda 通过 AWS IoT 主题规则触发。如果规则执行失败,我希望执行错误操作。整个配置应该在serverless.yml中进行。
据我从文档中可以看出,没有选项可以描述errorAction
iot 事件:
functions:
foobar:
events:
- iot:
errorAction: ?
但是可以在serverless.ymlErrorAction
内部定义一个 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
但是后来我不知道如何链接资源以充当 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
。
编辑1
在 IoTTopicRule 资源中定义 Lambda 操作,使用 Lambda 操作和错误事件按预期创建规则。不幸的是,该规则并未在 Lambda 中显示为触发器。
解决方案
为了能够定义一个 AWS IoT 主题规则,该规则ErrorAction
也将显示为 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"
推荐阅读
- tinymce - 向 TinyMCE 添加图像时,有没有办法让编辑区域自动向下扩展?
- sql - Oracle SQL,如果值对不同情况成立,则分配名称
- c# - 哪个服务可以允许我将多个(复杂类型)参数从服务传递到 Xamarin 表单的客户端?
- java - java Vertx 事件循环是否共享同一个线程?还是一对一的?
- xcode - 在苹果 M1(基于新 arm 的 macbook pro)上使用 xcode 12 的 react-native 构建添加 swift 文件失败
- android - 如何使用 ADB 命令触发 WhatsApp 呼叫号码?
- r - 如何返回导致R中错误的索引
- django-models - django更新记录mysql
- javascript - 如何在 JS 中将此 unicode 分数(“¼”和“½”)转换为 Number(1/2, 1/3)?
- redux - Redux-reducer 没有被调用