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

用例

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

作为临时解决方法

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

有没有办法通过 Codepipeline 来完成这一步?

我对 CodeBuild 的假设

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

我的尝试

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

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

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

基本上,我使用两个独立运行的不同运行时(即 Nodejs、Python)运行两个构建操作。因此,当我使用无服务器方法时,每个构建都会创建一个 template-export.yml 文件,其中 codeuri 为 bucketlocation ,这意味着我将拥有 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-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` 阶段包含值 SourceOut 和 Buildout,因为您在 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
    相关资源
    最近更新 更多