首页 > 解决方案 > 使用 CodePipeline 和 CDK 生成的 CloudFormation 模板部署 Lambda 函数

问题描述

我有一个尝试使用 CodePipeline 部署的 Lambda 函数。

Lambda 函数源代码与 Lambda CDK 应用程序位于同一项目中。由于它们都在同一个存储库中,因此 CDK 应用程序可以直接引用 Lambda 源代码。

文档建议lambda.Code.fromAsset(path)在 CDK 应用程序可以直接引用 Lambda 代码时使用,因此我从 Lambda 函数的以下定义开始。

const fn = new lambda.Function(this, "Fn", {
  code: lambda.Code.fromAsset(path/to/lambda/source),
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X
});

在 CodePipeline 中,我使用 CodeBuild 来运行cdk synth和合成 CloudFormation 模板。

以这种方式定义我的 Lambda 的问题是 CloudFormation 模板具有 Lambda 源代码存储桶和密钥的参数,这些参数似乎是随机命名的,例如AssetParameters3ffd...affdS3Bucket1CFF873D

当您运行cdk deployCLI 时,它知道参数是什么并用值填充它们。

但是,就我而言,我没有使用cdk deploy. 我想在 CodePipeline 中使用 CloudFormation。

这意味着我需要使用从我的 CodeBuild 步骤输出的 Lambda 源工件的值填充参数。获取值很容易,但我无法知道参数的名称。

接下来,我尝试使用以下内容自己定义参数名称。

const fn = new lambda.Function(this, "Fn", {
  code: lambda.Code.fromCfnParameters({
    bucketNameParam: new core_1.CfnParameter(this, "LambdaSourceBucket"),
    objectKeyParam: new core_1.CfnParameter(this, "LambdaSourceKey"),
  }),
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X
});

没运气。cdk synth仍然修改模板中的参数名称,例如AppLambdaSourceBucket8B89D730. 这比以前好,但我仍然不能确定参数将被命名,所以我可以在我的 CodePipeline 中分配它们。

我无法使用lambda.Code.fromBucket(bucket, key),因为存储桶和密钥由 CodePipeline/CodeBuild 确定。

我发现这个例子和我做的事情几乎一样,除了他们的 CodePipeline 和他们的 Lambda 函数在同一个 CDK 应用程序中定义。这避免了我遇到的问题,因为 Lambda 定义和 CodePipeline 定义都可以引用同一个CfnParametersCode实例。

不幸的是,我无法像他们在该示例中所做的那样将我的 CodePipeline 定义与我的 Lambda 放在一起。我觉得如果没有那个,这仍然是可能的。

我错过了什么?

标签: amazon-web-servicesaws-lambdaamazon-cloudformationaws-codepipelineaws-cdk

解决方案


我可以做到这一点new CfnParametersCode(这应该相当于你正在调用的工厂方法)。您是否可能在另一个构造中而不是在堆栈级别创建它?


推荐阅读