# mfe-user - Pipeline Multi-Cloud ## Visão Geral O repositório `mfe-user` possui uma pipeline unificada que suporta deploy para **AWS** e **OCI** (Oracle Cloud Infrastructure). **Localização**: `C:\dev\C:devrepos_mfe\mfe-user\azure-pipelines.yml` **Branch**: `devops` --- ## Como Executar a Pipeline ### Opção 1: Push na branch devops ```bash cd mfe-user git checkout devops # fazer alterações git add . git commit -m "sua mensagem" git push origin devops ``` A pipeline dispara automaticamente. ### Opção 2: Executar manualmente 1. Acesse Azure DevOps → Pipelines 2. Selecione `mfe-user` 3. Clique em **Run pipeline** 4. Selecione branch `devops` 5. Escolha `cloudProvider`: - `aws` → Deploy AWS S3 - `oci` → Deploy OCI Object Storage + API Gateway - `both` → Ambos --- ## Fluxo da Pipeline ### Diagrama Completo ``` ┌──────────────────────────────────────────────────────────────┐ │ TRIGGER: Push na branch 'devops' │ └──────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ PARÂMETRO: cloudProvider │ │ ├── aws (padrão) │ │ ├── oci │ │ └── both │ └──────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ STAGE 1: BUILD (sempre executa) │ │ ├── Node.js 20.x │ │ ├── npm ci │ │ ├── npm run build:dev │ │ └── Publica artefato 'dist' │ └──────────────────────────────────────────────────────────────┘ │ ┌───────────────┴───────────────┐ ▼ ▼ ┌─────────────────────────┐ ┌─────────────────────────────┐ │ DEPLOY_AWS │ │ UPLOADTOOCI │ │ (se aws ou both) │ │ (se oci ou both) │ │ ├── Download artefato │ │ ├── Instala OCI CLI │ │ ├── Sync S3 │ │ ├── Cria bucket │ │ └── Purge Cloudflare │ │ └── Upload arquivos │ └─────────────────────────┘ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ CREATEPAR │ │ ├── Deleta PAR antigo │ │ └── Cria novo PAR (1 ano) │ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ DEPLOYTOAPIGATEWAY │ │ ├── Cria gateway │ │ └── Cria deployment │ └─────────────────────────────┘ ``` --- ## O que é Criado na OCI ### 1. Bucket (Object Storage) | Propriedade | Valor | |-------------|-------| | Nome | `mfe-user-dev` | | Namespace | `grbb7qzeuoag` | | Compartment | Dev (`ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a`) | | Storage Tier | Standard | ### 2. Pre-Authenticated Request (PAR) | Propriedade | Valor | |-------------|-------| | Nome | `mfe-user-dev-par` | | Access Type | ObjectRead | | Validade | 1 ano (31536000 segundos) | O PAR permite que o API Gateway acesse os arquivos do bucket sem autenticação. ### 3. API Gateway | Propriedade | Valor | |-------------|-------| | Nome | `mfe-user-gateway` | | Endpoint Type | PUBLIC | | Subnet | `sbn-lb-1` (`ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq`) | | Compartment | Dev | ### 4. API Gateway Deployment | Propriedade | Valor | |-------------|-------| | Nome | `mfe-user-deployment` | | Path Prefix | `/` | | Authentication | Anonymous | | Rota | `/{req.*}` → GET → PAR URL | --- ## Resultado Final ### URL de Acesso Após o deploy bem-sucedido, o MFE estará disponível em: ``` https://.apigateway.sa-saopaulo-1.oci.customer-oci.com/ ``` ### Como Obter a URL ```bash oci api-gateway gateway list \ --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a" ``` Ou verificar no console OCI: 1. Acesse OCI Console 2. Developer Services → API Gateway 3. Selecione `mfe-user-gateway` 4. Copie o **Hostname** --- ## Pré-requisitos (Variable Groups) ### aws-credentials-dev | Variável | Descrição | |----------|-----------| | `AWS_ACCESS_KEY_ID` | Access Key AWS | | `AWS_SECRET_ACCESS_KEY` | Secret Key AWS | | `AWS_REGION` | Região (ex: us-east-1) | | `CLOUDFLARE_ZONE_ID` | Zone ID Cloudflare | | `CLOUDFLARE_API_TOKEN` | Token Cloudflare | ### oci-terraform | Variável | Descrição | Valor Exemplo | |----------|-----------|---------------| | `OCI_TENANCY_OCID` | OCID da Tenancy | `ocid1.tenancy.oc1..xxx` | | `OCI_USER_OCID` | OCID do Usuário | `ocid1.user.oc1..xxx` | | `OCI_FINGERPRINT` | Fingerprint da chave | `xx:xx:xx:xx:...` | | `OCI_PRIVATE_KEY_B64` | Chave privada (base64) | (secret) | | `OCI_REGION` | Região OCI | `sa-saopaulo-1` | | `COMPARTMENT_PARENT_OCID` | Compartment Dev | `ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a` | | `OCI_SUBNET_OCID` | Subnet para API Gateway | `ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq` | ### mfe-credentials | Variável | Descrição | |----------|-----------| | (variáveis específicas do MFE) | | --- ## Comparação: AWS vs OCI | Aspecto | AWS | OCI | |---------|-----|-----| | Armazenamento | S3 Bucket | Object Storage Bucket | | CDN/Proxy | CloudFront (opcional) | API Gateway | | Cache | Cloudflare | - | | Autenticação | AWS Access Key | OCI API Key | | URL Final | S3 URL ou CloudFront | API Gateway URL | | Custo | ~$0.023/GB + requests | ~$0.0255/GB + API Gateway | --- ## Troubleshooting ### O que acontece se disparar a pipeline sem infraestrutura? #### Recursos Criados Automaticamente | Recurso | Se não existir | Comportamento | |---------|----------------|---------------| | Bucket | ✅ Pipeline cria | `oci os bucket create` funciona | | PAR | ✅ Pipeline cria | Cria automaticamente | | API Gateway | ✅ Pipeline cria | Funciona SE subnet existir | | Deployment | ✅ Pipeline cria | Funciona SE gateway existir | #### Recursos que DEVEM Existir | Recurso | Obrigatório | Motivo | |---------|-------------|--------| | VCN | ✅ Sim | API Gateway precisa de rede | | Subnet | ✅ Sim | API Gateway precisa de subnet | | Variable `OCI_SUBNET_OCID` | ✅ Sim | Pipeline precisa saber qual subnet usar | #### Fluxo de Execução sem Infraestrutura ``` ┌─────────────┐ │ BUILD │ → ✅ Sempre funciona └─────────────┘ │ ▼ ┌─────────────┐ │ UPLOADTOOCI│ → ✅ Cria bucket automaticamente │ │ (se não existir) └─────────────┘ │ ▼ ┌─────────────┐ │ CREATEPAR │ → ✅ Cria PAR automaticamente └─────────────┘ │ ▼ ┌─────────────┐ │ DEPLOY API │ → ❌ FALHA se: │ GATEWAY │ • OCI_SUBNET_OCID não configurado │ │ • Subnet não existe │ │ • VCN não existe └─────────────┘ ``` #### Erros Comuns | Erro | Causa | Solução | |------|-------|---------| | `Variable OCI_SUBNET_OCID not found` | Variável não configurada | Adicionar no Variable Group `oci-terraform` | | `Subnet not found` | OCID inválido ou subnet não existe | Verificar OCID da subnet | | `VCN not found` | VCN não existe | Criar VCN via Terraform | | `NotAuthorizedOrNotFound` | Permissões insuficientes | Verificar políticas OCI | #### Cenário: Disparar sem OCI_SUBNET_OCID **Resultado**: - ✅ Bucket `mfe-user-dev` será criado - ✅ PAR será criado - ❌ API Gateway falhará - ❌ Deployment não será criado **Como recuperar**: 1. Adicionar `OCI_SUBNET_OCID` no Variable Group 2. Reexecutar a pipeline 3. API Gateway será criado #### Cenário: Subnet Não Existe **Resultado**: - ✅ Bucket criado - ✅ PAR criado - ❌ API Gateway falha com erro de subnet **Como recuperar**: 1. Criar subnet via Terraform ou Console OCI 2. Atualizar `OCI_SUBNET_OCID` com novo OCID 3. Reexecutar pipeline ### Pipeline falha no Build | Erro | Solução | |------|---------| | `npm ci` falha | Verificar `package-lock.json` | | `npm run build:dev` falha | Verificar script no `package.json` | | Artefato vazio | Verificar se `dist/` foi gerado | ### Pipeline falha no Upload OCI | Erro | Solução | |------|---------| | `OCI_PRIVATE_KEY_B64` inválido | Regenerar chave e atualizar Variable Group | | `Authentication failed` | Verificar fingerprint e user OCID | | `Compartment not found` | Verificar `COMPARTMENT_PARENT_OCID` | ### Pipeline falha no API Gateway | Erro | Solução | |------|---------| | `OCI_SUBNET_OCID` não configurado | Adicionar variável no Variable Group | | `Subnet not found` | Verificar se subnet existe | | `Quota exceeded` | Verificar limites da tenancy | ### MFE não carrega no navegador | Erro | Solução | |------|---------| | 403 Forbidden | PAR expirou, reexecutar pipeline | | 404 Not Found | Verificar rotas do deployment | | Arquivos JS não carregam | Verificar Content-Type no bucket | --- ## Comandos Úteis ### Verificar recursos OCI ```bash # Listar buckets oci os bucket list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a" # Listar objetos no bucket oci os object list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" # Listar API Gateways oci api-gateway gateway list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a" # Ver deployment oci api-gateway deployment list --gateway-id "" # Listar PARs oci os preauth-request list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" ``` ### Deletar recursos (se necessário) ```bash # Deletar PAR oci os preauth-request delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" --par-id "" # Deletar bucket (vazio) oci os bucket delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" # Deletar deployment oci api-gateway deployment delete --deployment-id "" # Deletar gateway oci api-gateway gateway delete --gateway-id "" ``` --- ## Referências - [OCI-MFE-TASKS.md](./OCI-MFE-TASKS.md) - Checklist de atividades - [OCI-MFE-STEPBYSTEP.md](./OCI-MFE-STEPBYSTEP.md) - Passo a passo - [OCI-API-GATEWAY.md](./OCI-API-GATEWAY.md) - Configuração API Gateway - [Oracle Documentation](https://docs.oracle.com/en/learn/oci-api-gateway-web-hosting/index.html)