amazon-web-services - 从 SNS 触发 lambda 函数

标签 amazon-web-services aws-cloudformation

我有一个用例,其中有几个 lambda 函数,我希望由 SNS 触发它们。

这是我正在使用的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 主题,是否可以稍微抽象一下,例如创建一个可以为 lambda 执行此操作的 IAM 策略(允许它们由单个 SNS 调用)?

非常感谢您的提前答复

最佳答案

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

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

关于amazon-web-services - 从 SNS 触发 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57416663/

相关文章:

github - 使用第三方 GitHub 源提供商保留 AWS Pipeline 的 git 操作

amazon-web-services - AWS CloudFormation 是否有等效的 Terraform destroy 命令

python - CloudFormation 模板错误 Fn::Sub 内部函数未指定预期参数

amazon-web-services - 如何在单个 CloudFormation 堆栈上创建 2 个 AWS lambda?

amazon-web-services - 放置 AWS PHP SDK 凭证文件的位置

python - 亚马逊 AWS - S3 到 ElasticSearch(Python Lambda)

laravel - 上传到 S3 之前的 AWS 临时文件?

amazon-web-services - AWS Sagemaker 客户端错误 : Unable to initialize the algorithm

amazon-web-services - 从 cloudformation 创建 Aurora Serverless 集群?

amazon-web-services - 如何在 terraform 中传递 template_file var 部分中的列表而不是字符串