我有一个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一起定位。我觉得没有这个,仍然应该有可能。
我想念什么?
我可以使用new CfnParametersCode
来执行此操作(这应该等效于您要调用的工厂方法)。您是否可能在另一个构造中而不是在堆栈级别上创建它?