簡體   English   中英

如果不存在,CDK 創建資源 - typescript

[英]CDK create resource if does not exist - typescript

在我的 CDK 項目中創建了一個 dynamoDB 表。 這很好,它由項目中創建的 lambda 使用。 我們需要刪除堆棧,這也很好,因為我們在表上將 retain resource 設置為 true。

現在,當我嘗試全新部署時,我們得到表已存在的錯誤並且堆棧回滾。 我需要僅在表不存在時才創建表的代碼。

這是表的基本創建,我找不到任何關於這個問題的文檔,甚至找不到可以捕獲的異常,也找不到拋出的異常類型,因為我們只在 AWS 上的 cloudformation 控制台中看到日志安慰。

 const dynamoTable = new Table(this, "my-table", {
      tableName: StackConfiguration.tableName,
      partitionKey: { name: "id", type: AttributeType.STRING },
    });

不幸的是,您不能在 CDK 中執行此操作,因為 CDK 在編譯時而非運行時生成 CloudFormation 模板。 我在這里看到幾個選項:

  1. 使用CloudFormation Resource Import將現有表導入您的堆棧
  2. 使用自定義資源 lambda 執行 AWS API 調用以檢查表是否存在。 使用CDK代碼中Fn.conditionEquals中的Custom resource output有條件地建表

如果這是您需要做的一次性事情,我建議您選擇第一個選項;如果您希望這種情況經常發生,我建議您使用選項 2。

這不是一個很好的答案,而是一種解決方法,我將它留在這里以防它可能對某人有用,但我們可以將表創建添加到我們代碼中的 try catch 中,我只是捕獲了一般異常而不是特定異常如果有人在這里捕獲正確的異常,我會很感興趣。 這意味着堆棧將部署。

 try {
     const dynamoTable = new Table(this, "my-table", {
      tableName: StackConfiguration.tableName,
      partitionKey: { name: "id", type: AttributeType.STRING },
    });
    
      return dynamoReplayTable;
    } catch (e) {
      return;
    }

如果您想使用該表,那么在您的代碼中,您將需要引用 ARN 而不是表變量名稱,否則您可以在 catch 塊中從名稱進行一些導入。 但我發現的最佳解決方案是將表放在單獨的堆棧中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM