amazon-web-services - 使用 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 deploy
CLI 时,它知道参数是什么并用值填充它们。
但是,就我而言,我没有使用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 放在一起。我觉得如果没有那个,这仍然是可能的。
我错过了什么?
解决方案
我可以做到这一点new CfnParametersCode
(这应该相当于你正在调用的工厂方法)。您是否可能在另一个构造中而不是在堆栈级别创建它?
推荐阅读
- python - PyTorch:损失保持不变
- progressive-web-apps - 移动设备上的 Phaser PWA 扩展问题
- azure - 在 Azure Databricks 中反序列化事件中心消息
- git - git 中提交的 sed/grep 标记
- c - gcc 编译器报告警告,但 a.out 工作顺利,否则
- hadoop - Cucumber-Hadoop:如何从 HDFS 位置读取黄瓜特征文件?
- c# - 使用 MIMEKIT 使用数字证书对纯文本文件进行签名和加密
- java - 在 Visual Studio Code 中启动 Java 语言服务器卡在 37%
- javascript - HTML5画布:角度> 2 PI的逆时针弧
- c++ - 基于返回类型的转换和过载扣除