Catálogo
Tuxpas S.A.C / AJE Group / Pedido Sugerido MLOps

Convenciones de nombrado

Estándar único de naming para los recursos AWS del proyecto, validado contra aje-cdk-libs y los recursos ya desplegados en la cuenta dev
Código
DOC-AF-03
Fase
Análisis Funcional · sem 1 (18 → 22 may)
Fecha
2026-05-15
Autor
Adrian Ulloa · Squad Lead Tuxpas

Resumen

Este documento establece la convención única de nombrado que se aplica a todos los recursos AWS del proyecto Pedido Sugerido. La convención cubre 14 tipos de recurso, especifica el patrón, ejemplos concretos y los límites de longitud aplicables. Se alinea con dos referencias técnicas:

  1. aje-cdk-libs (librería estándar AJE para CDK Python) — define los suffixes abreviados y la lógica de NameBuilder.
  2. Recursos ya desplegados en la cuenta dev 832257724409 — los stacks CdkDatalakeIngest* y mlops-* muestran el patrón verbose efectivamente usado en producción.

Decisión clave del proyecto: se adopta el patrón verbose (suffixes legibles como codepipeline, dynamodb, lambda) en lugar del patrón abreviado de aje-cdk-libs (cp, ddb, fn). Razón: el infra ya desplegado por Joseph en AjeDevPsInfraStack usa verbose, y mantener consistencia es más valioso que adoptar un sufijo más corto. La diferencia visual entre aje-dev-ps-config-ddb y aje-dev-ps-configtable-dynamodb no justifica una migración disruptiva.


Patrón general

Todos los recursos del proyecto siguen el patrón:

{enterprise}-{stage}-{project}-{descriptive_name}-{service_suffix}
Token Valor en este proyecto Definición
enterprise aje Identificador corporativo · constante
stage dev (hoy) · qa / prod (futuro) Ambiente de despliegue
project ps Abreviación de "pedido sugerido"
descriptive_name varía por recurso Nombre legible que describe la función (ej. pipeline, triggerfunction, configtable)
service_suffix varía por tipo de recurso Identificador del servicio AWS (ver tabla por tipo más abajo)

Restricciones de caracteres aplicables a todos los recursos:


Tabla por tipo de recurso

Tipo AWS service_suffix Pattern completo · ejemplo Límite chars
S3 Bucket (scope-restricted) s3 aje-dev-ps-codepipelinebucket-s3 63
S3 Bucket (globally unique) — patrón aje-cdk-libs s3 aje-dev-ps-832257724409-us-east-2-data-s3 (incluye account + region por unicidad global) 63
ECR Repository (sin suffix) aje-dev-ps-processing · aje-dev-ps-spark 256
IAM Role iam aje-dev-ps-sagemaker-executionrole-iam · aje-dev-ps-buildrole-iam 64
IAM Policy iam aje-dev-ps-sagemakerdeploypolicy-iam · aje-dev-ps-buildpolicy-iam 128
Lambda Function lambda aje-dev-ps-triggerfunction-lambda 64
EventBridge Rule eventbridge aje-dev-ps-schedulerule-EC-eventbridge (scoped por país en el segmento descriptive) 64
DynamoDB Table dynamodb aje-dev-ps-configtable-dynamodb 255
CodePipeline codepipeline aje-dev-ps-pipeline-codepipeline 100
CodeBuild Project codebuild aje-dev-ps-deploystackproject-codebuild · aje-dev-ps-buildproject-codebuild · aje-dev-ps-deployproject-codebuild 255
SNS Topic sns aje-dev-ps-alert-topic-sns 256
CloudWatch Alarm cloudwatch aje-dev-ps-executionfailedalarm-cloudwatch · aje-dev-ps-executionstoppedalarm-cloudwatch 255
CloudWatch Dashboard cloudwatch aje-dev-ps-monitoringdashboard-cloudwatch 255
SageMaker Pipeline sagemaker aje-dev-ps-pipeline-sagemaker 256
SageMaker Domain (sin suffix · convención mlops-)* aje-dev-ps-domain 63
SageMaker Studio User Profile (sin suffix) aje-dev-ps-<nombre-usuario> 63
SageMaker Model Package Group (Nivel 2) sagemaker aje-dev-ps-recmodel-<pais>-sagemaker (propuesto) 63
Feature Group · Feature Store (Nivel 2) featurestore aje-dev-ps-cliente-features-featurestore (propuesto) 64
Step Functions State Machine (si aplica) stepfunction aje-dev-ps-orchestrator-stepfunction (propuesto) 80

Excepciones documentadas

Tres tipos de recurso no siguen el patrón general por restricciones técnicas:

1. S3 Buckets · unicidad global

S3 bucket names son únicos a nivel global de AWS (no por cuenta, no por región). Si el proyecto necesita un bucket con nombre extremadamente común (ej. data), debe incorporar account_id y region al pattern:

aje-dev-ps-832257724409-us-east-2-data-s3

Aplicado solo cuando el descriptive_name no es suficientemente único. En este proyecto, el bucket de CodePipeline artifacts (aje-dev-ps-codepipelinebucket-s3) usa el patrón compacto porque codepipelinebucket ya es lo bastante específico.

2. CloudFormation Stack names

Los stacks deployados por CDK usan PascalCase porque CDK genera nombres de stack desde el construct_id (PascalCase):

Aceptamos ambos formatos porque coexisten en la cuenta hoy. Para futuros stacks CDK, mantener PascalCase con el patrón Aje{Stage}Ps{Descriptive}Stack (ej. AjeDevPsMLOpsStack, AjeQaPsInfraStack).

3. EventBridge Rules · scoping por país

Las rules de schedule por país incluyen el código del país en descriptive_name (no como token aparte):

El código del país se mantiene en mayúsculas (EC, MX, PE) por trazabilidad con la columna code_country de DynamoDB y los code_country que el Lambda recibe del event.


Tags estándar

Independientemente del nombre, todos los recursos deben llevar la siguiente tabla de tags. La librería aje-cdk-libs aplica estos tags automáticamente vía ResourceBuilder.tag_resource().

Tag Valor en este proyecto Origen
Enterprise aje ProjectConfig.enterprise
Project ps ProjectConfig.project_name
Environment DEV (uppercase) ProjectConfig.environment.value
Owner adrian.ulloa@tuxpas.com (hoy) ProjectConfig.author
Service varía por recurso nombre legible del servicio AWS (ej. AWS SageMaker, AWS S3)
Name mismo valor que el resource name redundante con el nombre, útil en la consola

Tags opcionales recomendados (no aplicados automáticamente; sugerencia para producción):


Validación contra aje-cdk-libs

aje-cdk-libs (rama main del repo DimAje/aje-cdk-libs) define NameBuilder con suffixes abreviados:

Service enum Abreviado (aje-cdk-libs) Verbose (adoptado)
S3_BUCKET s3 s3 (coincide)
LAMBDA_FUNCTION fn lambda
STEP_FUNCTION sf stepfunction
IAM_ROLE role iam
IAM_POLICY policy iam
GLUE_JOB job gluejob
DYNAMODB_TABLE ddb dynamodb
EVENT_BRIDGE eb eventbridge
EVENT_BRIDGE_RULE rule eventbridge
SNS_TOPIC sns sns (coincide)
SQS sqs sqs (coincide)
SECRET sm (no usado en este proyecto)

Implicación: cuando se incorpore aje-cdk-libs al proyecto en Niveles 2-3, hay dos opciones:

Esta decisión queda registrada acá y se confirma con AJE en la Sesión 2.


Validación contra recursos existentes en la cuenta dev

El patrón verbose adoptado se valida contra los recursos aje-dev-ps-* ya desplegados (extraídos de la consola al 15-may-2026):

Tipo Recursos verificados Patrón
ECR aje-dev-ps-processing · aje-dev-ps-spark ✓ sin suffix
Lambda aje-dev-ps-triggerfunction-lambda ✓ verbose lambda
DynamoDB aje-dev-ps-configtable-dynamodb ✓ verbose dynamodb
CodePipeline aje-dev-ps-pipeline-codepipeline ✓ verbose codepipeline
CodeBuild × 3 aje-dev-ps-deploystackproject-codebuild · aje-dev-ps-buildproject-codebuild · aje-dev-ps-deployproject-codebuild ✓ verbose codebuild
SNS aje-dev-ps-alert-topic-sns ✓ verbose sns
CloudWatch aje-dev-ps-executionfailedalarm-cloudwatch · aje-dev-ps-monitoringdashboard-cloudwatch ✓ verbose cloudwatch
SageMaker Pipeline aje-dev-ps-pipeline-sagemaker ✓ verbose sagemaker
SageMaker Domain aje-dev-ps-domain ✗ sin suffix · sigue convención mlops-* del resto de la cuenta
IAM Roles × 6 aje-dev-ps-sagemaker-executionrole-iam · aje-dev-ps-buildrole-iam · aje-dev-ps-deployrole-iam · etc. ✓ verbose iam
EventBridge × 7 aje-dev-ps-schedulerule-{EC|MX|PE|...}-eventbridge ✓ verbose con país en descriptive

Conclusión: el patrón verbose adoptado está implementado consistentemente en los recursos productivos del proyecto.


Naming dentro de S3 · prefixes y keys

Los nombres de buckets S3 siguen la convención general. Los prefixes/keys dentro del bucket siguen una convención separada que documentamos acá para evitar ambigüedad.

Bucket aje-dev-analytics-artifacts-s3 (inputs del pipeline)

pedido_sugerido/
└── <pais_lowercase>/                  · ej. ecuador/ · cam/ · mexico/ · peru/
    ├── maestro_productos_<pais>000        *(raw, ;-separated)*
    ├── visitas_<pais>000                  *(raw, ;-separated)*
    ├── ventas_<pais>000                   *(raw, ;-separated)*
    ├── D_stock_<pais>.csv                 *(raw, ,-separated)*
    └── <PAIS>_maestro_productos.csv       *(procesado, output de Limpieza)*

Bucket aje-dev-ps-codepipelinebucket-s3 (artifacts del CodePipeline)

SourceOutput/<execution-id>/    · output del stage Source (GitLab pull)
BuildOutput/<execution-id>/     · output del stage Build (Docker push log)

Generados automáticamente por CodePipeline · no requieren naming manual.

Bucket aje-dev-analytics-artifacts-s3/ps-pipeline/ (outputs del SM Pipeline)

ps-pipeline/<PAIS>/
├── limpieza/                       · output del step Limpieza
│   ├── <PAIS>_maestro_productos.csv
│   ├── <pais>_ventas_manana.parquet
│   ├── mapeo_diccionario.json
│   └── rutas/D_<cod_ruta>_ventas.csv  *(uno por ruta)*
├── modelado/                       · output del step Modelado
│   └── *.csv / *.parquet
└── reglas_negocio/                 · output final
    └── recomendaciones_<fecha>.csv

Próximos pasos

  1. Sesión 2 (Mié 20-may) · validar con AJE la decisión de mantener el patrón verbose vs migrar a suffixes abreviados de aje-cdk-libs (decisión registrada como Opción A en este doc).
  2. Antes de Desarrollo Nivel 2 · al crear los primeros recursos del Nivel 2 (Feature Store, Model Registry), confirmar que sus nombres siguen el patrón propuesto en la tabla (ej. aje-dev-ps-cliente-features-featurestore, aje-dev-ps-recmodel-EC-sagemaker).
  3. CI guard rail · agregar un check en el CodePipeline DeployStack stage que falle si algún recurso CDK no matchea el regex ^aje-{stage}-ps-[a-z0-9-]+(-[a-z]+)?$. Esto previene drift del estándar a futuro.