【问题标题】:Triggering a lambda function from SNS从 SNS 触发 lambda 函数
【发布时间】:2019-08-09 03:26:46
【问题描述】:

我有一个用例,其中我有几个想要由 SNS 触发的 lambda 函数。

这是我正在使用的cloudformation模板,它是由对流层生成的。

AWSTemplateFormatVersion: '2010-09-09'
Mappings:
  MapperToTenantId:
    jukin:
      id: t-007
    welt:
      id: t-012
Resources:
  InvokeLambdajukinPermission:
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 'jukinMapperLambda.Arn'
      Principal: sns.amazonaws.com
      SourceArn: !ImportValue 'IngestSnsAndLambdaRole-IngestServiceArn'
    Type: AWS::Lambda::Permission
  InvokeLambdaweltPermission:
    Properties:
      Action: lambda:InvokeFunction
      FunctionName: !GetAtt 'weltMapperLambda.Arn'
      Principal: sns.amazonaws.com
      SourceArn: !ImportValue 'IngestSnsAndLambdaRole-IngestServiceArn'
    Type: AWS::Lambda::Permission
  jukinMapperLambda:
    Properties:
      Code:
        ZipFile: !Join
          - ''
          - - "def lambda_handler(event, context):\n"
            - "    message = event['Records'][0]['Sns']['Message']\n"
            - "    print('From SNS: ' + message)\n"
            - "    return message\n"
      Description: This lambda takes care of mapper for jukin
      FunctionName: jukinMapperLambda
      Handler: index.lambda_handler
      Role: !ImportValue 'IngestSnsAndLambdaRole-LambdaExcecutionRole'
      Runtime: python3.6
    Type: AWS::Lambda::Function
  jukinSubscription:
    Properties:
      Endpoint: !GetAtt 'jukinMapperLambda.Arn'
      FilterPolicy:
        tenant_id:
          - t-007
      Protocol: lambda
      TopicArn: !ImportValue 'IngestSnsAndLambdaRole-IngestServiceArn'
    Type: AWS::SNS::Subscription
  weltMapperLambda:
    Properties:
      Code:
        ZipFile: !Join
          - ''
          - - "def lambda_handler(event, context):\n"
            - "    message = event['Records'][0]['Sns']['Message']\n"
            - "    print('From SNS: ' + message)\n"
            - "    return message\n"
      Description: This lambda takes care of mapper for welt
      FunctionName: weltMapperLambda
      Handler: index.lambda_handler
      Role: !ImportValue 'IngestSnsAndLambdaRole-LambdaExcecutionRole'
      Runtime: python3.6
    Type: AWS::Lambda::Function
  weltSubscription:
    Properties:
      Endpoint: !GetAtt 'weltMapperLambda.Arn'
      FilterPolicy:
        tenant_id:
          - t-012
      Protocol: lambda
      TopicArn: !ImportValue 'IngestSnsAndLambdaRole-IngestServiceArn'
    Type: AWS::SNS::Subscription

所以我已将订阅资源添加到 sns,并将触发器资源添加到相应的 lambda。

我的问题是,由于所有 lambda 都在收听同一个 SNS 主题,是否可以稍微抽象一下,例如创建一个 IAM 策略来为 lambda 执行此操作(允许它们被单个 SNS 调用)?

非常感谢您提前回答

【问题讨论】:

  • 您的问题不清楚。 “允许它们被单个 SNS 调用”是什么意思?如果 Lambda 函数订阅了 Amazon SNS 队列,这与由 SNS 队列触发的 Lambda 函数相同
  • 所以对于一个 sns 队列向 lambda 发送消息,然后 lambda 函数作为响应运行是一种方式操作对吗?所以 sns 应该为 lambda 函数添​​加订阅,而 lambda 函数也应该为 sns 添加触发器?到目前为止我是对的吗?
  • 不,你只需要做一个。订阅 Lambda 函数将自动在该函数上创建触发器。同样,将 SNS 触发器添加到 Lambda 函数将自动在 SNS 主题上创建订阅。这只是查看同一个“订阅/触发”过程的两种不同方式。
  • 好的,感谢您让我知道这一点。但是,如果我还想在 SNS 中为我​​的功能设置过滤策略,我可以在添加订阅或创建触发器时这样做吗?我的意思是我想在我的云形成模板中为单独的功能使用其中任何一个。否则它往往会变得很长。
  • 在 AWS Lambda 函数的 SNS 队列上创建 AWS::SNS::Subscription 时,您可以指定 FilterPolicy

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

我不熟悉对流层,但可以有一个 cloudformation 来定义一个订阅 lambdas 的 SNS 主题(而不是从另一个模板导入 sns 主题)。

如果您定义 aws::sns::topic,您可以定义 Subscription 属性,该属性允许您为一个 sns 主题制作 lambda 端点列表。此处链接的文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html#cfn-sns-topic-subscription

【讨论】:

  • 是的,我已经添加了订阅。但是我还必须添加 sns 作为我的 lambda 函数的触发器,对吗?是否可以使用 iam 角色为所有 lambda 函数添​​加 sns 主题?
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 2020-09-11
  • 2020-01-21
  • 2018-07-31
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多