【发布时间】: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