【问题标题】:How to deploy multiple Lambda's in CFN Template through Codepipeline?如何通过 Codepipeline 在 CFN 模板中部署多个 Lambda?
【发布时间】:2019-04-20 06:07:17
【问题描述】:

用例

我有一个 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 中。所以我想的是从codecommit推送文件中获取S3BucketNameS3KeyName并将这些参数传递给我的CFN模板。我可以得到S3BucketNameS3KeyName 我不知道如何得到它?而且我不知道这种尝试过的方法是否可行?

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

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

基本上,我使用两个独立运行的不同运行时(即 Nodejs、Python)运行两个构建操作。因此,当我使用无服务器方法时,每个构建都会创建一个 template-export.yml 文件,其中 codeuri 为 bucketlocation ,这意味着我将拥有 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 堆栈。

任何帮助表示赞赏 谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 伟大的@Guestie。我正在寻找同样的方法。不幸的是,这对我没有帮助。因为,我的每个 lambda 都需要外部依赖项,并且它们需要保存在同一个存储桶中但具有不同的 objectkey。我可以看到 codebuild 具有多个输出工件的选项,而不是我通过构建命令(即aws s3 cp ..)将我的 lambda 函数复制到 s3。感谢您的宝贵时间。
    • 顺便说一句,您需要在 InputArtifacts' key in Deploy` 阶段包含值 SourceOutBuildout,因为您在 Deploy 阶段使用这些值。然后只有你的部署堆栈会运行。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢@TimB 抽出宝贵时间。请检查我的问题的Update 部分。
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2023-03-11
    • 2017-07-14
    • 2020-03-05
    • 2013-02-24
    • 2019-11-09
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多