使用 App Lifecycle Manager 進行變數和變數對應

本文說明 App Lifecycle Manager 中的變數、變數對應和依附元件運作方式。

App Lifecycle Manager 可讓您將複雜的 SaaS 應用程式整理成模組化單元,以便部署及管理。這些單元由藍圖中的 Terraform 設定定義,可透過依附元件相互連結,實現複雜的自動化調度管理和自動佈建。管理這些單元及其互動的重要方式,是透過變數和變數對應。

您可以透過自動佈建、單元間通訊和彈性設定選項,建構複雜、模組化且可擴充的部署作業。請仔細考量變數階層、依附元件關係和變數對應,在 App Lifecycle Manager 中最佳化 SaaS 架構和管理工作流程。

單位和變數

App Lifecycle Manager 的核心是單元。單元會利用變數自訂部署和行為。這些變數基本上是 Terraform 變數,您可以在藍圖的 variables.tf 檔案中定義。您可以將 Terraform 設定參數化,以便在不同環境和部署作業中重複使用及調整。

佈建單元的必要變數

您可以為單元定義自訂變數,但 App Lifecycle Manager 也會使用一組必要變數。即使未在 Terraform 設定中明確定義,App Lifecycle Manager 也會自動辨識及處理這些變數。

必要變數如下:

  • project_id 和 project_number (或 tenant_project_id 和 tenant_project_number):這個變數指定要部署單位資源的 Google Cloud 專案 ID。您可以使用 project_id 和 project_number,或 tenant_id 和 tenant_project_number。必須填寫這個欄位,才能在正確的 Google Cloud 專案中建立及管理資源。

    您可以在 Google Cloud 控制台的「Dashboard」(資訊主頁) 頁面找到專案 ID。在「Cloud overview」(Cloud 總覽) 區段的「Project info」(專案資訊) 資訊卡中,找出「Project ID」(專案 ID) 欄位。

  • project_number 或 tenant_project_number:與 project_id 類似,這個變數代表 Google Cloud 專案編號。project_number 和 tenant_project_number 可以交替使用。

    在 Google Cloud 控制台資訊主頁的「Cloud overview」(Cloud 總覽) 部分,您可以在「Project info」(專案資訊) 資訊卡中找到專案編號和專案 ID。

  • actuation_sa:這個變數代表 啟動服務帳戶的電子郵件地址。這個服務帳戶由使用者自行管理,App Lifecycle Manager 會透過 Infrastructure Manager 使用這個帳戶,在佈建、更新或取消佈建單元時執行 Terraform 設定。

    建議您為每個租戶 (或單位) 使用專屬的執行服務帳戶,以落實最小權限原則。這可限制安全性漏洞的潛在影響,並在部署項目之間提供更完善的隔離。

    如要進一步瞭解如何設定及授予啟動用服務帳戶權限,請參閱「App Lifecycle Manager 服務帳戶」。

單位變數階層

您可以定義單元變數,並從多個位置取得。使用 App Lifecycle Manager 時,請務必瞭解單元作業期間使用的變數值階層。

順序如下 (優先順序由低至高):

App Lifecycle Manager 會按照下列順序解析變數值:

  1. 單元現有的輸入變數:如果變數已在單元資源本身定義 (例如來自先前的作業或設定),則這個值的優先順序最低。如果直接在單位上設定變數值,系統會從階層中較高的來源尋找值,並覆寫該值。

  2. 版本預設值:如果單元尚未設定變數,系統會套用版本預設值,但會覆寫現有的單元變數。

  3. 單元作業:執行單元作業 (例如 provision 或 upgrade) 時,您可以明確提供輸入變數,做為作業要求的一部分。在單元作業中提供的變數會覆寫版本預設值和現有單元變數。

  4. 依附元件的輸入變數對應:如果單元依附於其他單元,單元 kind 中定義的變數對應可以從依附元件單元的輸出變數中,取得變數值。這是優先順序最高的來源。透過依附元件對應取得的變數,會覆寫單元作業、版本預設值和現有單元變數的值。

這種階層式方法可讓您靈活控管變數管理作業。您可以直接在單元上建立永久設定 (優先順序最低)、使用版本定義基準預設值、針對特定作業進行自訂,以及從單元依附元件動態取得最重要且覆寫的值 (優先順序最高)。

單元依附元件

App Lifecycle Manager 可讓您定義單元之間的依附關係。這對於建構複雜的 SaaS 應用程式 (其中不同元件彼此依賴) 非常重要。依附元件可確保相關單元以協調的方式佈建及管理。

您可以在單元 kind 中定義依附元件。建立特定類型的單元時,App Lifecycle Manager 會自動管理其依附元件。

單元 kind 中的依附元件定義

在 UnitKind 定義中,您會指定依附元件清單,每個依附元件都會參照另一個 UnitKind,並指派「別名」。這個別名用於在變數對應中參照依附元件:

  message UnitKind {
    // ... other fields ...

    // List of other unit kinds that this release will depend on.
    repeated Dependency dependencies = 4
        [(.google.api.field_behavior) = OPTIONAL];
    // ...
  }

  message Dependency {
    // The unit kind of the dependency.
    string unit_kind = 1 [
      (.google.api.field_behavior) = REQUIRED,
      (.google.api.field_behavior) = IMMUTABLE,
      (.google.api.resource_reference) = {
        type: "saasservicemgmt.googleapis.com/UnitKind"
      }
    ];

    // An alias for the dependency. Used for input variable mapping.
    string alias = 2 [(.google.api.field_behavior) = REQUIRED];
  }

自動佈建依附元件

當您要求佈建在 UnitKind 中定義依附元件的單元時,App Lifecycle Manager 會自動檢查這些依附元件單元是否存在。

如果找不到依附元件單元,App Lifecycle Manager 會先自動佈建該單元,再佈建依附單元。

App Lifecycle Manager 會確保依附元件單元先於依附元件單元佈建,以維持正確的作業順序。

變數對應

變數對應機制用於在依附元件和依附元件之間傳遞資料 (變數值)。這項功能非常重要,可讓您根據依附元件的輸出內容,設定依附單元。

變數對應是在依附單位種類中定義,並使用 FromMapping 和 ToMapping:

  • FromMapping:FromMapping 用於從依附元件單元擷取輸出變數,並將其對應至依附單元的輸入變數。這樣一來,依附元件單元就能從其依附元件取得資訊,例如連線端點或資源 ID。

    message VariableMapping {
      // ...
      oneof mapping_type {
        // Output variables which will get their values from dependencies
        FromMapping from = 2 [(.google.api.field_behavior) = OPTIONAL];
        // ...
      }
    }
    
    message FromMapping {
      // Alias of the dependency that the outputVariable will pass its value to
      string dependency = 1 [(.google.api.field_behavior) = REQUIRED];
    
      // Name of the outputVariable on the dependency
      string output_variable = 2 [(.google.api.field_behavior) = REQUIRED];
    }
    

    在提供的程式碼實驗室範例中,App UnitKind 具有 FromMapping,可從 Cluster UnitKind 依附元件擷取 cluster_endpoint 輸出變數。這樣一來,應用程式就能連線至新佈建的 Kubernetes 叢集。

  • ToMapping:ToMapping 用於將輸入變數從依附元件傳遞至依附元件的輸入變數。這樣一來,您就能根據依附元件提供的參數,設定依附元件。

    message VariableMapping {
      // ...
      oneof mapping_type {
        // ...
        // Input variables whose values will be passed on to dependencies.
        ToMapping to = 3 [(.google.api.field_behavior) = OPTIONAL];
      }
    }
    
    message ToMapping {
      // Alias of the dependency that the inputVariable will pass its value to
      string dependency = 1 [(.google.api.field_behavior) = REQUIRED];
    
      // Name of the inputVariable on the dependency
      string input_variable = 2 [(.google.api.field_behavior) = REQUIRED];
    
      // Tells EasySaaS if this mapping should be used during lookup or not
      bool ignore_for_lookup = 3 [(.google.api.field_behavior) = OPTIONAL];
    }
    

    在程式碼實驗室中,App UnitKind 會使用 ToMapping 將 tenant_project_id 和 tenant_project_number 輸入變數傳遞至 Cluster UnitKind 依附元件。確保 Kubernetes 叢集是在正確的專案中建立。

  • ToMapping 中的 ignore_for_lookup:ToMapping 中的 ignore_for_lookup 欄位可控制依附元件查詢行為。這是一個布林值:

    • false (或未指定):設為 false 時,App Lifecycle Manager 會使用 ToMapping 中指定的輸入變數做為查詢鍵,尋找現有的依附元件單元。如果找到輸入變數相符的單元,就會重複使用該單元做為依附元件。如果找不到相符的單位,系統會佈建新的依附元件單位。這項功能很實用,可重複使用叢集等共用資源。
    • true:設為 true 時,ToMapping 中的輸入變數不會用於依附元件查詢。這表示即使已有輸入變數相同的依附元件單元,系統仍會佈建新的依附元件單元。如果需要為每個依附元件單元提供專屬、非共用的依附元件,這項功能就非常實用。

範例:共用 Kubernetes 叢集

如要將 Kubernetes 叢集重複用於同一專案中的多個應用程式單位,請使用 ToMapping,並將 ignore_for_lookup 設為 false,然後將 tenant_project_id 和 region 等變數對應至叢集單位種類。相同專案和區域中的單元會重複使用同一個叢集。

範例:每個應用程式都有專屬 Kubernetes 叢集

如果您需要為每個應用程式單位建立專屬的 Kubernetes 叢集,請使用 ToMapping,並將 ignore_for_lookup 設為 true,或完全避免使用 ToMapping 查詢變數。每個應用程式單元都會觸發新的獨立 Kubernetes 叢集佈建作業。

管理密鑰

App Lifecycle Manager 變數不適合用來儲存密碼、API 金鑰或憑證等機密資訊。直接將密鑰儲存在變數中會帶來安全風險。變數值可能會記錄下來,並透過系統輸出內容公開,增加未經授權存取的機會。

如要在 App Lifecycle Manager 應用程式中安全管理 Secret,強烈建議您使用 Secret Manager。

後續步驟