Skip to main content

Tracking de Migración — Python 3.13 + ARM64

Documento vivo. Actualizar cada vez que se migra un stack. Última actualización: 2026-03-19


Estado general de migración

StackDominioEstadoFechaTemplate
STACK_BACKOFFICEBackoffice admin (torneos, equipos, fixtures)✅ Migrado2026-03-18backOfficeDev313.yaml
STACK_BACKOFFICE_CONTENTBackoffice contenido (notas, posts, notificaciones)✅ Migrado2026-03-18backOfficecontentDev313.yaml
STACK_BACKOFFICE_TOURNAMENTBackoffice de ediciones/torneos y partidos✅ Migrado2026-03-18botournamentDev313.yaml
STACK_TORNEOSTorneos, fixtures, estadísticas, ficha de partido✅ Migrado2026-03-18torneosDev313.yaml
STACK_FLOW_CHANNELCanal de flow / mensajería de canales✅ Migrado2026-03-18flowchannelDev313.yaml
STACK_PERFILPerfiles de usuario, registro, estadísticas personales✅ Migrado2026-03-18perfilDev313.yaml
STACK_COLECTAFundraising (colectas de fondos para equipos)✅ Migrado2026-03-19colectaDev313.yaml
STACK_DYNAMODynamoDB Streams → EventBridge → Step Functions (match events)✅ Migrado2026-03-19dynamoDev313.yaml
STACK_WIDGETSWidgets: feed, marketplace refresh, schedules (SQS + EventBridge)✅ Migrado2026-03-19widgetsDev313.yaml
STACK_COMUNIDADCanales, mensajería, notificaciones, transfermarket, media✅ Migrado2026-05-20comunidad.yaml
STACK_FOLLOWERSSeguimiento de perfiles, búsqueda, recomendaciones de feed✅ Migrado2026-03-19followers.yaml
STACK_MONITOREOMonitoreo deportivo, grupos, estadísticas de lesiones y carga✅ Migrado2026-03-19monitoreo.yaml

Los stacks aún no migrados pertenecen a las ramas Prod_new (Python 3.9) y Chat_Prod (Python 3.13 x86). Ver ARQUITECTURA_DEPLOY_PYTHON313_ARM64.md para el plan completo. Ver sección Análisis de origen por rama para el detalle de los stacks pendientes.


Análisis de origen por rama

Generado: 2026-03-19. Metodología: comparar contenido YAML y layers entre origin/Prod_new y origin/Chat_Prod.

Hallazgo principal

Prod_new es el source of truth para TODOS sus stacks. Chat_Prod solo tiene copias más antiguas/reducidas. No se identificó ningún stack cuyo origen real sea Chat_Prod entre los stacks de Prod_new: en todos los casos donde hay diferencias, Prod_new tiene más contenido que Chat_Prod.

Los stacks que pertenecen al dominio Chat/Posts/Pagos y NO existen en Prod_new (por tanto NO se migran desde aquí) son: STACK_AGENDA, STACK_CHAT, STACK_CONNECT, STACK_DASHBOARD, STACK_DATA, STACK_GAMES, STACK_GEMENIAUTO, STACK_GENERALNOTIFICATIONS, STACK_MULTIMEDIA, STACK_NOTIFICATION_PREFERENCES, STACK_PANELNOTIFICATION, STACK_PAYWEBHOOK, STACK_POSTS, STACK_SOCCERFRIENDLY, STACK_SOCIOS, STACK_TEAM.

Stacks pendientes de migrar (origen Prod_new)

StackFuncionesDB layerDiff con Chat_ProdNotas
STACK_COMPLEXS15PostgreSQL+0 / -97 (Prod_new adelante)
STACK_DYNAMO_TABLES0 (solo tablas)Infra DynamoDB+0 / -122 (Prod_new adelante)Solo crea tablas, sin Lambdas
STACK_EVENTOSBO26Común+6 / -7 (divergencia leve)Chat_Prod hardcodeó StageName: dev
STACK_EVENTS2Común+0 / -0 (idéntico)
STACK_HOYENTRENO54Común+1 / -75 (Prod_new adelante)
STACK_INTEGRATION22PostgreSQL + DynamoDB+0 / -0 (idéntico)
STACK_LOCATION2Común+0 / -0 (idéntico)
STACK_MARKETPLACE7Común+0 / -45 (Prod_new adelante)
STACK_MONITOREO59PostgreSQL + DynamoDB+0 / -0 (idéntico)Migrado
STACK_NOTES_IA36Común+0 / -0 (idéntico)
STACK_NOTIFICATION17Común+0 / -0 (idéntico)
STACK_NUTRITION13DynamoDB+0 / -0 (idéntico)Layer DynamoDB propio
STACK_PLAYNFO17Común+0 / -0 (idéntico)
STACK_SERVICE_WEB5PostgreSQL+0 / -0 (idéntico)
STACK_SPONSORS3Común+0 / -34 (Prod_new adelante)
STACK_STORE1Común+0 / -0 (idéntico)
STACK_TRIVIA_GAMING63Común+0 / -0 (idéntico)Más grande por funciones
STACK_WORDPRESS4Común+0 / -0 (idéntico)
STACK_ZONA1026PostgreSQL+0 / -0 (idéntico)

Diff: +N = líneas que Chat_Prod agregó; -N = líneas que Prod_new tiene y Chat_Prod no. Prod_new con más líneas = branch de origen.


STACK_BACKOFFICE

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayBackofficeDEV
TemplateSTACK_BACKOFFICE/backOfficeDev313.yaml
Funciones Lambda202
Endpoints56 paths
Cognitous-east-2_1WuxwXceK
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerBO
Líneas template3,095 (optimizado)

Cambios respecto a Python 3.9

  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) en lugar de ARN fijo
  • EndpointConfiguration: Type: REGIONAL en API Gateway
  • Globals optimization: Timeout: 10, MemorySize: 256, Layers movidos a Globals (funciones solo declaran overrides). Role se mantiene por función (no soportado en Globals por SAM CLI).

Módulos del layer propio (layer/)

MóduloDescripción
database_backOffice/Lógica de dominio PostgreSQL del backoffice
query_bo/Templates SQL del stack
utils_backOffice/Utilidades específicas
aws_recursos_bo/Helpers AWS (S3, Cognito)
gene_pdf_bo/Generación de PDFs (actas/planillas)
warrant/Wrapper Cognito

Endpoints por dominio

Jugadores y perfiles

PathMétodos
/add_player_by_teamGET, POST, PUT
/add-player-by-team-admin-torGET, POST, PUT
/add-player-by-team-delegateGET, POST, PUT
/playersGET, PUT, DELETE
/update_profileGET, PUT
/update_profile_adminGET, PUT
/update_profile_for_putGET, PUT
/update_profile_for_put_adminGET, PUT
/team/perfil/admin-playersGET, PUT
/team/perfil/playersGET, PUT
/team/perfil/matchesGET

Equipos

PathMétodos
/teamGET, POST, PUT, DELETE
/team-searchGET
/team_searchGET
/team_sanctionGET, PUT
/team_usersGET
/teams-by-adminGET
/teams-by-delegateGET
/crm_teamPUT
/crm_usersPUT

Torneos y fases

PathMétodos
/tournamentGET, POST, PUT, DELETE
/tournament-friendlyPOST
/tournament-phasesGET
/tournament-stepsDELETE
/tournament-teamGET, POST, PUT, DELETE
/tournament-teamsGET, POST, PUT
/tournament/categoryGET, POST, PUT
/tournament/seasonsGET, POST, PUT
/fase-tournamentGET, POST, PUT
/fase-team-tournamentGET, POST, PUT
/phase-team-metaGET

Fixture y partidos

PathMétodos
/fixtureGET, POST, PUT, DELETE
/fixture_infoGET
/fixture-autoPOST, PUT
/fixture-match-metaGET, POST
/fixture-matchesGET, POST, PUT, DELETE

Liga

PathMétodos
/leagueGET, POST, PUT, DELETE
/league-infoGET
/league_teamsGET
/historic-skillsGET

Ubicación

PathMétodos
/cityGET, POST, PUT
/countryGET, POST, PUT
/provinceGET, POST, PUT
/localitysGET, POST, PUT

Catálogos y configuración

PathMétodos
/categoryGET, POST, PUT, DELETE
/sportGET, POST, PUT
/tags-metadataGET
/metadataGET
/configurationGET

Entrenamiento y nutrición

PathMétodos
/exerciseGET, POST, PUT, DELETE
/exercise-langGET, PUT
/typeexerciseGET, POST, PUT, DELETE
/training-libraryGET, POST, PUT, DELETE
/nutritionGET, POST, PUT

Auth y usuarios

PathMétodos
/cognitoGET
/all-cognitoPOST
/register-webPOST

Otros

PathMétodos
/productsGET, POST, PUT, DELETE
/service-productGET, POST, PUT, DELETE
/downloadparteGET

Resolución de conflictos

El deploy de backOfficeDev313 falló con CREATE_FAILED: TeamExternalPutDEV already exists in stack backOfficeDev.

Funciones afectadas (tenían DeletionPolicy: Retain + FunctionName explícito + Runtime: python3.9):

FunciónFunctionNamePathProblema
TeamExternalPutTeamExternalPut$ENV/team/external PUTDeletionPolicy + Runtime python3.9
TeamExternalOptionsTeamExternalOptions$ENV/team/external OPTIONSDeletionPolicy + Runtime python3.9
MatchManualProfileGet(auto)/match_manual_profile GETDeletionPolicy
MatchManualProfileOptions(auto)/match_manual_profile OPTIONSDeletionPolicy

Fix aplicado (commits aeb6f6825 + d9b855fff + 9d0da5bcc):

Ronda 1 — Funciones Lambda:

  1. Eliminado DeletionPolicy: Retain y UpdateReplacePolicy: Retain de las 4 funciones
  2. Eliminado Runtime: python3.9 de TeamExternalPut y TeamExternalOptions (heredan python3.13 de Globals)
  3. Actualizado stack viejo backOfficeDev via CloudFormation para liberar los nombres TeamExternalPutDEV y TeamExternalOptionsDEV:
    • Descargado template del stack viejo
    • Eliminadas funciones TeamExternal, sus permission resources y paths /team/external del swagger del API Gateway
    • Subido template limpio a S3 y ejecutado update-stack

Ronda 2 — ApiKey y UsagePlan:

Tras liberar las funciones, el deploy falló de nuevo con ApiKey with name Backoffice-External-DEV already exists. Los recursos con nombre explícito en el template 313 también existían en el stack viejo.

Recurso (logical)TipoNombre/Physical ID
BackofficeExternalApiKeyAWS::ApiGateway::ApiKeyBackoffice-External-DEV
BackofficeExternalUsagePlanAWS::ApiGateway::UsagePlanBackoffice-External-UsagePlan-DEV
BackofficeExternalUsagePlanKeyAWS::ApiGateway::UsagePlanKey(combo ApiKey+UsagePlan)

Fix: mismo procedimiento — descargar template de backOfficeDev, eliminar los 3 recursos + sus Outputs (BackofficeApiKeyId, BackofficeUsagePlanId), subir a S3 y update-stack.

⚠️ Lección aprendida: No basta con buscar funciones Lambda con FunctionName explícito. También hay que verificar ApiKeys, UsagePlans, LogGroups y cualquier recurso con Name hardcodeado que pueda chocar entre el stack viejo y el nuevo 313. Usar el script /tmp/check_conflicts.py (o similar) para comparar proactivamente.

⚠️ Replicar en QA y PROD al migrar. Ver Conflicto de nombres entre stacks en la guía.


STACK_BACKOFFICE_CONTENT

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayBackofficeContent313DEV
TemplateSTACK_BACKOFFICE_CONTENT/backOfficecontentDev313.yaml
Funciones Lambda195
Endpoints66 paths
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerBOContent
Líneas template2,999 (optimizado)

Cambios respecto a Python 3.9

  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • Layer común referenciado vía SSM Parameter (CommonLayerArn)
  • EndpointConfiguration: Type: REGIONAL en API Gateway
  • Globals optimization: Timeout: 60, MemorySize: 256, Layers movidos a Globals (funciones solo declaran overrides). Role se mantiene por función (no soportado en Globals por SAM CLI).

Módulos del layer propio (layer/)

MóduloDescripción
database_backOfficeC/Lógica de dominio PostgreSQL del backoffice content
query_boc/Templates SQL del stack
utils_backOfficeC/Utilidades específicas
aws_recursos_boc/Helpers AWS (S3, Cognito)
functions_boc/Funciones auxiliares de negocio
gene_pdf_boc/Generación de PDFs de contenido
scrapping_tags/Scraping de tags/metadata
warrant/Wrapper Cognito

Endpoints por dominio

Notas y contenido generado

PathMétodos
/generate-text-dbGET, POST, PUT, DELETE
/generate_note_profileGET, POST, PUT, DELETE
/generate_note_x_torneoGET, PUT
/generate_note_x_torneo/searchGET
/global_notesGET, POST, PUT, DELETE
/group_type_noteGET
/note_finish_matchGET, PUT
/note_post_fixture_featuredGET, PUT
/note_pre_fixture_goalscorerGET, PUT
/note_pre_fixture_vmvGET, PUT
/note_pre_fixture_vsGET, PUT
/note_welcomeGET, PUT

Billboard y Cards

PathMétodos
/billboardGET, POST, PUT, DELETE
/billboard/searchGET
/cardGET, POST, PUT, DELETE
/card/searchGET

Eventos

PathMétodos
/eventosGET
/eventos/backgroundsGET, POST
/eventos/filterGET
/eventos/plantillasGET, POST, PUT, DELETE
/eventos/stickersGET
/eventos/stickers_categoryGET
/eventos/typeGET

Mensajería push / admin

PathMétodos
/message-by-admin-gralGET, POST
/message-by-leagueGET, POST
/message-by-phaseGET, POST
/message-by-playerGET, POST
/message-by-teamGET, POST
/message-by-tourGET, POST
/message-of-phaseGET, POST
/message-of-playerGET, POST
/message-of-teamGET, POST
/message-of-tourGET, POST
/msg-welcome-by-leagueGET, POST
/noti-adminGET

Topics y push masivo

PathMétodos
/topicGET, POST, PUT
/topic/membersGET
/push_csvGET, POST, PUT
/push_csv_detailGET, POST
/push_topic_detailGET, POST

Posts y perfiles sociales

PathMétodos
/profile_postGET, POST, PUT, DELETE
/profile_post/searchGET
/profile_post_boGET
/profile_post_leagueGET
/profile_post_league/searchGET
/profile_post_teamGET, POST, PUT, DELETE
/profile_post_team/searchGET
/profile_post_user_genericGET, POST, PUT, DELETE
/profilepostusergenericGET, POST, PUT
/profilepostxpostGET, POST, PUT, DELETE
/profilepostxpost/searchGET
/profilepostxpostleagueGET, POST, PUT, DELETE
/profilepostxpostteamGET, POST, PUT, DELETE
/profilepostxpostteam/searchGET

Media y transcripción

PathMétodos
/reporterGET
/reporter_mediaGET, POST
/transcribeGET, POST

Configuración y catálogos

PathMétodos
/configurationContentGET
/metadatacontentGET

Auth y usuarios

PathMétodos
/cognitoGET
/all-cognitoPOST
/register-webPOST

Proceso de migración — pasos aplicados por stack

Checklist usado al migrar cada stack de Python 3.9 → Python 3.13 + ARM64:

  • Copiar {stack}.yaml{stack}Dev313.yaml
  • Cambiar Runtime: python3.9python3.13 en Globals
  • Agregar Architectures: [arm64] en Globals
  • Reemplazar referencias al layer común por !Ref CommonLayerArn
  • Agregar parámetro CommonLayerArn con default SSM dev_313
  • Configurar EndpointConfiguration: Type: REGIONAL en API Gateway
  • Renombrar recursos con nombre explícito (sufijo 313)
  • Mover propiedades comunes a Globals (Timeout, MemorySize, Layers). Role NO va en Globals (no soportado por SAM CLI)
  • Actualizar requirements.txt del layer propio para compatibilidad Python 3.13
  • Probar imports del layer en Python 3.13
  • Validar sam build local
  • Deploy a DEV y smoke test de endpoints críticos

Próximos stacks a migrar

Pendiente definir orden de prioridad. Ver copilot-instructions para lista completa de stacks en Prod_new.


STACK_COLECTA

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayColecta313$ENV (renombrado de Colecta$ENV)
TemplateSTACK_COLECTA/colecta.yaml
Funciones Lambda6
Endpoints2 paths
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerColecta

Cambios respecto a Python 3.9

  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • MemorySize: 1024 y Timeout: 200 movidos a Globals (todas las funciones los comparten)
  • Layers movidos a Globals: [LayerColecta, CommonLayerArn]
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) — eliminado recurso LayerCommon
  • DependsOn: ColectaAPiLogGroup agregado al API Gateway
  • AccessLogSetting.DestinationArn cambiado de !GetAtt a !Sub con ARN explícito
  • DeploymentPreference: Enabled: false eliminado de cada función
  • LayerColecta: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13

Recursos renombrados (evitar colisión con Prod_new)

RecursoNombre originalNombre 313Estrategia
API GatewayColecta$ENVColecta313$ENVRenombrado
LogGroupapi-gateway/mas10-colecta-api/$DD_ENVapi-gateway/mas10-colecta-api-313/$DD_ENVRenombrado
FunctionNames (6)FundraisingPost$ENV, etc.Sin cambioStack viejo eliminado

Nota: Los FunctionNames se mantienen con nombres originales porque pueden ser invocados por otros servicios. Se elimina el stack viejo colectaDev para liberar los nombres. El dominio fundraising-dev.liricus.com.ar se preserva y su base path mapping se reconfigura post-deploy.

Módulos del layer propio (layer/)

MóduloDescripción
database_colecta/Lógica de dominio PostgreSQL de colectas
query_colecta/Templates SQL del stack
utils_colecta/Utilidades específicas

Endpoints

PathMétodos
/fundraisingGET, POST, PUT
/fundraising/members/movimentsPOST, PUT, DELETE

STACK_DYNAMO

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayDynamo313$ENV (renombrado de Dynamo$ENV)
TemplateSTACK_DYNAMO/dynamo.yaml
Funciones Lambda13
Endpoints13 paths
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerDynamo

Cambios respecto a Python 3.9

  • Datadog eliminado por completo: Transform, apiKey hardcodeado
  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals (era x86_64 por función)
  • Layers movidos a Globals: [LayerDynamo, CommonLayerArn]
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) — eliminado recurso LayerCommon
  • DependsOn: DynamoAPiLogGroup agregado al API Gateway
  • EndpointConfiguration: Type: REGIONAL agregado
  • AccessLogSetting.DestinationArn cambiado de !GetAtt a !Sub con ARN explícito
  • LayerDynamo: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13
  • Funciones PrepareInsertMatchEventsGet, PrepareModifyMatchEventsGet: mantienen MemorySize: 512, Timeout: 240 como override
  • Función InsertEventsGet: mantiene MemorySize: 512 como override

Recursos renombrados (evitar colisión con Prod_new)

RecursoNombre originalNombre 313Estrategia
API GatewayDynamo$ENVDynamo313$ENVRenombrado
LogGroupapi-gateway/mas10-dynamo-api/$ENVapi-gateway/mas10-dynamo-api-313/$ENVRenombrado
FunctionNames (13)MatchInsertGet$ENV, etc.Sin cambioStack viejo eliminado
Pipes/Rules/EventBus/StateMachinesvariosSin cambioStack viejo eliminado

Nota: Stack viejo dynamoDev eliminado para liberar los nombres. No tiene dominio custom asociado.

Módulos del layer propio (layer/)

MóduloDescripción
database_dynamo/Operaciones DynamoDB (perfiles, matches, equipos)
utils_dynamo/Utilidades específicas

Arquitectura

DynamoDB Streams → EventBridge Pipes (3: Insert/Modify/Remove) → EventBus → EventBridge RulesStep Functions (3 State Machines):

  • MatchInsertWorkflow: Procesa inserción de partidos → actualiza perfiles de usuarios/equipos → inserta eventos de contenido
  • MatchModifyWorkflow: Procesa modificación de partidos (parallel con prode) → actualiza perfiles → prepara eventos
  • MatchRemoveWorkflow: Procesa eliminación de partidos → limpia perfiles de usuarios/equipos

Endpoints

PathHandler
/match_insertMatchInsertGet
/match_modifyMatchModifyGet
/match_removeMatchRemoveGet
/match_user_insertMatchUserInsertGet
/match_user_modifyMatchUserModifyGet
/match_user_removeMatchUserRemoveGet
/match_team_insertMatchTeamInsertGet
/match_team_modifyMatchTeamModifyGet
/match_team_removeMatchTeamRemoveGet
/match_prode_modifyMatchProdeModifyGet
/prepare_new_match_eventsPrepareInsertMatchEventsGet
/prepare_modify_match_eventsPrepareModifyMatchEventsGet
/insert_eventsInsertEventsGet

STACK_BACKOFFICE_TOURNAMENT

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewaybotournamentDEV
TemplateSTACK_BACKOFFICE_TOURNAMENT/botournamentDev313.yaml
Funciones Lambda27
Endpoints13 paths
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerBoTournament
Líneas template496 (optimizado)

Cambios respecto a Python 3.9

  • Transform Datadog comentado
  • Runtime: python3.13 en Globals (eliminado por función)
  • Architectures: [arm64] en Globals
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) — eliminado LayerCommon resource
  • EndpointConfiguration: Type: REGIONAL en API Gateway
  • FunctionName eliminado de cada función
  • DeploymentPreference: Enabled: false eliminado
  • LayerBoTournament actualizado: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13
  • DatadogPocLogGroupSubscriptionFilter comentado
  • Log Group: variables $DD_ENV reemplazadas por valor fijo dev
  • Globals optimization: Timeout: 10, MemorySize: 256, Layers movidos a Globals (funciones solo declaran overrides). Role se mantiene por función (no soportado en Globals por SAM CLI).

Módulos del layer propio (layer/)

MóduloDescripción
database_bo_tournament/Lógica de dominio PostgreSQL del backoffice tournament
querys_bo_tournament/Templates SQL del stack
Database/Helpers de base de datos

Endpoints

PathMétodosServicio
/editionGET, POST, PUT, DELETEservices/edition/
/edition_detailGETservices/edition/edition_detail/
/edition_detail_teamGETservices/team_in_detail/
/edition_formatGETservices/edition/edition_format/
/edition_format_detailGETservices/edition/edition_format_detail/
/categoryGETservices/category/
/category_fixtureGETservices/category/fixture/
/matchesGET, PUT, DELETEservices/matches/
/players_teams_linkPUTservices/players_team_link/
/players_teams_unlinkPUTservices/players_teams_unlink/
/teamGETservices/team/

STACK_TORNEOS

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayTorneos313$ENV (renombrado de Torneos$ENV)
TemplateSTACK_TORNEOS/torneosDev313.yaml
Funciones Lambda95
Endpoints36 paths
Cognitous-east-2_1WuxwXceK
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/$DD_ENV)
Layer propio!Ref LayerTorneos
Líneas template1,471 (optimizado)

Cambios respecto a Python 3.9

  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) en lugar de recurso LayerCommon
  • EndpointConfiguration: Type: REGIONAL en API Gateway
  • Eliminado DeploymentPreference de Globals
  • Eliminado recurso LayerCommon (reemplazado por SSM)
  • Globals optimization: Timeout: 10, MemorySize: 512, Layers movidos a Globals (funciones solo declaran overrides). Role se mantiene por función (no soportado en Globals por SAM CLI).

Recursos renombrados (evitar colisión con Prod_new)

RecursoNombre originalNombre 313
API GatewayTorneos$ENVTorneos313$ENV
LogGroupapi-gateway/mas10-torneos-api-8/$ENVapi-gateway/mas10-torneos-api-313/$ENV
EventBridge warmingtorneos-warming-rule-$ENVtorneos313-warming-rule-$ENV
Schedule tournamentSCHEDULE_TOURNAMENT_PUT_$ENVSCHEDULE_TOURNAMENT_PUT_313_$ENV
Schedule statisticsSCHEDULE_TEAM_STATISTICS_GET_1$ENVSCHEDULE_TEAM_STATISTICS_GET_313_$ENV

Fix especial: MyPostulationDelete

La función MyPostulationDelete tenía indentación incorrecta en el template original (6 espacios en vez de 4 para Type:). Se corrigió la indentación durante la migración.

Módulos del layer propio (layer/)

MóduloDescripción
database_torneos/Lógica de dominio PostgreSQL de torneos
querys_torneo/Templates SQL del stack
utils_torneos/Utilidades específicas
aws_recursos/Helpers AWS (S3, etc.)
wordpress_recursos/Integración WordPress

Endpoints (36 paths)

PathServicios
/credential/Credenciales
/current-localitysLocalidades actuales
/data-api-footballAPI football externa
/documents/Documentos
/favourite-itemsFavoritos
/feed_mas10Feed v1
/feed_mas10_v3Feed v3
/ficha-partidoFicha de partido
/fixture-matchesPartidos de fixture
/get-note-typeTipos de nota
/get-team-userEquipos por usuario
/invitationInvitaciones
/league-by-userLigas por usuario
/leave-teamAbandonar equipo
/matchPartidos
/match-detailsDetalles de partido
/match-veedorVeedor de partido
/my-postulationPostulaciones propias
/perfiles/torneo/statistics/Estadísticas de perfil en torneo
/perfiles/torneo/teams/Equipos de perfil en torneo
/pi-create-matchCrear picadito
/pi-groupGrupos de picadito
/pi-matchesPartidos de picadito
/pi-members-matchMiembros de picadito
/pi-my-matchesMis picaditos
/postulationsPostulaciones
/rancking-fans-by-tournamentRanking de fans
/scorePuntuación
/select-teamSelección de equipo
/send-codeEnvío de código
/statisticsEstadísticas
/statistics-detailsDetalles de estadísticas
/statistics_v2Estadísticas v2
/tournament-demoTorneo demo
/tournament-friendlyTorneo amistoso
/user-by-typeUsuarios por tipo

Guía paso a paso para migrar un stack

Checklist completa basada en los errores y fixes encontrados migrando STACK_BACKOFFICE, STACK_BACKOFFICE_CONTENT y STACK_BACKOFFICE_TOURNAMENT.

Pre-requisitos

  • Estar en la rama dev_313
  • Layer common ARM64 publicado y SSM actualizado (/mas10/layers/common/arm64/dev_313)

Paso 1 — Obtener el stack desde Prod_new

# Traer los archivos del stack desde la rama Prod_new
git checkout origin/Prod_new -- STACK_{NOMBRE}/

Paso 2 — Transformar el template base ({stack}.yaml)

Aplicar todos estos cambios en el archivo {stack}.yaml (el base, no el Dev313):

2.1 Comentar Datadog Transform

# ANTES
Transform:
- AWS::Serverless-2016-10-31
- Name: DatadogServerless
Parameters: ...

# DESPUÉS
Transform:
- AWS::Serverless-2016-10-31
# - Name: DatadogServerless
# Parameters: ...

2.2 Agregar parámetro SSM para layer common

Parameters:
CommonLayerArn:
Type: AWS::SSM::Parameter::Value<String>
Default: /mas10/layers/common/arm64/dev_313

2.3 Actualizar Globals

Globals:
Function:
Timeout: 30
Runtime: python3.13
Architectures:
- arm64

2.4 Eliminar el recurso LayerCommon completo

El layer common ahora viene por SSM. Eliminar todo el bloque LayerCommon: Type: AWS::Serverless::LayerVersion.

2.5 Reemplazar todas las referencias al layer

# ANTES
Layers:
- !Ref LayerCommon
- !Ref Layer{StackName}

# DESPUÉS
Layers:
- !Ref CommonLayerArn
- !Ref Layer{StackName}

2.6 Actualizar layer propio del stack

Layer{StackName}:
Type: AWS::Serverless::LayerVersion
Properties:
CompatibleRuntimes:
- python3.13
CompatibleArchitectures:
- arm64
Metadata:
BuildMethod: python3.13

2.7 Eliminar propiedades por función (heredan de Globals)

De cada función Lambda, eliminar:

  • Runtime: (hereda python3.13 de Globals)
  • DeploymentPreference: (no necesario)
  • FunctionName: (dejar que CloudFormation genere el nombre)

2.8 Configurar API Gateway como REGIONAL

MyApi:
Type: AWS::Serverless::Api
Properties:
EndpointConfiguration:
Type: REGIONAL

⚠️ La cuenta tiene un límite de 120 APIs EDGE. Todos los stacks nuevos deben usar REGIONAL.

2.9 Comentar SubscriptionFilter de Datadog

# DatadogPocLogGroupSubscriptionFilter:
# Type: AWS::Logs::SubscriptionFilter
# ...

Paso 3 — Renombrar recursos con nombre explícito (CRÍTICO)

Este es el error más difícil de diagnosticar. CloudFormation tiene un hook EarlyValidation::ResourceExistenceCheck que rechaza crear recursos cuyo nombre ya existe en la cuenta pero fuera del stack.

Los stacks de Prod_new ya crearon recursos con nombres como botournamentDEV o api-gateway/mas10-botournament-api1/dev. El stack 313 es un stack nuevo, así que CloudFormation no puede crear recursos con el mismo nombre.

Buscar y renombrar todos los recursos con Name o LogGroupName hardcodeados:

# API Gateway — agregar sufijo "313"
# ANTES
Name: botournament$ENV # → botournamentDEV (ya existe)
# DESPUÉS
Name: botournament313$ENV # → botournament313DEV (nuevo)

# LogGroup — agregar sufijo "-313"
# ANTES
LogGroupName: "api-gateway/mas10-botournament-api1/$DD_ENV" # ya existe
# DESPUÉS
LogGroupName: "api-gateway/mas10-botournament-api-313/$DD_ENV" # nuevo

Recursos a revisar:

  • AWS::Serverless::Api → propiedad Name
  • AWS::Logs::LogGroup → propiedad LogGroupName
  • Cualquier otro recurso con nombre explícito (DynamoDB tables, SQS queues, etc.)

Paso 4 — Verificar el build script

El archivo build_{stack}.sh debe apuntar al stack correcto:

# Verificar que el nombre sea correcto (no copiado de otro stack)
bash ../deploy.sh {stack_correcto} $ubi $enviroment

Paso 5 — Optimizar template con Globals

Mover propiedades repetidas a Globals para reducir líneas y facilitar mantenimiento:

Globals:
Function:
Timeout: 10 # valor más común del stack
MemorySize: 256 # valor más común del stack
Runtime: python3.13
Architectures:
- arm64
Layers:
- !Ref LayerStackName
- !Ref CommonLayerArn

⚠️ Role NO es soportado en Globals por SAM CLI. Debe declararse en cada función individualmente.

Luego eliminar de cada función las propiedades que ya heredan de Globals (Timeout, MemorySize, Layers). Solo mantener las que tengan valores diferentes (overrides). Role: $ROLE debe permanecer en cada función.

Tip: Identificar el valor más frecuente de cada propiedad con grep -c "Timeout: 10" stack.yaml y moverlo a Globals. Funciones con valores distintos conservan su propiedad como override.

Paso 6 — Commit y push

git add STACK_{NOMBRE}/
git commit -m "feat: migrate STACK_{NOMBRE} to Python 3.13 ARM64"
git push origin dev_313

Paso 7 — Verificar deploy en pipeline

Si el deploy falla:

  1. Unable to upload artifact LayerCommon → Faltó eliminar el recurso LayerCommon del template (Paso 2.4)
  2. EarlyValidation::ResourceExistenceCheck → Hay recursos con nombres que ya existen en la cuenta (Paso 3). Verificar con:
    aws logs describe-log-groups --log-group-name-prefix "api-gateway/mas10-{stack}" --region us-east-1
    aws apigateway get-rest-apis --query "items[?contains(name,'{stack}')]" --region us-east-1
  3. REVIEW_IN_PROGRESS → El stack quedó colgado de un intento anterior. deploy.sh ahora lo borra automáticamente antes de reintentar.
  4. limit of 120 apis for EDGE endpoint type → Faltó agregar EndpointConfiguration: Type: REGIONAL al API Gateway (Paso 2.8).
  5. CREATE_FAILED — {ResourceName} already exists in stack {stackViejo} → Recursos con nombre explícito (FunctionName, Name, UsagePlanName) que pertenecen al stack viejo. Ver sección Conflicto de nombres entre stacks para procedimiento detallado.

Conflicto de nombres entre stacks (FunctionName, ApiKey, UsagePlan, etc.)

Caso real: STACK_BACKOFFICE — TeamExternalPutDEV y Backoffice-External-DEV fallaban con CREATE_FAILED: already exists in stack backOfficeDev.

Causa raíz: Cuando un recurso tiene nombre explícito (ej: FunctionName: TeamExternalPut$ENV, Name: Backoffice-External-$ENV) CloudFormation mantiene la propiedad de ese nombre en el stack viejo aunque el recurso se borre de AWS. El stack nuevo intenta crear un recurso con el mismo nombre → CloudFormation lo rechaza porque "pertenece" al otro stack.

Aplica a cualquier recurso con nombre hardcodeado:

  • AWS::Lambda::FunctionFunctionName
  • AWS::ApiGateway::ApiKey → propiedad Name
  • AWS::ApiGateway::UsagePlanUsagePlanName
  • AWS::ApiGateway::UsagePlanKey → combinación ApiKey+UsagePlan
  • AWS::Logs::LogGroupLogGroupName
  • AWS::SQS::QueueQueueName
  • AWS::Events::RuleName

Diagnóstico:

# Ver todos los recursos con nombres explícitos en el template 313
grep -n "FunctionName:\|Name:\|LogGroupName:\|QueueName:\|UsagePlanName:" {stack}.yaml | grep -v "#"

# Ver a qué stack pertenecen en CloudFormation
aws cloudformation list-stack-resources --stack-name {stackViejo} \
--query 'StackResourceSummaries[?contains(LogicalResourceId, `External`) || contains(LogicalResourceId, `ApiKey`)].{Logical:LogicalResourceId,Physical:PhysicalResourceId,Type:ResourceType}' \
--profile local --region us-east-1 --output table

Fix (3 pasos):

Paso A: Eliminar DeletionPolicy: Retain, UpdateReplacePolicy: Retain y Runtime: python3.9 de las funciones afectadas en {stack}.yaml (template del nuevo stack 313).

Paso B: Actualizar el template del stack viejo eliminando todos los recursos conflictivos (funciones, ApiKeys, UsagePlans, permissions, paths del swagger y Outputs que los referencien).

# 1. Obtener el template actual del stack viejo (output es JSON con TemplateBody como dict)
aws cloudformation get-template --stack-name {stackViejo} \
--profile local --region us-east-1 --output json > /tmp/stack_viejo.json

# 2. Usar script Python para limpiar (ejemplo real de STACK_BACKOFFICE)
python3 << 'PYEOF'
import json
with open('/tmp/stack_viejo.json') as f:
d = json.load(f)
tb = d['TemplateBody']
resources = tb['Resources']

# Recursos a eliminar (funciones + permissions + ApiKey + UsagePlan)
to_remove = [
'TeamExternalPut', 'TeamExternalOptions',
'TeamExternalPutPutTeamExternalPermissiondev',
'TeamExternalOptionsOptionsTeamExternalPermissiondev',
'BackofficeExternalApiKey',
'BackofficeExternalUsagePlan',
'BackofficeExternalUsagePlanKey',
]
for key in to_remove:
if key in resources:
del resources[key]
print(f'Removed resource: {key}')

# Limpiar paths del swagger del API Gateway
api_key = 'BackofficeDevApi'
if api_key in resources:
paths = resources[api_key].get('Properties', {}).get('Body', {}).get('paths', {})
for p in ['/team/external']:
if p in paths:
del paths[p]
print(f'Removed API path: {p}')

# Limpiar Outputs que referencien recursos eliminados
for oname in list(tb.get('Outputs', {}).keys()):
s = json.dumps(tb['Outputs'][oname])
for r in to_remove:
if r in s:
del tb['Outputs'][oname]
print(f'Removed output: {oname}')
break

# Verificar 0 referencias restantes
remaining = json.dumps(tb).count('TeamExternal') + json.dumps(tb).count('BackofficeExternal')
print(f'Referencias restantes: {remaining}') # DEBE ser 0

with open('/tmp/stack_viejo_clean.json', 'w') as f:
json.dump(tb, f)
PYEOF

# 3. Subir a S3 (template > 51KB no se puede enviar directo)
aws s3 cp /tmp/stack_viejo_clean.json \
s3://{BUCKET_DEPLOY}/tmp/stack_viejo_clean.json \
--profile local --region us-east-1

# 4. Actualizar el stack viejo
aws cloudformation update-stack \
--stack-name {stackViejo} \
--template-url "https://{BUCKET_DEPLOY}.s3.us-east-1.amazonaws.com/tmp/stack_viejo_clean.json" \
--capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND \
--profile local --region us-east-1

# 5. Esperar
aws cloudformation wait stack-update-complete \
--stack-name {stackViejo} --profile local --region us-east-1

Paso C: Re-disparar el pipeline del stack 313 (push o commit vacío).

git commit --allow-empty -m "fix({stack}): re-trigger deploy after releasing names from {stackViejo}"
git push origin dev_313

⚠️ Replicar en QA y PROD: Este mismo problema ocurrirá al migrar a QA (backOfficeQabackOfficeQa313) y PROD (backOfficeProdbackOfficeProd313). Aplicar el mismo procedimiento cambiando el nombre del stack y el sufijo de entorno.

Resumen de archivos que se modifican por stack

ArchivoCambio
STACK_{NOMBRE}/{stack}.yamlTemplate base transformado (pasos 2 y 3)
STACK_{NOMBRE}/build_{stack}.shVerificar nombre correcto (paso 4)
docs/MIGRACION_313_STACKS.mdAgregar entrada del stack migrado

Archivos de infra que ya están corregidos (no tocar)

ArchivoFix aplicado
deploy.shAuto-delete de stacks en REVIEW_IN_PROGRESS + diagnóstico con describe-stack-events
deploy_smart.shMismo fix de REVIEW_IN_PROGRESS
config_templates.shFunciones config_templates_dev_313, qa_313, prod_313
publish_layer.shPublicación de layer ARM64 + SSM

STACK_FLOW_CHANNEL

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API Gatewayflow313$ENV (renombrado de flow$ENV)
TemplateSTACK_FLOW_CHANNEL/flowchannelDev313.yaml
Funciones Lambda5
Endpoints4 paths
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propioninguno
Líneas template~115

Cambios respecto a Python 3.9

  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) — eliminado recurso LayerCommon inline
  • EndpointConfiguration: Type: REGIONAL en API Gateway (ya existía)
  • Eliminado DeploymentPreference: Enabled: false de cada función
  • Globals optimization: Timeout: 200, MemorySize: 512, Layers movidos a Globals. AddChannelOptions mantiene override Timeout: 10, MemorySize: 128. Role se mantiene por función (no soportado en Globals por SAM CLI).
  • LogGroup renombrado para evitar colisión con Prod_new

Recursos renombrados (evitar colisión con Prod_new)

RecursoNombre originalNombre 313
API Gatewayflow$ENVflow313$ENV
LogGroupapi-gateway/mas10-flow-api/$ENVapi-gateway/mas10-flow-api-313/$ENV

Endpoints

PathMétodosHandler
/FlowChannelPOSTpost.lambda_handler
/AddChannelPOST, OPTIONSadd_channel.lambda_handler, option.lambda_handler
/SendImagePOSTsend_image.lambda_handler
/SendMessagePOSTsend_message.lambda_handler

STACK_PERFIL

Resumen

AtributoValor
RuntimePython 3.13
ArquitecturaARM64 (Graviton)
API GatewayPerfil313$ENV (renombrado de Perfil$ENV)
TemplateSTACK_PERFIL/perfil.yaml
Funciones Lambda40
Endpoints17 paths
Cognitous-east-2_1WuxwXceK
Layer común!Ref CommonLayerArn (SSM: /mas10/layers/common/arm64/dev_313)
Layer propio!Ref LayerPerfil
Líneas template~800 (optimizado)

Cambios respecto a Python 3.9

  • Datadog eliminado por completo: Transform, DD_SERVICE/DD_ENV env vars, DD_TRACE/DD_SERVERLESS/DD_TELEMETRY overrides, tags DD_ENV/DD_SERVICE del LogGroup, DatadogPocLogGroupSubscriptionFilter, apiKey hardcodeado
  • Runtime: python3.13 en Globals
  • Architectures: [arm64] en Globals
  • Layers movido a Globals: [LayerPerfil, CommonLayerArn]
  • Layer común referenciado vía SSM Parameter (CommonLayerArn) — eliminado recurso LayerCommon
  • EndpointConfiguration: Type: REGIONAL en API Gateway
  • DependsOn: PerfilAPiLogGroup en API Gateway
  • AccessLogSetting.DestinationArn cambiado de !GetAtt PerfilAPiLogGroup.Arn a !Sub "arn:aws:logs:..."
  • Eliminado Timeout: 10 y Timeout: 30 por función (heredan de Globals)
  • Eliminado Layers: por función (heredan de Globals)
  • LayerPerfil: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13
  • Role se mantiene por función (no soportado en Globals por SAM CLI)

Recursos renombrados (evitar colisión con Prod_new)

RecursoNombre originalNombre 313Estrategia
API GatewayPerfil$ENVPerfil313$ENVRenombrado
LogGroupapi-gateway/mas10-profile-api-4/$DD_ENVapi-gateway/mas10-profile-api-313/$DD_ENVRenombrado
FunctionNameStatsRefreshGetV2$ENVStatsRefreshGetV2$ENVStack viejo eliminado
FunctionNameStatsRefreshGet$ENVStatsRefreshGet$ENVStack viejo eliminado
FunctionNameTrajectoryGet$ENVTrajectoryGet$ENVStack viejo eliminado
FunctionNameTournamentHistoryGet$ENVTournamentHistoryGet$ENVStack viejo eliminado
SQS Queuesqs_stats_refresh$ENV.fifosqs_stats_refresh$ENV.fifoStack viejo eliminado
EventBridge warmingperfil-warming-rule-$ENVperfil-warming-rule-$ENVStack viejo eliminado

Nota: Los FunctionNames, SQS Queue y EventBridge se mantienen con nombres originales porque son invocados por otros servicios. Se eliminó el stack viejo perfilDev para liberar los nombres. El dominio profiledev.liricus.com.ar se preservó y su base path mapping se reconfigura post-deploy.

Módulos del layer propio (layer/)

MóduloDescripción
database_perfil/Lógica de dominio PostgreSQL del perfil
query_perfil/Templates SQL del stack
utils_perfil/Utilidades específicas
email_send/Helper de envío de emails

Endpoints

PathMétodos
/check-versionGET, OPTIONS
/coach-athletesGET, OPTIONS
/e-mailPOST, OPTIONS
/languagesGET, PUT, OPTIONS
/like-noteGET, POST, OPTIONS
/location/GET, POST, PUT, DELETE, OPTIONS
/next-play-by-userGET, OPTIONS
/profileGET, PUT, DELETE, OPTIONS
/registerPOST, OPTIONS
/sticker-borderGET, OPTIONS
/summaryGET, OPTIONS
/summary/teamsGET
/terms-and-conditionsPOST
/tipsGET, OPTIONS
/tockeGET, OPTIONS
/tournament-historyGET
/trajectoryGET, OPTIONS

STACK_WIDGETS

Metadata

CampoValor
Rama origenProd_new
Stack DEVwidgetsDev (eliminado) → widgetsDev313
TemplateSTACK_WIDGETS/widgets.yaml
Funciones8 Lambdas (7 Refresh* schedulers + 1 API endpoint)
Otros recursosDynamoDB ContentTable, SQS FIFO sqs_transfer_market_refresh, EventBridge warming rule

Cambios aplicados

  • Runtime: python3.13, Architectures: arm64 en Globals
  • MemorySize: 512 en Globals (default); funciones Refresh* mantienen override MemorySize: 1024, Timeout: 840
  • Layers: [LayerWidgets, SSM CommonLayer] en Globals; eliminados por función
  • Datadog Transform eliminado por completo
  • DD_SERVICE y DD_ENV eliminados de variables de entorno
  • DatadogPocLogGroupSubscriptionFilter eliminado
  • LayerCommon resource eliminado → SSM /mas10/layers/common/arm64/dev_313
  • LayerWidgets: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13
  • API renombrada Widgets313$ENV, DependsOn: WidgetsApiLogGroup, EndpointConfiguration: REGIONAL
  • AccessLogSetting corregido a !Sub ARN (evita EarlyValidation)
  • WidgetsApiLogGroup renombrado: mas10-widgets-api-313/$ENV, tags DD eliminados
  • Schedule Names: $DD_ENV$ENV
  • ContentTable DynamoDB: deletion protection deshabilitada para dev; tabla recreada por nuevo stack

Resolución de conflictos

RecursoEstrategia
widgetsDev stackEliminado (libera FunctionNames)
widgetdev.liricus.com.arBase path mapping eliminado; dominio preservado para recrear post-deploy
ContentDEV DynamoDBDeletion protection deshabilitada; tabla eliminada con stack; recreada por widgetsDev313

Post-deploy pendiente

# Recrear base path mapping para widgetdev.liricus.com.ar
API_ID=$(aws apigateway get-rest-apis --query "items[?name=='Widgets313DEV'].id" --output text --region us-east-1 --profile local)
aws apigateway create-base-path-mapping --domain-name widgetdev.liricus.com.ar --rest-api-id "$API_ID" --stage dev --region us-east-1 --profile local

Módulos del layer propio (layer/)

MóduloDescripción
database_widgets/Lógica de dominio del stack
querys_widgets/Templates SQL

Funciones

FunciónHandlerTriggerTimeoutMemorySize
RefreshMarketPlaceTrigger$ENVtrigger.lambda_handlerAPI POST /refresh-trigger8401024
RefreshMarketPlace$ENVpost.lambda_handlerSQS + Schedule cron(0 00 * * ? *)8401024
RefreshMyTeam$ENVpost.lambda_handlerSchedule cron(0 00 * * ? *)8401024
RefreshProdeMatch$ENVpost.lambda_handlerSchedule cron(0 00 * * ? *)8401024
RefreshNotes$ENVpost.lambda_handlerSchedule cron(0 00 * * ? *)8401024
RefreshComplexs$ENVpost.lambda_handlerSchedule cron(0 00 * * ? *)8401024
RefreshTraining$ENVpost.lambda_handlerSchedule cron(0 00 * * ? *)8401024
GetFeedWidgets$ENVget.lambda_handlerAPI GET /feed100512

STACK_COMUNIDAD

Metadata

CampoValor
Rama origenProd_new
Stack DEVcomunidadDev (eliminado) → comunidadDev (nuevo)
TemplateSTACK_COMUNIDAD/comunidad.yaml
Funciones39 Lambdas
Otros recursosEventBridge warming rule, API Key + UsagePlan (Transfermarket)

Cambios aplicados

  • Runtime: python3.13, Architectures: arm64 en Globals
  • Timeout: 100, MemorySize: 512 en Globals (era Timeout: 30 en Globals sin MemorySize); eliminados por función
  • Layers: [LayerComunidad, SSM CommonLayer] en Globals; eliminados por función
  • LayerCommon resource eliminado → SSM /mas10/layers/common/arm64/dev_313
  • LayerComunidad: CompatibleRuntimes: python3.13, BuildMethod: python3.13, BuildArchitecture: arm64
  • API renombrada Comunidad313$ENV, DependsOn: ComunidadAPiLogGroup, EndpointConfiguration: REGIONAL
  • AccessLogSetting corregido a !Sub ARN (evita EarlyValidation)
  • ComunidadAPiLogGroup renombrado: mas10-comunidad-api-313/$ENV, tags DD eliminados
  • DeploymentPreference: Enabled: false eliminado de 5 funciones
  • $DD_ENV eliminado (era solo en LogGroupName)

Resolución de conflictos

RecursoEstrategia
comunidadDev stackEliminado (libera FunctionNames explícitos)
comunidaddev.liricus.com.arBase path mapping eliminado; dominio preservado para recrear post-deploy
comunidadQa stackPendiente (eliminar antes de deploy QA)

Post-deploy pendiente

# Recrear base path mapping para comunidaddev.liricus.com.ar
API_ID=$(aws apigateway get-rest-apis --query "items[?name=='Comunidad313DEV'].id" --output text --region us-east-1 --profile local)
aws apigateway create-base-path-mapping --domain-name comunidaddev.liricus.com.ar --rest-api-id "$API_ID" --stage dev --region us-east-1 --profile local

Overrides por función (excepciones a los Globals)

FunciónOverrideMotivo
ChatMessageNameMigrationMemorySize: 1024Tarea de migración pesada
OldChatMessageMigrationMemorySize: 1024Tarea de migración pesada
MessageChatSessionGetMemorySize: 1024 + Layers: [SSM]Solo usa layer común (sin LayerComunidad)
ChatTransfermarketPostEnvironment.API_KEY_ENABLED: "true" + Auth: NONEEndpoint con API Key externa

Módulos del layer propio (layer/)

MóduloDescripción
database_comunidad/Operaciones DynamoDB de mensajería y canales
querys_comunidad/Queries del dominio
utils_comunidad/Formateador de respuestas, utilidades

STACK_FOLLOWERS

Metadata

CampoValor
Rama origenProd_new
Stack DEVfollowersDev (eliminado) → nuevo
TemplateSTACK_FOLLOWERS/followers.yaml
Funciones9 Lambdas
Otros recursosEventBridge warming rule, API Key + UsagePlan (endpoints externos)

Cambios aplicados

  • Runtime: python3.13, Architectures: arm64 en Globals
  • Timeout: 60, MemorySize: 256 en Globals (era Timeout: 30); eliminados por función
  • Layers: [LayerFollowers, SSM CommonLayer] en Globals; eliminados por función (ambas ordenes)
  • LayerCommon resource eliminado → SSM /mas10/layers/common/arm64/dev_313
  • LayerFollowers: CompatibleRuntimes: python3.13, BuildMethod: python3.13, BuildArchitecture: arm64
  • API renombrada Followers313$ENV, DependsOn: FollowersAPiLogGroup, EndpointConfiguration: REGIONAL
  • AccessLogSetting corregido a !Sub ARN (evita EarlyValidation)
  • FollowersAPiLogGroup: indentación corregida (6→4 espacios), LogGroupName: "mas10-followers-api-313/$ENV" agregado
  • DeploymentPreference: Enabled: false eliminado de todas las funciones
  • DeletionPolicy: Retain + UpdateReplacePolicy: Retain preservados en 6 funciones

Resolución de conflictos

RecursoEstrategia
followersDev stackEliminado (libera FunctionNames explícitos)
followersdev.liricus.com.arBase path mapping eliminado; dominio preservado para recrear post-deploy
followersQa stackPendiente (eliminar antes de deploy QA)

Post-deploy pendiente

# Recrear base path mapping para followersdev.liricus.com.ar
API_ID=$(aws apigateway get-rest-apis --query "items[?name=='Followers313DEV'].id" --output text --region us-east-1 --profile local)
aws apigateway create-base-path-mapping --domain-name followersdev.liricus.com.ar --rest-api-id "$API_ID" --stage dev --region us-east-1 --profile local

Módulos del layer propio (layer/)

MóduloDescripción
database_followers/Operaciones PostgreSQL del dominio
querys_followers/Templates SQL
utils_followers/Utilidades específicas
subs_old/Lógica legacy de subscripciones

Funciones y endpoints

FunciónPathMétodoNotas
FollowProfilePost$ENV/follow_profilePOSTDeletionPolicy: Retain
FollowProfileDelete$ENV/follow_profileDELETEDeletionPolicy: Retain
FollowProfilePut$ENV/follow_profilePUTDeletionPolicy: Retain
FollowProfileOptions$ENV/follow_profileOPTIONSDeletionPolicy: Retain, Auth: NONE
FollowProfileExternal$ENV/external/follow_profilePOSTDeletionPolicy: Retain, ApiKeyRequired: true, Auth: NONE
FollowProfileExternalOptions$ENV/external/follow_profileOPTIONSDeletionPolicy: Retain, Auth: NONE
SearchProfilesGet$ENV/search_profilesGETAuth: NONE
SearchProfilesOptions$ENV/search_profilesOPTIONSAuth: NONE
FeedRecommendationsGet$ENV/feedrecommendationsGETWarming target

STACK_MONITOREO

Metadata

CampoValor
Rama origenProd_new
Stack DEVmonitoreoDev (existente, sin conflictos de nombres) → nuevo monitoreoDev313
TemplateSTACK_MONITOREO/monitoreo.yaml
Funciones59 Lambdas
Otros recursosEventBridge Schedule (SCHEDULE_MONITOREO_$ENV)

Cambios aplicados

  • Runtime: python3.13, Architectures: arm64 en Globals
  • Timeout: 30, MemorySize: 512 en Globals (valores más comunes); eliminados por función
  • Layers: [LayerMonitoreo, CommonLayerArn] en Globals; eliminados por función
  • DD_SERVICE y DD_ENV eliminados de variables de entorno en Globals
  • Datadog Transform comentado por completo
  • DatadogPocLogGroupSubscriptionFilter comentado
  • LayerCommon resource eliminado → SSM /mas10/layers/common/arm64/dev_313
  • LayerChromedriver resource eliminado (no referenciado por ninguna función)
  • LayerMonitoreo: CompatibleRuntimes: python3.13, CompatibleArchitectures: arm64, BuildMethod: python3.13
  • API renombrada Monitoreo313$ENV, DependsOn: MonitoreoAPiLogGroup, EndpointConfiguration: REGIONAL
  • AccessLogSetting corregido a !Sub ARN (evita EarlyValidation)
  • MonitoreoAPiLogGroup renombrado: mas10-monitoreo-api-313/$ENV, tags DD eliminados
  • DeletionPolicy: Retain + UpdateReplacePolicy: Retain eliminados de 2 funciones (AthletesWithOlmV2Get, AthletesWithOlmV2Options)
  • DeploymentPreference: Enabled: false eliminado de 3 funciones
  • FunctionName: ...$DD_ENV$ENV en 3 funciones (StatisticsMonitoringUserGet, GraficosOptions, GraficosGet)
  • Schedule: SCHEDULE_MONITOREO_$DD_ENVSCHEDULE_MONITOREO_$ENV

Resolución de conflictos

RecursoEstrategia
monitoreoDev stackSIN conflictos — $DD_ENV (lowercase) vs $ENV (uppercase) genera nombres distintos
monitoreodev.liricus.com.arBase path mapping apunta a Monitoreodev; actualizar post-deploy a Monitoreo313DEV

Post-deploy pendiente

API_ID=$(aws apigateway get-rest-apis --query "items[?name=='Monitoreo313DEV'].id" --output text --region us-east-1 --profile local)
aws apigateway delete-base-path-mapping --domain-name monitoreodev.liricus.com.ar --base-path "(none)" --region us-east-1 --profile local
aws apigateway create-base-path-mapping --domain-name monitoreodev.liricus.com.ar --rest-api-id "$API_ID" --stage dev --region us-east-1 --profile local

Módulos del layer propio (layer/)

MóduloDescripción
database_monitoreo/Lógica de dominio PostgreSQL + DynamoDB del monitoreo
utils_monitoreo/Utilidades específicas (channel, monitoring_group, response_formatter)
aws_recursos/Helpers AWS (S3)
email_send/Helper de envío de emails
gene_pdf/Generación de PDFs
warrant/Wrapper Cognito
wordpress_recursos/Integración WordPress

Overrides por función

FunciónTimeoutMemorySizeNotas
CompetitionDayMonitoringPost2001024
CreateTrainingMonitoringPut3001024
CronNotificationMonitoringPost5001024+ Schedule cron(0 * * * ? *)
CronNotificationMonitoringOptions500
GroupMonithoringAthletesPendingGet1024
StatisticsLesionesUser*300
StatisticsMonitoringUserGet200FunctionName: StatisticsMonitoringUserGet$ENV
UserLesiones*300
VideosTuto*300
GraficosOptions3001024FunctionName: GraficosOptions$ENV
GraficosGet3001024FunctionName: GraficosGet$ENV
GMAthletesDOne*300