【问题标题】:CodePipeline, CodeBuild, CloudFormation, Lambda: build multiple lambdas in a single build and assign their code correctlyCodePipeline、CodeBuild、CloudFormation、Lambda:在单个构建中构建多个 lambda 并正确分配它们的代码
【发布时间】:2020-06-05 22:10:13
【问题描述】:

我有一个使用 AWS CDK 和 CodePipeline 构建的 CD 管道。它为 5 个 lambdas 编译代码,每个 lambdas 都推送到一个辅助工件。

每个工件的 S3 位置都分配给 CloudFormation 模板的参数,这些参数附加到 lambda 的 Code 部分。

这很好用!

我的问题是,我无法将第六个辅助工件添加到 CodeBuild(硬限制)。我也无法将我的所有 lambda 代码合并到一个工件中,因为(据我所知)CodePipeline 不够聪明,无法在将 Code 分配给 CloudFormation 中的 lambda 时查看工件内部。

从 CodeBuild/CodePipeline 部署多个 lambda 的建议是什么?其他人是如何解决这个问题的?

编辑:代码管道 CF 模板 注意:我只包含了 2 个 lambdas 作为示例

Lambda 应用程序模板

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "Lambda1": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Code": {
          "S3Bucket": {
            "Ref": "lambda1SourceBucketNameParameter3EE73025"
          },
          "S3Key": {
            "Ref": "lambda1SourceObjectKeyParameter326E8288"
          }
        }
      }
    },
    "Lambda2": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Code": {
          "S3Bucket": {
            "Ref": "lambda2SourceBucketNameParameter3EE73025"
          },
          "S3Key": {
            "Ref": "lambda2SourceObjectKeyParameter326E8288"
          }
        }
      }
    }
  },
  "Parameters": {
    "lambda1SourceBucketNameParameter3EE73025": {
      "Type": "String"
    },
    "lambda1SourceObjectKeyParameter326E8288": {
      "Type": "String"
    },
    "lambda2SourceBucketNameParameterA0D2319B": {
      "Type": "String"
    },
    "lambda2SourceObjectKeyParameterF3B3F2C2": {
      "Type": "String"
    }
  }
}

代码管道模板:

{
  "Resources": {
    "Pipeline40CE5EDC": {
      "Type": "AWS::CodePipeline::Pipeline",
      "Properties": {
        "Stages": [
          {
            "Actions": [
              {
                "ActionTypeId": {
                  "Provider": "CodeBuild"
                },
                "Name": "CDK_Build",
                "OutputArtifacts": [
                  {
                    "Name": "CdkbuildOutput"
                  }
                ],
                "RunOrder": 1
              },
              {
                "ActionTypeId": {
                  "Provider": "CodeBuild"
                },
                "Name": "Lambda_Build",
                "OutputArtifacts": [
                  { "Name": "CompiledLambdaCode1" },
                  { "Name": "CompiledLambdaCode2" }
                ],
                "RunOrder": 1
              }
            ],
            "Name": "Build"
          },
          {
            "Actions": [
              {
                "ActionTypeId": {
                  "Provider": "CloudFormation"
                },
                "Configuration": {
                  "StackName": "DeployLambdas",
                  "ParameterOverrides": "{\"lambda2SourceBucketNameParameterA0D2319B\":{\"Fn::GetArtifactAtt\":[\"CompiledLambdaCode1\",\"BucketName\"]},\"lambda2SourceObjectKeyParameterF3B3F2C2\":{\"Fn::GetArtifactAtt\":[\"CompiledLambdaCode1\",\"ObjectKey\"]},\"lambda1SourceBucketNameParameter3EE73025\":{\"Fn::GetArtifactAtt\":[\"CompiledLambdaCode2\",\"BucketName\"]},\"lambda1SourceObjectKeyParameter326E8288\":{\"Fn::GetArtifactAtt\":[\"CompiledLambdaCode2\",\"ObjectKey\"]}}",
                  "ActionMode": "CREATE_UPDATE",
                  "TemplatePath": "CdkbuildOutput::CFTemplate.template.json"
                },
                "InputArtifacts": [
                  { "Name": "CompiledLambdaCode1" },
                  { "Name": "CompiledLambdaCode2" },
                  { "Name": "CdkbuildOutput" }
                ],
                "Name": "Deploy",
                "RunOrder": 1
              }
            ],
            "Name": "Deploy"
          }
        ],
        "ArtifactStore": {
          "EncryptionKey": "the key",
          "Location": "the bucket",
          "Type": "S3"
        },
        "Name": "Pipeline"
      }
    }
  }
}

【问题讨论】:

  • 它们在不同的存储桶中吗?你不能把它们都放在一个神器商店里吗?
  • 同一个桶,同一个工件存储。我不明白这与这个问题有什么关系,你能解释一下吗?
  • 那么你达到极限的那 5 件文物是从哪里来的?
  • 直接来自代码构建。 “次要工件”
  • 你能澄清你的设计吗?您有:CP 源操作 -> 1 个 CB 构建操作创建 5 个 CFN lambda 模板 -> 5 个使用 CFN 提供程序部署操作,从模板创建 lambda(每个模板一个)?

标签: amazon-web-services aws-lambda amazon-cloudformation aws-codepipeline aws-codebuild


【解决方案1】:

审查过的模板。

因此,我没有看到 CodeBuild 操作的五个输入,但我看到 CloudFormation 操作(部署)的 2 个输入。

我假设您的问题是 CloudFormation 操作的输入限制为 5 个。这个假设正确吗?

CloudFormation 动作的限制实际上是 10。请参阅“工件的动作类型约束” "@https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#reference-action-artifacts

所以如果你最多可以使用 10 个,就足够了吗?

如果没有,我还有其他想法需要更长的时间来记录。

【讨论】:

  • 谢谢。是的,你的假设是正确的:)。在提供的文档中,它说 CF 有 10 个输入工件,但 CodeBuild 只有 5 个输出工件。我的目标是规划未来。在给定的域中,随着代码库的增长,我们可能有 20/30 的 lambda,所以我确保我们选择的基础设施能够长期支持这一点
  • 好的。好吧,如果您有超过 10 个,您的选择是将其中一些打包在一起。我在一个包中有 30 或 40 个,嵌套堆栈或自定义资源来解压缩主 zip。除此之外,你能把它标记为答案吗?
  • 当你在一个工件中打包(比如说)10 个 lambda 会发生什么?您如何在 CF 模板中分别引用它们?
  • 您应该能够通过处理程序引用它们中的每一个。或者多达 500 个,
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2017-07-14
  • 1970-01-01
  • 2020-05-02
  • 2022-11-08
  • 2020-09-07
相关资源
最近更新 更多