这是我的SAM模板,它有一个称为CompanyParameter的参数,因此当我部署到堆栈时,我将传递一个公司名称,它将为每个公司创建一个队列,但是我想为不同公司指定所有堆栈到相同的lambda函数。
现在,当我创建第二个堆栈时,它将失败并显示以下消息:
batch-sqs-queue-process already exists in stack.....
这甚至可能吗?我之所以要这样做,是因为如果更改了lambda函数的某些代码,我只需要为所有公司更新一次即可。这是正确的方向吗?
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Processing batch system messages on an SQS queue with Lambda
Parameters:
CompanyParameter:
Type: String
Description: Company name
AllowedPattern: "[A-Za-z0-9]+"
ConstraintDescription: Company name must only contain uppercase and lowercase letters and numbers
Resources:
BatchSQSQueueFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./index.js
Description: process the batch data messages
FunctionName: batch-sqs-queue-process
Handler: index.handler
Runtime: nodejs8.10
Events:
BatchSQSEvent:
Type: SQS
Properties:
Queue: !GetAtt BatchSqsQueue.Arn
BatchSize: 10
BatchSqsQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub batch-sqs-queue-${CompanyParameter}
答案 0 :(得分:1)
当前实现无法按您希望的方式运行,您部署的每个CloudFormation模板将创建自己的SQS队列和自己的Lambda函数。如果Lambda源代码已更改,则必须为所有公司重新部署堆栈。一种替代方法是创建一个AWS Lambda Layer并将所有共享代码放入该层中,然后将Lambda与每个相应的SQS配置为使用该层。这将解决代码的重用,但是有一个警告。从documentation复制:
您选择要使用的图层的特定版本。如果以后要使用其他版本,请更新功能的配置。
换句话说,该代码在Lambda资源之间重复使用,但是您仍必须使用Lambda层的新版本号重新部署所有功能。
另一个替代方法可能是实现CloudFormation Macro。看一下Count的示例,但想象一下,它是用一系列公司而不是一些公司来提供的。免责声明,我尚未尝试将宏与AWS SAM一起使用。
请注意,batch-sqs-queue-process already exists in stack....
面临的问题是因为您已将FunctionName
指定为SAM模板的一部分。 Lambda函数名称在所有堆栈中必须唯一,请阅读用户指南中有关CloudFormation Name Type的更多信息。通过删除函数名称,CloudFormation将生成一个唯一的唯一名称(通常基于堆栈名称,资源名称和一些随机字符)。