使用 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 控制台的資訊主頁找到專案 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」(雲端總覽) 部分中,找到「Project info」(專案資訊) 資訊卡,專案編號會顯示在專案 ID 旁邊。

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

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

    如要進一步瞭解如何設定及授予啟動服務帳戶的權限,請參閱「產品總覽」。

單位變數階層

您可以定義單元變數,並從多個位置取得。使用 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 Manager。

後續步驟