如何通过Codepipeline在CFN模板中部署多个Lambda?

时间:2018-11-17 04:33:17

标签: amazon-web-services aws-code-deploy aws-codepipeline aws-codebuild aws-codecommit

用例

我有一个cloudformation堆栈,其中包含15个以上的Lambda。我可以通过Codepipeline部署堆栈,该堆栈由两个阶段CodeCommitCodeDeploy组成。在这种方法中,我所有的lambda代码都在cloudformation模板中(即内联代码)。出于安全方面的考虑,我想将此Inline更改为S3,这反过来又需要S3BucketNameS3Key

作为临时解决方法

到目前为止,我正在压缩每个lambda文件并手动将S3keyNamebucketname作为参数传递给我的堆栈。

  

是否可以通过Codepipeline完成此步骤?

我对CodeBuild的假设

我知道我们可以使用CodeBuild。但是到目前为止,我已经看到CodeBuild仅用于构建package.json文件。但是在我的用例中,我没有任何东西。而且我可以看到可以指定cloudformation package命令来将我的lambda从本地包装到S3,该命令将生成S3 codeuri`,但这是针对无服务器应用程序的,其中将有单个lambda,但对于我来说, 15.

我尝试过的事情

我知道,一旦您将git push赋予codecommit,它将使您保持在S3中的代码。所以我想从代码提交推送文件中获取S3BucketNameS3KeyName并将这些参数传递给我的CFN模板。我可以得到S3BucketName,但是S3KeyName我不知道如何得到?而且我不知道这种尝试的方法是否可行?

顺便说一句,我知道我可以使用Shell脚本来自动执行此过程。但是有没有办法通过 CODE PIPELINE 做到这一点?

更新-尝试了无服务器方法

基本上,我使用两个独立运行的不同运行时(例如Nodejs,Python)运行两个构建动作。因此,当我使用无服务器方法时,每个构建都将创建一个带有bucketuri的codeuri的template-export.yml文件,这意味着我将拥有two template-export.yml filesServerless方法的一个问题是必须create changeset然后触发Execute changeset。因此,我需要merge those two template-export.yml files并运行此create changeset操作,然后执行execute changeset。但是我不知道是否有命令来合并两个SAM templates。否则,一个template-export.yml堆栈将替换其他template-export.yml堆栈。

感谢任何帮助 谢谢

2 个答案:

答案 0 :(得分:0)

这里有有关通过CodePipeline和CloudFormation部署多个Lambda函数的文档:https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html

我相信这仍然会将功能代码上传到S3,但是它将利用AWS工具简化此过程。

答案 1 :(得分:0)

如果我对您的理解正确,则只需要将S3存储桶和密钥传送到Lambda CF模板中即可。为此,我在管道中使用了ParameterOverrides声明。

从本质上讲,管道是一个单独的堆栈,它拾取位于我的源根目录中的CF模板。然后,它将覆盖该模板中的两个参数,这些参数将其指向相应的S3存储桶/键。

        - Name: LambdaDeploy
          Actions:
          - Name: CreateUpdateLambda
          ActionTypeId:
            Category: Deploy
            Owner: AWS
            Provider: CloudFormation
            Version: 1
          Configuration:
            ActionMode: CREATE_UPDATE
            Capabilities: CAPABILITY_IAM
            RoleArn: !GetAtt CloudFormationRole.Arn
            StackName: !Join
              - ''
              - - Fn::ImportValue: !Sub '${CoreStack}ProjectName'
                - !Sub '${ModuleName}-app'
            TemplatePath: SourceOut::cfn-lambda.yml
            ParameterOverrides: '{ "DeploymentBucketName" : { "Fn::GetArtifactAtt" : ["BuildOut", "BucketName"]}, "DeploymentPackageKey": {"Fn::GetArtifactAtt": ["BuildOut", "ObjectKey"]}}'

现在,您拥有15个Lambda函数的事实可能会给您带来麻烦。为此,我没有确切的答案,因为我实际上是在尝试做完全相同的事情,并以这种方式打包多个Lambda。