Symfony 4 en Google AppEngine

Javi H. Gil
5 min readFeb 22, 2018

--

En este artículo vamos a ver como desplegar un proyecto Symfony 4 en Google AppEngine en pocos minutos.

Google AppEngine

Según la página de producto de Google:

Google App Engine es una plataforma con la que puedes crear aplicaciones web y backends móviles escalables.

Google AppEngine es un servicio PaaS de Google Cloud que nos permite desplegar una aplicación en cuestión de minutos y escalarla sin mucho esfuerzo. Se integra perfectamente con las API de Google y otros servicios, como CloudSQL.

Tiene dos modalidades: standard y flexible. La primera ofrece un servicio de pago por uso, si tu aplicación no tiene tráfico no te cuesta nada. En el caso de la modalidad flexible ejecuta al menos una instancia por lo que tiene coste.

El primer problema con el que nos encontramos en AppEngine con PHP es que, a estas alturas, la modalidad standard sólo da soporte para PHP5!!! En Google parecen no dar mucha importancia a PHP :(

Por lo tanto, para poder ejecutar Symfony 4 que requiere PHP ≥ 7.1.3 utilizaremos entorno flexible.

Precedentes

Hace un tiempo realicé pruebas para ejecutar una aplicación Symfony 3 en Google AppEngine, con resultados decepcionantes.

El entorno flexible no ha estado disponible para PHP hasta no hace demasiado tiempo, así que en aquella ocasión utilicé el entorno standard.

El principal problema que encontré es que el sistema de archivos de Google AppEngine standard es de sólo lectura. Esto es un problema para las cachés de Symfony, sobre todo en versión 3.

Siguiendo algunos artículos sobre el problema conseguí, modificando algunas cosas del kernel de Symfony, escribir la caché en Google Storage y hacerlo funcionar. Sin embargo, el rendimiento no era bueno y el coste de las API de Google Storage por lecturas de caché para una aplicación con un tráfico medio/alto se disparaba.

Crear el proyecto de Google Cloud

Manos a la obra.

Lo primero que haremos es crear el proyecto desde Google Cloud o con el comando gcloud desde consola:

$ gcloud projects create symfony4-gae-test

Una vez creado el proyecto, si vamos a la sección de AppEngine desde el menú de la izquierda nos indicará qué no tenemos aún ningún servicio AppEngine en el proyecto y nos muestra tutoriales y enlaces a la documentación.

Crear el proyecto de Symfony 4

Para crear nuestro proyecto de Symfony 4 utilizaremos composer, siguiendo las recomendaciones de la documentación https://symfony.com/doc/current/setup.html

composer create-project symfony/skeleton symfony4-appengine-test

Instalar el servidor de desarrollo

Ahora podemos seguir los pasos para instalar el servidor de desarrollo y ejecutar nuestro proyecto en nuestro equipo:

cd symfony4-appengine-test
composer require server — dev
php bin/console server:run

Teniendo arrancado el servidor de desarrollo, si vamos a http://127.0.0.1:8000/ en el navegador veremos la página de entrada de Symfony.

Aún no tenemos ninguna ruta definida, así que creamos un controlador con la acción por defecto:

<?phpnamespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

class DefaultController extends Controller
{
/**
*
@return Response
*/
public function index()
{
return new Response('Hello AppEngine!');
}
}

y configuramos la ruta por defecto:

# config/routes.yaml
index:
path:
/
controller: App\Controller\DefaultController::index

Ahora veremos en nuestro navegador “Hello AppEngine!”.

Antes de ir a AppEngine, os recomiendo generar un robots.txt para evitar errores 404 en los logs, ya que Google AppEngine verifica este fichero.

# public/robots.txt
User-Agent: *
Disallow:

Desplegar aplicación en Google AppEngine

Configurar app.yaml

La configuración de AppEngine se define en un fichero app.yaml, que colocaremos en la raíz del proyecto. Podéis encontrar la documentación de referencia aquí.

Definiremos el document_root a public y las variables de entorno necesarias para nuestro proyecto.

runtime: php
env: flex

runtime_config:
document_root:
public

manual_scaling:
instances:
1

resources:
cpu:
1
memory_gb: 0.5
disk_size_gb: 10

env_variables:
APP_ENV:
"prod"
APP_SECRET: "this-is-not-secret-change-me"

Si no definierais alguna variable de entorno obtendríais un error al desplegar. En el script de despliegue se ejectuta composer install y el Skeleton de Symfony 4 trae configurada la ejecución de cache:clear en el post-install.

Así mismo, si ponéis en APP_ENV el entorno de desarrollo (dev), obtendréis un error porque intentará cargar el WebServerBundle y sólo lo hemos instalado como dependencia de desarrollo.

Desplegar la aplicación

Para desplegar la aplicación en Google AppEngine ejecutaremos:

# ensure selected project
gcloud config set project symfony4-gae-test
# deploy app
gcloud app deploy

En el primer despliegue nos preguntará por la región en la que alojar nuestro proyecto.

Seleccionad la opción que prefiráis, y pasado algo más de un minuto os pedirá confirmación para continuar.

Podréis ver una salida de consola bastante larga, en la que se puede observar la salida de un comando docker build, un composer install, y un docker push, principalmente.

Os recomiendo echar un vistazo para comprender qué es lo que hace para generar la imagen, y si queréis indagar un poco más aquí en github tenéis el Dockerfile, los ficheros de configuración de nginx, fpm, etc., y los scripts que utiliza en la creación de la imagen.

Al cabo de unos minutos (AppEngine no es especialmente rápido) tendremos el mensaje de confirmación de que nuestra aplicación está lista.

Ejecutando el comando “gcloud app browse”, en https://symfony4-gae-test.appspot.com/ podremos ver nuestro “Hello AppEngine!”

Antes de terminar

Antes de terminar, hay que eliminar el proyecto de Google. Recordemos que en entorno flexible hay siempre una instancia corriendo y si no estáis con el trial de $300, os puede llegar la factura a fin de mes…

gcloud projects delete symfony4-gae-test

--

--

Javi H. Gil

Softspring founder. Symfony expert developer and web architect.