AWS Лямбда-событие SNS не привязано к правильному SNS Topi c ARN с использованием бессерверного yml - PullRequest
1 голос
/ 01 апреля 2020

У меня есть серверный ресурс для SNS topi c в разделе ресурсов в serverless.yml примерно так:

resources:
  Resources:
    SNSTopic:
      Type: AWS::SNS::Topic
      Properties:
        DisplayName: SNS Topic
        TopicName: ${self:service}-${self:provider.stage}-Topic 

Когда я пытаюсь привязать эту SNS topi c к моему лямбда-событие, как указано ниже, лямбда-событие не запускается событием SNS. Когда я проверяю консоль AWS для этой лямбда-функции, событие SNS связывается с неверным значением ARN.

Function:
    handler: src/sample/file.lambdaHandler
    role: s3FullAccessRole
    events: SNSTopic
    Properties:
      Policies:
        - AWSLambdaExecute
        - Statement:
            - Effect: Allow
              Action:
                - 'lambda:InvokeFunction'

Я пытался изменить событие всеми способами, упомянутыми здесь, https://serverless.com/framework/docs/providers/aws/events/sns/ . Единственный способ, который я нашел, это жестко закодировать значение SNS Topi c ARN в лямбда-событии, что не идеально для моей ситуации. Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

На самом деле вы можете создать переменную в custom с помощью arn of sns topi c

custom:
  region: ${opt:region, self:provider.region}
  snsTopic: ${self:service}-${self:provider.stage}-Topic 
  snsTopicArn: { "Fn::Join" : ["", ["arn:aws:sns:${self:custom.region}:", { "Ref" : "AWS::AccountId" }, ":${self:custom.snsTopic}" ] ]  }

, а затем просто использовать arn в нужных вам местах.

Или вы можете используйте плагин https://github.com/silvermine/serverless-plugin-external-sns-events для указания c ссылки на имя топи c.

Если у вас есть только 1 serverless.yml и вы не хотите иметь отдельный файл облачной информации Я бы использовал первый вариант

РЕДАКТИРОВАТЬ:

Чтобы использовать arn, следуйте инструкциям на безсерверный https://serverless.com/framework/docs/providers/aws/events/sns#using -a-pre-Существующий-topi c

functions:
  dispatcher:
    handler: <handler>
    events:
      - sns:
          arn: ${self:custom.snsTopicArn}

, поскольку у вас есть sns topi c в том же serverless.yml, вы даже можете игнорировать переменную snsTopicArn и построить ее, как одно из предложений, используя! Ref, который должен быть лучшим вариантом для вас:

functions:
  dispatcher:
    handler: <handler>
    events:
      - sns:
          arn: !Ref SNSTopic
          topicName: ${self:custom.snsTopic}

полный пример:

service: testsns
provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-1

functions:
  hello:
    handler: handler.hello
    events:
      - sns:
          arn: !Ref SuperTopic
          topicName: MyCustomTopic
    Properties:
      Policies:
        - AWSLambdaExecute
        - Statement:
            - Effect: Allow
              Action:
                - 'lambda:InvokeFunction'
resources:
  Resources:
    SuperTopic:
      Type: AWS::SNS::Topic
      Properties:
        TopicName: MyCustomTopic
0 голосов
/ 03 апреля 2020

Наконец-то все получилось!

В итоге я удалил свое объявление SNS TOPI C из раздела ресурсов serverless.yml, добавленного в iamRoleStatements, что-то вроде этого,

 iamRoleStatements:
    - Effect: Allow
      Action:
        - SNS:Publish
      Resource: { "Fn::Join" : ["", ["arn:aws:sns:${self:provider.region}:", { "Ref" : "AWS::AccountId" }, ":${self:custom.mySnsTopic}" ] ]  }

И добавил переменные в пользовательском разделе

custom:  
  mySnsTopic: "${self:service}-${self:provider.stage}-sns-consume"
  mySnsTopicArn: { "Fn::Join" : ["", ["arn:aws:sns:${self:provider.region}:", { "Ref" : "AWS::AccountId" }, ":${self:custom.mySnsTopic}" ] ]  }

затем сопоставили это с событиями лямбда-функции

Function:
    handler: src/sample/file.lambdaHandler
    role: s3FullAccessRole
    events: ${self:custom.mySnsTopicArn}
    Properties:
      Policies:
        - AWSLambdaExecute

Для справки ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...