我有一个用例,其中有几个 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/