(args []string)
| 187 | } |
| 188 | |
| 189 | func handleCreate(args []string) { |
| 190 | createCmd := flag.NewFlagSet("create", flag.ExitOnError) |
| 191 | |
| 192 | stateBucketName := createCmd.String("state-bucket-name", "", "Nome do bucket S3 para o estado (Obrigatório se não usar Pulumi Cloud).") |
| 193 | clusterName := createCmd.String("name", "prod-eks", "Identificador único do Cluster (Stack Name).") |
| 194 | awsRegion := createCmd.String("region", "us-east-1", "Região da AWS.") |
| 195 | k8sVersion := createCmd.String("k8s-version", "1.31", "Versão do Kubernetes.") |
| 196 | |
| 197 | nodeType := createCmd.String("node-type", "t3.medium", "Tipo da instância para os nós.") |
| 198 | minNodes := createCmd.Int("min-nodes", 2, "Número mínimo de nós.") |
| 199 | maxNodes := createCmd.Int("max-nodes", 5, "Número máximo de nós.") |
| 200 | useSpot := createCmd.Bool("use-spot", false, "Usar instâncias Spot para economizar custos.") |
| 201 | |
| 202 | vpcID := createCmd.String("vpc-id", "", "ID de uma VPC existente. Se vazio, cria uma nova.") |
| 203 | privSubnets := createCmd.String("private-subnets", "", "Lista de IDs de subnets privadas (separadas por vírgula).") |
| 204 | pubSubnets := createCmd.String("public-subnets", "", "Lista de IDs de subnets públicas (separadas por vírgula).") |
| 205 | extraRules := createCmd.String("extra-ingress-rules", "", "Regras extras de SG (ex: '8080:0.0.0.0/0').") |
| 206 | |
| 207 | withLB := createCmd.Bool("with-lb-controller", true, "Instalar AWS Load Balancer Controller.") |
| 208 | withNginx := createCmd.Bool("with-nginx", false, "Instalar Nginx Ingress Controller.") |
| 209 | withArgo := createCmd.Bool("with-argocd", false, "Instalar ArgoCD.") |
| 210 | withIstio := createCmd.Bool("with-istio", false, "Instalar Istio Service Mesh.") |
| 211 | withIstioObservability := createCmd.Bool("with-istio-observability", false, "Instalar pilha de observabilidade do Istio (Kiali, Prometheus, Grafana). Requer --with-istio.") |
| 212 | withIstioTracing := createCmd.Bool("with-istio-tracing", false, "Instalar Jaeger para tracing distribuído com Istio. Requer --with-istio-observability.") |
| 213 | |
| 214 | withCertManager := createCmd.Bool("with-cert-manager", false, "Instalar Cert-Manager.") |
| 215 | argocdDomain := createCmd.String("argocd-domain", "", "Domínio para ArgoCD (ex: argocd.example.com).") |
| 216 | certManagerEmail := createCmd.String("cert-manager-email", "", "Email para Let's Encrypt (obrigatório se usar cert-manager).") |
| 217 | acmeServer := createCmd.String("acme-server", "production", "Servidor ACME: 'production' ou 'staging' (aplica-se ao provedor escolhido).") |
| 218 | acmeEabKid := createCmd.String("acme-eab-kid", "", "EAB KeyID (obrigatório para --acme-provider=google)") |
| 219 | acmeEabHmac := createCmd.String("acme-eab-hmac", "", "EAB HMAC key (obrigatório para --acme-provider=google)") |
| 220 | acmeEabAlg := createCmd.String("acme-eab-key-alg", "HS256", "Algoritmo do EAB: HS256|HS384|HS512") |
| 221 | acmeEabSecretName := createCmd.String("acme-eab-secret-name", "acme-eab-secret", "Nome do Secret para armazenar o HMAC") |
| 222 | |
| 223 | baseDomain := createCmd.String("base-domain", "", "Domínio base para certificado wildcard.") |
| 224 | withExternalDNS := createCmd.Bool("with-external-dns", false, "Instalar External DNS (automação Route53).") |
| 225 | |
| 226 | refreshState := createCmd.Bool("refresh", true, "Validar estado real dos recursos antes de aplicar (recomendado).") |
| 227 | acmeProvider := createCmd.String("acme-provider", "letsencrypt", "Provedor ACME: 'letsencrypt' ou 'google' (Google Trust Services).") |
| 228 | |
| 229 | secretsProvider := createCmd.String("secrets-provider", "awskms", "Provider de criptografia para secrets pulumi: 'passphrase' (local), 'awskms' (recomendado).") |
| 230 | kmsKeyID := createCmd.String("kms-key-id", "", "ID da chave KMS para criptografia (obrigatório se secrets-provider=awskms). Formato: 'arn:aws:kms:REGION:ACCOUNT:key/KEY-ID' ou 'alias/key-alias'.") |
| 231 | configPassphrase := createCmd.String("config-passphrase", "", "Passphrase para criptografia local de secrets (obrigatório se secrets-provider=passphrase). Alternativamente use PULUMI_CONFIG_PASSPHRASE env var.") |
| 232 | |
| 233 | kmsAction := createCmd.String("kms-action", "reuse", "Ação se KMS já existe: 'reuse' (padrão), 'fail', 'rotate'") |
| 234 | |
| 235 | if err := createCmd.Parse(args); err != nil { |
| 236 | os.Exit(1) |
| 237 | } |
| 238 | |
| 239 | // Escolha do backend |
| 240 | var backendURL string |
| 241 | if *stateBucketName != "" { |
| 242 | // S3 + Dynamo lock (explícito) |
| 243 | fmt.Fprintln(os.Stderr, "\n--- Fase de Bootstrap do Backend de Estado (S3) ---") |
| 244 | awsClients, err := aws_bootstrap.NewAWSClients(context.Background(), *awsRegion) |
| 245 | if err != nil { |
| 246 | fmt.Fprintf(os.Stderr, "❌ Erro ao inicializar clientes AWS: %v\n", err) |
no test coverage detected