如何在无服务器框架中将 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"