使用 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。 在云概览 部分的项目信息 卡片中查找项目 ID 字段。

  • project_number 或 tenant_project_number:与 project_id 类似,此变量表示 Google Cloud 项目 编号。您可以互换使用 project_number 或 tenant_project_number 。

    您可以在 Google Cloud 控制台 信息中心页面的云概览 部分的项目信息 卡片中找到项目编号以及项目 ID。

  • actuation_sa:此变量表示 执行服务账号 的电子邮件地址。此服务帐号是用户管理的服务帐号,App Lifecycle Manager 在预配、更新或取消预配单元时使用此账号(通过 Infrastructure Manager)来执行 Terraform 配置。

    我们建议您为每个租户(或单元)使用专用的执行服务帐号,以实现最小权限原则。这样可以限制安全漏洞的潜在影响,并更好地隔离部署。

    如需详细了解如何配置执行 服务账号和向其授予权限,请参阅产品概览。

单元变量层次结构

单元变量可以从多个位置定义和获取。使用 App Lifecycle Manager 时,务必了解单元操作期间使用的变量值的层次结构。

顺序如下(从 最低 到 最高 优先级):

App Lifecycle Manager 会按以下顺序解析变量值:

  1. 单元上的现有输入变量:如果变量已在 单元资源本身上定义(例如,来自之前的操作或配置),则 此值的优先级 最低。如果直接在单元上设置了变量值,则当从层次结构中更高的来源找到值时,该值将被替换。

  2. 版本默认值:如果变量尚未在单元上设置,则应用版本默认值,但这些值将 替换 现有单元变量。

  3. 单元操作:当您执行 单元操作 例如 provision 或 upgrade 时,您可以明确提供输入变量作为 操作请求的一部分。在单元操作中提供的变量将 替换 版本默认值和现有单元变量。

  4. 依赖项的输入变量映射:当单元依赖于 其他单元时,在单元种类中定义的变量映射可以从依赖项单元的输出变量获取变量 值。这是 最高 优先级来源。通过依赖项映射获取的变量将 替换 单元操作、版本默认值和现有单元变量中的值。

这种分层方法可让您灵活地控制变量管理。您可以直接在单元上建立持久配置(最低优先级),使用版本定义基准默认值,为特定操作进行自定义,并从单元依赖项中动态获取最重要和替换的值(最高优先级)。

单元依赖项

借助 App Lifecycle Manager,您可以定义单元之间的依赖关系。这对于构建复杂的 SaaS 应用非常重要,因为不同的组件相互依赖。依赖项可确保以协调的方式预配和管理相关单元。

您可以在单元种类中定义依赖项。当您创建特定单元种类的单元时,App Lifecycle Manager 会自动管理其依赖项。

单元种类中的依赖项定义

在 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];
    }
    

    在提供的 Codelab 示例中,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];
    }
    

    在 Codelab 中,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。

后续步骤