Introducción: Por qué Serverless y PHP no son un oxímoron
Durante mucho tiempo se consideró que PHP y la arquitectura serverless eran incompatibles. PHP se asociaba con procesos eternos de Apache o Nginx, y serverless con Node.js o Python. Sin embargo, con la aparición de herramientas como Bref y el soporte oficial de entornos de ejecución personalizados (Custom Runtimes) en AWS Lambda, PHP ha cobrado un segundo aire.
Las funciones serverless permiten ejecutar código PHP sin gestionar un servidor. Solo paga por el tiempo de ejecución real (con precisión de milisegundos). Es la solución ideal para:
- Manejadores de webhooks (Telegram, Stripe, Slack);
- Microservicios con baja carga;
- Tareas periódicas (cron) mediante CloudWatch Events;
- API proxy y backends ligeros.
En este artículo, analizaremos cómo poner PHP en AWS Lambda desde cero: desde la creación de roles IAM hasta el despliegue de una función funcional.
1. Arquitectura de PHP en AWS Lambda
Cómo funciona Custom Runtime
AWS Lambda solo admite de forma nativa Java, Go, PowerShell, Node.js, C#, Python y Ruby. Para ejecutar PHP, utilizamos un Custom Runtime — un archivo ejecutable especial (bootstrap) que se comunica con la API de Lambda Runtime.
La forma más popular es el framework Bref. Viene con una capa (Layer) predefinida que contiene PHP 8.x, Composer y un conjunto de extensiones estándar.
// Estructura del proyecto para Brefproject/├── index.php // Punto de entrada├── composer.json├── serverless.yml // Configuración de despliegue└── vendor/Tres formas de desplegar
- Bref (recomendado) — la más sencilla. Usa serverless.yml y capas predefinidas.
- Compilación manual — compila PHP para Amazon Linux 2 y lo empaqueta en un ZIP.
- Imagen Docker — usa Lambda Container Image (compatible desde 2020).
Analizaremos la primera opción, que es adecuada para el 90% de las tareas.
2. Configuración paso a paso: desde la instalación hasta la primera solicitud
Paso 1. Preparación del entorno
Asegúrese de tener instalado:
- PHP 8.0+ (localmente)
- Composer
- Node.js y npm (para Serverless Framework)
- La utilidad
aws-clicon credenciales configuradas
Instalamos Serverless Framework globalmente:
npm install -g serverlessPaso 2. Creamos el proyecto
composer create-project bref/bref my-php-lambdacd my-php-lambdaDespués de la inicialización, verá el archivo serverless.yml. Lo editamos:
service: my-php-app
provider: name: aws region: eu-central-1 # Elija la región más cercana runtime: provided.al2 # Amazon Linux 2
plugins: - ./vendor/bref/bref
functions: hello: handler: index.php description: 'Función PHP simple' layers: - ${bref:layer.php-80} # Capa con PHP 8.0Paso 3. Escribimos la función
Abra index.php:
<?php
require __DIR__ . '/vendor/autoload.php';
/** * Manejador de la función Lambda * @param array $event Datos de entrada de AWS (API Gateway, SQS, etc.) * @return array Respuesta en formato JSON */function handler(array $event): array{ // Registramos en CloudWatch error_log('Solicitud recibida: ' . json_encode($event));
$name = $event['queryStringParameters']['name'] ?? 'Invitado';
return [ 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'application/json', ], 'body' => json_encode([ 'message' => "¡Hola, {$name}!", 'timestamp' => time(), ]), ];}