繁体   English   中英

如何在 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期间将它们全部写出。

实际参数的值是从另一个地方派生出来的,然后放在 map 中,所以说我们总共知道这些 CF 模板可能需要来自以下列表的 0、1、2 或 3 个可能的参数:

        let cfnParameters = {
            "param1": value1,
            "param2": value2,
            "param3": value3,
        };

那么我们能否以某种方式通过自己提供模板文件,以某种方式编写 CDK,使其计算出每个文件有多少参数和什么参数,然后通过从 map 中查找来用适当的值替换它们(这样基本上我就通过了每个不同模板的动态构造的Parameters列表)? 似乎所有这些getParameters CfnInclude仅在已调用 CfnInclude 之后作为 object 在已构建的 CF 模板上运行?

而且我不认为我们可以先构造一个CfnInclude而不传递Parameters参数,然后执行GetParameters并以某种方式用实际值替换它们,对吗? Doc好像说Parameter Replacement只能在构造时做?

你是对的, CfnInclude需要parameters prop 中的正确键,否则会抛出错误。 没问题。 在构造CfnInclude之前,使用语言特性将模板的参数替换为 map。 阅读模板文件。 创建模板键和所需值的 map。 将生成的 map 传递给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子类中。 接受参数值和模板文件名作为道具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM