Este documento explica como variáveis, mapeamento de variáveis e dependências funcionam no ambiente de execução de SaaS.
O ambiente de execução de SaaS permite implantar e gerenciar aplicativos SaaS complexos organizando-os em unidades modulares. Essas unidades, definidas por configurações do Terraform em blueprints, podem ser interconectadas por dependências, permitindo uma orquestração sofisticada e um provisionamento automatizado. Um aspecto importante do gerenciamento dessas unidades e das interações delas é o uso de variáveis e mapeamento de variáveis.
É possível criar implantações complexas, modulares e escalonáveis com provisionamento automatizado, comunicação entre unidades e opções de configuração flexíveis. Considere cuidadosamente a hierarquia de variáveis, as relações de dependência e os mapeamentos de variáveis para otimizar a arquitetura de SaaS e os fluxos de trabalho de gerenciamento no ambiente de execução do SaaS.
Unidades e variáveis
No centro do ambiente de execução de SaaS estão as unidades. As unidades usam variáveis para personalizar a implantação e o comportamento. Essas variáveis são
essencialmente variáveis do Terraform que podem ser definidas no arquivo
variables.tf do blueprint. Elas permitem parametrizar as configurações do Terraform, tornando-as reutilizáveis e adaptáveis em diferentes ambientes e implantações.
Variáveis obrigatórias para provisionamento de unidades
Embora seja possível definir variáveis personalizadas para suas unidades, o ambiente de execução do SaaS também depende de um conjunto de variáveis obrigatórias. Essas variáveis são reconhecidas e processadas automaticamente pelo ambiente de execução do SaaS, mesmo que não estejam definidas explicitamente na configuração do Terraform.
As variáveis obrigatórias são:
project_ideproject_number(outenant_project_idetenant_project_id): essa variável especifica o ID do projeto Google Cloud em que os recursos da unidade serão implantados. É possível usarproject_ideproject_numberoutenant_idetenant_project_id. Esse campo é necessário para a criação e o gerenciamento de recursos no projeto Google Cloud correto.Encontre o ID do projeto no console Google Cloud na página "Painel". Procure o campo ID do projeto no card Informações do projeto na seção Visão geral do Cloud.
project_numberoutenant_project_number: semelhante aproject_id, essa variável representa o número do projeto Google Cloud . É possível usarproject_numberoutenant_project_numberde forma intercambiável.O número do projeto está ao lado do ID do projeto no card Informações do projeto, na seção Visão geral do Cloud da página do painel do Google Cloud console.
actuation_sa: essa variável representa o endereço de e-mail da conta de serviço de ação. Essa conta de serviço é gerenciada pelo usuário e usada pelo ambiente de execução do SaaS (via Gerente de infraestrutura) para executar suas configurações do Terraform ao provisionar, atualizar ou desprovisionar unidades.Recomendamos que você use uma conta de serviço de ativação dedicada por locatário (ou unidade) para implementar o princípio de privilégio mínimo. Isso limita o impacto potencial de violações de segurança e oferece um isolamento melhor entre as implantações.
Para mais informações sobre como configurar e conceder permissões a contas de serviço de ativação, consulte Visão geral do produto.
Hierarquia de variáveis de unidade
As variáveis de unidade podem ser definidas e originadas de vários locais. Ao usar o ambiente de execução do SaaS, é importante entender a hierarquia dos valores de variáveis usados durante as operações de unidade.
A ordem é a seguinte (da prioridade mais baixa à mais alta):
O ambiente de execução de SaaS resolve os valores das variáveis nesta ordem:
Variáveis de entrada atuais na unidade: se uma variável já estiver definida no recurso da unidade (de uma operação ou configuração anterior, por exemplo), esse valor terá a menor precedência. Se um valor de variável for definido diretamente na unidade, ele será substituído se um valor for encontrado em fontes mais altas na hierarquia.
Padrões de lançamento: os valores padrão de lançamento são aplicados se uma variável ainda não estiver definida na unidade, mas substituem as variáveis de unidade atuais.
Operações de unidade: ao realizar uma operação de unidade, como
provisionouupgrade, é possível fornecer explicitamente variáveis de entrada como parte da solicitação de operação. As variáveis fornecidas em uma operação de unidade substituem os padrões de lançamento e as variáveis de unidade atuais.Mapeamentos de variáveis de entrada de dependências: quando uma unidade tem dependências de outras unidades, os mapeamentos de variáveis definidos no tipo de unidade podem originar valores de variáveis das variáveis de saída das unidades de dependência. Essa é a fonte de precedência mais alta. As variáveis obtidas por mapeamentos de dependência vão substituir os valores das operações de unidade, os padrões de lançamento e as variáveis de unidade atuais.
Essa abordagem hierárquica oferece flexibilidade e controle sobre o gerenciamento de variáveis. É possível estabelecer configurações persistentes diretamente na unidade (prioridade mais baixa), definir padrões de base usando versões, personalizar para operações específicas e buscar dinamicamente os valores mais importantes e substitutos das dependências da unidade (prioridade mais alta).
Dependências da unidade
O ambiente de execução de SaaS permite definir dependências entre unidades. Isso é importante para criar aplicativos SaaS complexos em que diferentes componentes dependem uns dos outros. As dependências garantem que as unidades relacionadas sejam provisionadas e gerenciadas de maneira coordenada.
Você define dependências em um tipo de unidade. Quando você cria uma unidade de um tipo específico, o ambiente de execução de SaaS gerencia automaticamente as dependências dela.
Definição de dependência no tipo de unidade
Na definição de UnitKind, você especifica uma lista de dependências, cada uma
referenciando outro UnitKind e atribuindo a ele um alias. Esse alias é usado
para referenciar a dependência em mapeamentos de variáveis:
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];
}
Provisionamento automático de dependências
Quando você solicita o provisionamento de uma unidade com dependências definidas no
UnitKind, o ambiente de execução do SaaS verifica automaticamente a existência dessas unidades de dependência.
Se uma unidade de dependência não for encontrada, o ambiente de execução do SaaS vai provisioná-la automaticamente antes de provisionar a unidade dependente.
O ambiente de execução de SaaS garante que as unidades de dependência sejam provisionadas antes das unidades dependentes, mantendo a ordem correta das operações.
Mapeamento de variáveis
O mapeamento de variáveis é o mecanismo para transmitir dados (valores de variáveis) entre unidades dependentes e as dependências delas. Isso é essencial para configurar unidades dependentes com base nas saídas das dependências.
O mapeamento de variáveis é definido no tipo de unidade dependente e usa
FromMapping e ToMapping:
FromMapping:FromMappingé usado para extrair variáveis de saída de uma unidade de dependência e mapeá-las para variáveis de entrada da unidade dependente. É assim que uma unidade dependente pode receber informações das dependências dela, como endpoints de conexão ou IDs de recursos.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]; }No exemplo de codelab fornecido, o
App UnitKindtem umFromMappingpara recuperar a variável de saídacluster_endpointda dependênciaCluster UnitKind. Isso permite que o aplicativo se conecte ao cluster do Kubernetes recém-provisionado.ToMapping:ToMappingé usado para transmitir variáveis de entrada da unidade dependente para as variáveis de entrada de uma unidade de dependência. Isso permite configurar unidades de dependência com base em parâmetros fornecidos para a unidade dependente.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]; }No codelab, o
App UnitKindusaToMappingpara transmitir as variáveis de entradatenant_project_idetenant_project_numberà dependênciaCluster UnitKind. Isso garante que o cluster do Kubernetes seja criado no projeto correto.ignore_for_lookupemToMapping: o campoignore_for_lookupemToMappingcontrola o comportamento de pesquisa de dependências. É um valor booleano:false(ou não especificado): quando definido comofalse, o ambiente de execução do SaaS usa as variáveis de entrada especificadas noToMappingcomo chaves de pesquisa para encontrar uma unidade de dependência existente. Se uma unidade com variáveis de entrada correspondentes for encontrada, ela será reutilizada como a dependência. Se nenhuma unidade correspondente for encontrada, uma nova unidade de dependência será provisionada. Isso é útil para reutilizar recursos compartilhados, como clusters.true: quando definido comotrue, a variável de entrada emToMappingnão será usada para pesquisa de dependência. Isso significa que uma nova unidade de dependência será sempre provisionada, mesmo que já existam unidades com as mesmas variáveis de entrada. Isso é útil quando você precisa de dependências dedicadas e não compartilhadas para cada unidade dependente.
Exemplo: cluster compartilhado do Kubernetes
Se você quiser reutilizar um cluster do Kubernetes para várias unidades de aplicativo no
mesmo projeto, use ToMapping com ignore_for_lookup definido como
false e mapeie variáveis como tenant_project_id e region para o tipo
de unidade de cluster. As unidades no mesmo projeto e região reutilizariam o mesmo cluster.
Exemplo: cluster dedicado do Kubernetes por aplicativo
Se você precisar de um cluster do Kubernetes dedicado para cada unidade de aplicativo, use ToMapping com ignore_for_lookup definido como true ou evite completamente as variáveis de pesquisa ToMapping. Cada unidade de aplicativo acionaria o
provisionamento de um novo cluster isolado do Kubernetes.
Gerenciar secrets
As variáveis do ambiente de execução do SaaS não são destinadas ao armazenamento de informações sensíveis, como senhas, chaves de API ou certificados. Armazenar secrets diretamente em variáveis apresenta riscos de segurança. Os valores das variáveis podem ser registrados e potencialmente expostos por saídas do sistema, aumentando a chance de acesso não autorizado.
Para um gerenciamento seguro de secrets nos seus aplicativos do ambiente de execução de SaaS, recomendamos usar o Secret Manager.
A seguir
- Para entender melhor o ambiente de execução de SaaS, consulte Visão geral do ambiente de execução de SaaS.
- Para fazer um tutorial, consulte Implantar uma VM com o ambiente de execução de SaaS.
- Para detalhes sobre como definir a oferta de SaaS com configurações do Terraform, consulte Blueprints no ambiente de execução do SaaS.