如何在 CfnInclude 期间将(可选)参数直接从 CloudFormation 模板传递到 CDK 资源而不对参数列表进行硬编码?
How can I pass (optional) parameters directly from CloudFormation template to CDK resource during CfnInclude without hardcoding the parameter list?
这些语法有点新,所以不确定它是否可以实现。
所以我们编写了一堆 CloudFormation 模板,我们想通过 CDK 部署它们,所以我们编写代码来使用 CfnInclude
构建它们。问题是 CfnInclude
如果有参数,总是需要明确的 parameters
参数。
有没有办法以通用方式编写这些内容,这样我们就可以通过 CfnInclude
在所有 CF 模板的一个 for 循环中创建一大堆资源,每个模板可能有也可能没有参数和参数的数量和内容不同?因为否则,我将不得不为所有 CF 模板提供所有可能的参数,然后在 CfnInclude
.
期间将它们全部写出
实际参数的值是从另一个地方导出的,然后放在地图中,所以说我们总共知道这些 CF 模板可能需要来自以下列表的 0、1、2 或 3 个可能的参数:
let cfnParameters = {
"param1": value1,
"param2": value2,
"param3": value3,
};
那么我们能否以某种方式通过提供模板文件本身,以某种方式编写 CDK,使其计算出每个文件有多少参数和什么参数,然后通过从映射中查找来用适当的值替换它们(这样基本上我正在为每个不同的模板传递一个动态构造的 Parameters
列表)?似乎所有这些 getParameters
API 仅在 CfnInclude
已被调用后作为对象对已构建的 CF 模板进行操作?
而且我不认为我们可以在不传递 Parameters
参数的情况下先构造一个 CfnInclude
,然后执行 GetParameters
并以某种方式用实际值替换它们,对吗? Doc好像说Parameter Replacement只能在施工的时候做?
你是对的,CfnInclude
需要 parameters 属性中的右键,否则会抛出错误。没问题。在构建CfnInclude
之前,使用语言特性制作模板的参数替换映射。阅读模板文件。创建模板键和所需值的映射。将生成的地图传递给 CfnInclude
.
// MyTemplateIncluder.ts
// values we want to apply
const parameters = {
InstanceType: 'm1.large',
KeyName: 'my-key-name',
SSHLocation: '0.0.0.0/0',
AnotherKey: 'anotherValue',
};
// read the template
const templatePath = path.join(__dirname, 'template.json');
const file = fs.readFileSync(templatePath, 'utf-8');
const templateParams = JSON.parse(file)?.['Parameters'] ?? {};
// new object with keys from the template and values from parameters
const replacementParameters = Object.keys(templateParams).reduce((acc, curr) => {
acc[curr] = parameters[curr];
return acc;
}, {});
new include.CfnInclude(this, 'MyTemplate', {
templateFile: templatePath,
parameters: replacementParameters,
});
将此逻辑封装在可重用的 Construct
子类中。接受参数值和模板文件名作为道具。
这些语法有点新,所以不确定它是否可以实现。
所以我们编写了一堆 CloudFormation 模板,我们想通过 CDK 部署它们,所以我们编写代码来使用 CfnInclude
构建它们。问题是 CfnInclude
如果有参数,总是需要明确的 parameters
参数。
有没有办法以通用方式编写这些内容,这样我们就可以通过 CfnInclude
在所有 CF 模板的一个 for 循环中创建一大堆资源,每个模板可能有也可能没有参数和参数的数量和内容不同?因为否则,我将不得不为所有 CF 模板提供所有可能的参数,然后在 CfnInclude
.
实际参数的值是从另一个地方导出的,然后放在地图中,所以说我们总共知道这些 CF 模板可能需要来自以下列表的 0、1、2 或 3 个可能的参数:
let cfnParameters = {
"param1": value1,
"param2": value2,
"param3": value3,
};
那么我们能否以某种方式通过提供模板文件本身,以某种方式编写 CDK,使其计算出每个文件有多少参数和什么参数,然后通过从映射中查找来用适当的值替换它们(这样基本上我正在为每个不同的模板传递一个动态构造的 Parameters
列表)?似乎所有这些 getParameters
API 仅在 CfnInclude
已被调用后作为对象对已构建的 CF 模板进行操作?
而且我不认为我们可以在不传递 Parameters
参数的情况下先构造一个 CfnInclude
,然后执行 GetParameters
并以某种方式用实际值替换它们,对吗? Doc好像说Parameter Replacement只能在施工的时候做?
你是对的,CfnInclude
需要 parameters 属性中的右键,否则会抛出错误。没问题。在构建CfnInclude
之前,使用语言特性制作模板的参数替换映射。阅读模板文件。创建模板键和所需值的映射。将生成的地图传递给 CfnInclude
.
// MyTemplateIncluder.ts
// values we want to apply
const parameters = {
InstanceType: 'm1.large',
KeyName: 'my-key-name',
SSHLocation: '0.0.0.0/0',
AnotherKey: 'anotherValue',
};
// read the template
const templatePath = path.join(__dirname, 'template.json');
const file = fs.readFileSync(templatePath, 'utf-8');
const templateParams = JSON.parse(file)?.['Parameters'] ?? {};
// new object with keys from the template and values from parameters
const replacementParameters = Object.keys(templateParams).reduce((acc, curr) => {
acc[curr] = parameters[curr];
return acc;
}, {});
new include.CfnInclude(this, 'MyTemplate', {
templateFile: templatePath,
parameters: replacementParameters,
});
将此逻辑封装在可重用的 Construct
子类中。接受参数值和模板文件名作为道具。