Apache Ceph

Apache Ceph es el sistema de almacenamiento distribuido del Storage Layer de TIGO. Provee almacenamiento de objetos compatible con la API S3 a través de Ceph Object Gateway (RGW), utilizado como base del Data Lake.

#Getting Started

#Acceder a Ceph desde CLI (AWS CLI compatible)

Configurar las credenciales de acceso

$ aws configure --profile ceph-tigo
# AWS Access Key ID: <tu_access_key_tigo>
# AWS Secret Access Key: <tu_secret_key_tigo>
# Default region name: us-east-1
# Default output format: json

Usar el endpoint de Ceph TIGO

$ export CEPH_ENDPOINT=https://ceph-rgw.tigo.internal:7480

# Alias para facilitar el uso
$ alias s3ceph='aws s3 --endpoint-url $CEPH_ENDPOINT --profile ceph-tigo'

Verificar acceso

$ s3ceph ls
# Lista todos tus buckets

#Operaciones con Buckets

Comando Descripción
s3ceph ls Listar todos los buckets
s3ceph ls s3://bucket-name/ Listar contenido de un bucket
s3ceph ls s3://bucket-name/prefix/ --recursive Listar recursivamente
s3ceph mb s3://nuevo-bucket Crear un bucket
s3ceph rb s3://bucket-vacio Eliminar bucket vacío
s3ceph rb s3://bucket --force Eliminar bucket con contenido

#Gestión de Objetos (Archivos)

#Upload y Download

Subir un archivo

$ s3ceph cp archivo_local.parquet s3://tigo-data-raw/etl/ventas/2026/

Subir un directorio completo

$ s3ceph cp ./datos_locales/ s3://tigo-data-raw/etl/batch/ \
    --recursive \
    --exclude "*.tmp"

Descargar un archivo

$ s3ceph cp s3://tigo-data-raw/etl/ventas/2026/data.parquet ./local/

Descargar un directorio

$ s3ceph cp s3://tigo-data-analytics/resultados/ ./resultados/ \
    --recursive

#Sincronizar directorios

Sync local → Ceph (solo sube diferencias)

$ s3ceph sync ./datos/ s3://tigo-data-raw/etl/datos/ \
    --delete \
    --exclude "*.log"

Sync Ceph → local

$ s3ceph sync s3://tigo-data-analytics/reportes/ ./reportes_local/

Sync entre buckets Ceph

$ s3ceph sync s3://tigo-data-raw/etl/ s3://tigo-data-backup/etl/

#Estructura de Buckets TIGO

#Buckets del Data Lake TIGO

Bucket Capa Descripción
tigo-data-raw Raw Layer Datos crudos sin procesar (landing zone)
tigo-data-staging Staging Datos en proceso de transformación
tigo-data-analytics Analytics Datos procesados listos para consumo
tigo-data-ml ML Layer Datasets y modelos de machine learning
tigo-data-backup Backup Copias de seguridad
tigo-data-temp Temp Archivos temporales (limpieza automática 30d)

#Convención de ruta estándar TIGO

s3://tigo-data-raw/
  └── {area}/{fuente}/{año}/{mes}/{dia}/
        └── {nombre_archivo}.{formato}

# Ejemplo:
s3://tigo-data-raw/comercial/crm/2026/03/11/clientes.parquet
s3://tigo-data-analytics/telco/kpis/2026/03/kpi_red_mensual.parquet

#Operaciones Avanzadas

#Gestión de metadatos y ACL

Ver metadatos de un objeto

$ aws s3api head-object \
    --bucket tigo-data-raw \
    --key etl/ventas/data.parquet \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

Agregar metadatos personalizados al subir

$ aws s3api put-object \
    --bucket tigo-data-analytics \
    --key reportes/reporte_marzo.parquet \
    --body reporte_marzo.parquet \
    --metadata '{"area":"comercial","owner":"data-engineering","version":"1.0"}' \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

#Copiar y mover objetos

Copiar objeto dentro de Ceph

$ aws s3api copy-object \
    --copy-source tigo-data-raw/etl/ventas/data.parquet \
    --bucket tigo-data-analytics \
    --key procesado/ventas/data.parquet \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

Mover (copiar + borrar)

# Paso 1: Copiar
$ s3ceph cp s3://tigo-data-raw/temp/archivo.parquet \
             s3://tigo-data-analytics/final/archivo.parquet
# Paso 2: Borrar original
$ s3ceph rm s3://tigo-data-raw/temp/archivo.parquet

#Generar URLs prefirmadas (acceso temporal)

Generar URL de descarga válida por 1 hora

$ aws s3 presign s3://tigo-data-analytics/reportes/informe.xlsx \
    --expires-in 3600 \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

#Uso desde Python (boto3)

#Configurar cliente boto3

import boto3
from botocore.client import Config

s3 = boto3.client(
    's3',
    endpoint_url='https://ceph-rgw.tigo.internal:7480',
    aws_access_key_id='TU_ACCESS_KEY',
    aws_secret_access_key='TU_SECRET_KEY',
    config=Config(signature_version='s3v4'),
    region_name='us-east-1',
)

#Operaciones comunes en Python

Listar archivos en un prefijo

paginator = s3.get_paginator('list_objects_v2')
pages = paginator.paginate(
    Bucket='tigo-data-raw',
    Prefix='etl/ventas/2026/03/'
)
for page in pages:
    for obj in page.get('Contents', []):
        print(obj['Key'], obj['Size'])

Subir archivo

s3.upload_file(
    Filename='local_data.parquet',
    Bucket='tigo-data-raw',
    Key='etl/ventas/2026/03/11/data.parquet',
    ExtraArgs={'Metadata': {'owner': 'de-team', 'version': '1.0'}}
)

Descargar archivo

s3.download_file(
    Bucket='tigo-data-analytics',
    Key='reportes/kpi_mensual.parquet',
    Filename='kpi_mensual.parquet'
)

Leer Parquet directo desde Ceph con pandas

import pandas as pd
import s3fs

fs = s3fs.S3FileSystem(
    endpoint_url='https://ceph-rgw.tigo.internal:7480',
    key='TU_ACCESS_KEY',
    secret='TU_SECRET_KEY',
)

df = pd.read_parquet(
    's3://tigo-data-analytics/ventas/2026/03/',
    filesystem=fs
)

#Monitoreo y Operaciones

#Comandos de administración (requiere rol admin)

Ver espacio usado por bucket

$ aws s3api list-objects-v2 \
    --bucket tigo-data-analytics \
    --query '[sum(Contents[].Size), length(Contents[])]' \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

Ver estadísticas rápidas de un bucket

$ s3ceph ls s3://tigo-data-raw --recursive --summarize --human-readable

Buscar archivos por extensión en todo un bucket

$ s3ceph ls s3://tigo-data-raw/ --recursive | grep "\.parquet$"

#Lifecycle policies (requiere admin)

{
  "Rules": [
    {
      "ID": "eliminar-temporales-30-dias",
      "Filter": { "Prefix": "temp/" },
      "Status": "Enabled",
      "Expiration": { "Days": 30 }
    }
  ]
}

Aplicar política de lifecycle

$ aws s3api put-bucket-lifecycle-configuration \
    --bucket tigo-data-temp \
    --lifecycle-configuration file://lifecycle.json \
    --endpoint-url $CEPH_ENDPOINT \
    --profile ceph-tigo

#Also see