簡體   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