365 lines
13 KiB
Markdown
365 lines
13 KiB
Markdown
# 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://<gateway-ocid>.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 "<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 "<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
|
|
|
|
- [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)
|