Este documento fornece diretrizes e recomendações a ter em conta quando usar módulos do Terraform reutilizáveis.
Este guia não é uma introdução ao Terraform. Para uma introdução à utilização do Terraform com o Google Cloud, consulte o artigo Comece a usar o Terraform.
Ative as APIs necessárias nos módulos
Os módulos do Terraform podem ativar todos os serviços necessários através do recurso google_project_service
ou do módulo project_services
.
A inclusão da ativação da API facilita as demonstrações.
- Se a ativação da API estiver incluída num módulo, tem de ser possível desativá-la através da exposição de uma variável
enable_apis
que tenhatrue
como predefinição. Se a ativação da API estiver incluída num módulo, a ativação da API tem de definir
disable_services_on_destroy
comofalse
, porque este atributo pode causar problemas quando trabalha com várias instâncias do módulo.Por exemplo:
module "project-services" { source = "terraform-google-modules/project-factory/google//modules/project_services" version = "~> 12.0" project_id = var.project_id enable_apis = var.enable_apis activate_apis = [ "compute.googleapis.com", "pubsub.googleapis.com", ] disable_services_on_destroy = false }
Inclua um ficheiro de proprietários
Para todos os módulos partilhados, inclua um ficheiro
OWNERS
(ou
CODEOWNERS
no GitHub) que documente quem é responsável pelo módulo. Antes de qualquer pedido de obtenção ser unido, um proprietário deve aprová-lo.
Lance versões etiquetadas
Por vezes, os módulos requerem alterações significativas e tem de comunicar os efeitos aos utilizadores para que possam fixar as respetivas configurações a uma versão específica.
Certifique-se de que os módulos partilhados seguem a SemVer v2.0.0 quando são etiquetadas ou lançadas novas versões.
Quando fizer referência a um módulo, use uma restrição de versão para fixar a versão principal. Por exemplo:
module "gke" {
source = "terraform-google-modules/kubernetes-engine/google"
version = "~> 20.0"
}
Não configure fornecedores nem backends
Os módulos partilhados não podem configurar fornecedores nem back-ends. Em alternativa, configure fornecedores e backends em módulos de raiz.
Para módulos partilhados, defina as versões mínimas necessárias do fornecedor num bloco
required_providers
da seguinte forma:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = ">= 4.0.0"
}
}
}
Salvo prova em contrário, assuma que as novas versões do fornecedor vão funcionar.
Exponha as etiquetas como uma variável
Permitir flexibilidade na etiquetagem de recursos através da interface do módulo.
Considere fornecer uma variável labels
com um valor predefinido de um mapa vazio, da seguinte forma:
variable "labels" {
description = "A map of labels to apply to contained resources."
default = {}
type = "map"
}
Exponha as saídas de todos os recursos
As variáveis e as saídas permitem-lhe inferir dependências entre módulos e recursos. Sem saídas, os utilizadores não podem ordenar corretamente o seu módulo em relação às configurações do Terraform.
Para cada recurso definido num módulo partilhado, inclua, pelo menos, um resultado que faça referência ao recurso.
Use submódulos inline para lógica complexa
- Os módulos inline permitem-lhe organizar módulos complexos do Terraform em unidades mais pequenas e remover recursos comuns duplicados.
- Coloque módulos inline em
modules/$modulename
. - Trate os módulos inline como privados, não para serem usados por módulos externos, a menos que a documentação do módulo partilhado indique especificamente o contrário.
- O Terraform não acompanha os recursos refatorados. Se começar com vários recursos no módulo de nível superior e, em seguida, os transferir para submódulos, o Terraform tenta recriar todos os recursos refatorados. Para mitigar este comportamento, use blocos
moved
quando refatorar. - As saídas definidas por módulos internos não são expostas automaticamente. Para partilhar resultados de módulos internos, reexporte-os.
O que se segue?
- Saiba mais sobre as práticas recomendadas gerais de estilo e estrutura para o Terraform no Google Cloud.
- Saiba mais sobre as práticas recomendadas quando usar módulos raiz do Terraform.