首页 > 解决方案 > 如何通过 Codepipeline 在 CFN 模板中部署多个 Lambda?

问题描述

用例

我有一个 cloudformation 堆栈,里面有超过 15 个 Lambda。我可以部署Codepipeline由两个阶段CodeCommitCodeDeploy. 在这种方法中,我所有的 lambda 代码都在 cloudformation 模板中(即内联代码)。出于安全考虑,我想将其更改InlineS3反过来需要S3BucketNameS3Key.

作为临时解决方法

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

有什么方法可以通过 Codepipeline 执行此步骤吗?

我对 CodeBuild 的假设

我知道我们可以使用CodeBuild它。但到目前为止我所看到CodeBuild的只是用于构建package.json文件。但在我的用例中,我没有任何 . 而且我还可以看到可以指定cloudformation package将我的 lambda 从本地包装到 S3 的命令,此命令将生成 S3 codeuri`,但这是针对将有单个 lambda 但在我的情况下有 15 个的无服务器应用程序。

我试过的

我知道,只要您给予它git pushcodecommit它就会让您在 S3 中保留代码。所以我想的是从 codecommit 推送文件中获取 and 并将这些参数传递给我的 CFN 模板S3BucketNameS3KeyName我可以得到,S3BucketNameS3KeyName我不知道如何得到?而且我不知道这种尝试过的方法是否可行?

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

更新——尝试过的无服务器方法

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

感谢任何帮助谢谢

标签: amazon-web-servicesaws-code-deployaws-codepipelineaws-codebuildaws-codecommit

解决方案


如果我的理解正确,您只需要将 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。


推荐阅读