首页 > 解决方案 > 如何在无服务器框架中将 CF 资源定义为函数事件源

问题描述

我正在尝试使用无服务器框架创建 AWS Lambda。Lambda 通过 AWS IoT 主题规则触发。如果规则执行失败,我希望执行错误操作。整个配置应该在serverless.yml中进行。

据我从文档中可以看出,没有选项可以描述errorActioniot 事件:

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 中显示为触发器。

标签: serverless-frameworkaws-iot

解决方案


为了能够定义一个 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"

推荐阅读