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

How to deploy multiple Lambda's in CFN Template through Codepipeline?

用例

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

临时解决方法

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

Is there any way possible to do this step via Codepipeline ?

我对 CodeBuild 的假设

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

我试过的

我知道只要你给 git push 一个 codecommit 它就会让你在 S3 中编写代码。所以我想的是从 codecommit 推送的文件中获取 S3BucketNameS3KeyName 并将这些参数传递给我的 CFN 模板。我可以得到 S3BucketNameS3KeyName 我不知道如何得到它?我不知道这个尝试过的方法是否可行?

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

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

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

感谢任何帮助 谢谢

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

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

如果我没理解错的话,您只需要将 S3 存储桶和密钥通过管道传输到您的 Lambda CF 模板中。为此,我在管道中使用了 ParameterOverrides 声明。

本质上,管道是一个单独的堆栈,并选择位于我源代码根目录中的 CF 模板。然后它覆盖该模板中的两个参数,将其指向适当的 S3 bucket/key.

        - 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 函数的事实可能会给它带来麻烦。为此我没有确切的答案,因为我实际上正在尝试做完全相同的事情并以这种方式打包多个 Lambdas。