两个AWS Cloudformation堆栈可以共享一个AWS :: Serverless :: Function吗?

时间:2019-04-23 16:31:37

标签: amazon-web-services aws-lambda amazon-cloudformation

这是我的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}                   

1 个答案:

答案 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将生成一个唯一的唯一名称(通常基于堆栈名称,资源名称和一些随机字符)。