Как определить ресурс CF как источник событий функции в безсерверной среде - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь создать AWS Lambda с безсерверной структурой. Лямбда запускается с помощью правила темы AWS IoT. В случае сбоя выполнения правила я хочу выполнить действие по ошибке. Вся конфигурация должна осуществляться в serverless.yml .

Насколько я могу судить из документации , нет возможности описать errorAction для события iot:

functions:
  foobar:
    events:
      - iot:
          errorAction: ?

Возможно определить ресурс Cloud Formation с ErrorAction внутри serverless.yml :

resources:
  Resources:
     FoobarIotTopicRule1:
       Type: AWS::IoT::TopicRule
       Properties:
           ErrorAction:
             Republish:
               RoleArn: arn:aws:iam::1234567890:role/service-role/iot_execution_role
               Topic: FAILURE

Но тогда я не знаю, как связать ресурс, чтобы он действовал как триггер лямбда-функции.

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 пытается дважды создать правило темы IoT AWS. Один раз для определения в events и один раз как определенный ресурс FoobarIoTTopicRule1.

EDIT1

Определяя действие Lambda внутри ресурса IoTTopicRule, создает правило по назначению с действием Lambda и событием ошибки. К сожалению, правило не отображается как триггер в лямбде.

1 Ответ

0 голосов
/ 20 мая 2019

Чтобы можно было определить тематическое правило IoT AWS с помощью 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"
...