使用CodePipeline和CDK生成的CloudFormation模板部署Lambda函数

问题描述 投票:0回答:1

我有一个Lambda函数,我正在尝试使用CodePipeline进行部署。

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

[当CDK应用程序可以直接引用Lambda代码时,文档建议使用lambda.Code.fromAsset(path),因此我从以下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 deploy时,CLI知道参数是什么,并使用值填充它们。

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

这意味着我需要用代码构建步骤输出的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确定。

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

[不幸的是,我无法像我在本示例中那样将我的CodePipeline定义与Lambda一起定位。我觉得没有这个,仍然应该有可能。

我想念什么?

amazon-web-services aws-lambda amazon-cloudformation aws-codepipeline aws-cdk
1个回答
0
投票

我可以使用new CfnParametersCode来执行此操作(这应该等效于您要调用的工厂方法)。您是否可能在另一个构造中而不是在堆栈级别上创建它?

© www.soinside.com 2019 - 2024. All rights reserved.