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
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
- Acesse Azure DevOps → Pipelines
- Selecione
mfe-user
- Clique em Run pipeline
- Selecione branch
devops
- 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://<gateway-ocid>.apigateway.sa-saopaulo-1.oci.customer-oci.com/
Como Obter a URL
oci api-gateway gateway list \
--compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"
Ou verificar no console OCI:
- Acesse OCI Console
- Developer Services → API Gateway
- Selecione
mfe-user-gateway
- 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:
- Adicionar
OCI_SUBNET_OCID no Variable Group
- Reexecutar a pipeline
- API Gateway será criado
Cenário: Subnet Não Existe
Resultado:
- ✅ Bucket criado
- ✅ PAR criado
- ❌ API Gateway falha com erro de subnet
Como recuperar:
- Criar subnet via Terraform ou Console OCI
- Atualizar
OCI_SUBNET_OCID com novo OCID
- 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
# 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 "<gateway-id>"
# Listar PARs
oci os preauth-request list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"
Deletar recursos (se necessário)
# Deletar PAR
oci os preauth-request delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" --par-id "<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 "<deployment-id>"
# Deletar gateway
oci api-gateway gateway delete --gateway-id "<gateway-id>"
Referências