Actualizar Elastic BeanStalk Enviroment para usar PHP7.0 con eb-cli

AWS Elastic Beanstalk es un servicio fácil de utilizar para implementar y escalar servicios y aplicaciones web.

Ahora veremos como hacer el upgrade de la versión de PHP de un servicio ( enviroment ) ya corriendo.

Antes de hacerlo :

  1. Ya debes de estar familiarizado con lo que es ElasticBeanstalk.
  2. Debes de tener los comandos de consola de EB instalasdos ( EB-CLI ).
  3. Asumiremos el upgrade desde una máquina con consola linux.

Creando la configuración inicial.

Antes que todo nos situamos en la carpeta de la aplicación de la cual haremos el upgrade y ejecutamos el comando eb init. Si ya lo habíamos hecho anteriormente usaremos la opción de «interactive» como fue mi caso. Resaltaré en negrita la selección del menú correspondiente.

ctala@BeaTriX-CTMGroup:~/REPOS/tbk-aas-server$ eb init --interactive

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3): 

Select an application to use
1) APP1
2) APP2
3) APP3
4) [ Create new Application ]
(default is 3): 3
Select the default environment. 
You can change this later by typing "eb use [environment_name]".
1) APP3-devel
2) APP3-prod
(default is 1): 2

Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
11) Java
(default is 1): 2

Select a platform version.
1) PHP 5.4
2) PHP 5.5
3) PHP 5.6
4) PHP 7.0
5) PHP 5.3
(default is 1): 4

Con esto lo que hacemos es decirle a beanstalk como funcionar. Si se creara la aplicación desde cero partiría de inmediato con php7, pero como no es nuestro caso lo que haremos primero es guardar la configuración de nuestro enviroment según lo que tenemos en la nube.

Creando y editando la configuración del enviroment.

ctala@BeaTriX-CTMGroup:~/REPOS/tbk-aas-server$ eb config save app3-prod --cfg app3-prod-config

Configuration saved at: /home/ctala/REPOS/app3/.elasticbeanstalk/saved_configs/app3-prod-config.cfg.yml

Una vez guardada la configuración por defecto la editaremos según lo que necesitemos. En nuestro caso buscamos la línea que define el Stack a ocupar y la editamos.

Cambiaremos esto :

SolutionStack: 64bit Amazon Linux 2016.03 v2.1.3 running PHP 5.6

Por esto

SolutionStack: 64bit Amazon Linux 2016.03 v2.1.3 running PHP 7.0

Si, solo cambiaremos la parte donde sale la versión de PHP. En este caso es sencillo ya que el SolutionStack existe y se llama de esa manera.

Actualizando la configuración en la nube.

Ya teniendo nuestra nueva configuración lo que debemos hacer es subirla a amazon y luego cargarla.

ctala@BeaTriX-CTMGroup:~/REPOS/app3$ eb config put app3-prod-config
ctala@BeaTriX-CTMGroup:~/REPOS/app3$ eb config app3-prod --cfg tbk-aas-server-prod-config 
Printing Status: INFO: Environment update is starting.                                
INFO: Updating environment app3-prod's configuration settings. 
INFO: Created Auto Scaling launch configuration named: awseb-e-4g3mx5ymyq-stack-AWSEBAutoScalingLaunchConfiguration-16CD5LSR5ERIN INFO: Auto Scaling group update progress: Rolling update initiated. Terminating 1 obsolete instance(s) in batches of 1, while keeping at least 1 instance(s) in service. Waiting on resource signals with a timeout of PT30M when new instances are added to the autoscaling group. 
INFO: Auto Scaling group update progress: Temporarily setting autoscaling group MinSize and DesiredCapacity to 2. 
INFO: Environment health has transitioned from Ok to Info. Configuration update in progress (running for 30 seconds). 
INFO: Auto Scaling group update progress: New instance(s) added to autoscaling group - Waiting on 1 resource signal(s) with a timeout of PT30M. 
INFO: Added instance [i-051d72f3a5ba93b63] to your environment.      INFO: Still waiting for the following 1 instances to become healthy: [i-051d72f3a5ba93b63]. 
INFO: Deleted Auto Scaling launch configuration named: awseb-e-4g3mx5ymyq-stack-AWSEBAutoScalingLaunchConfiguration-10200GU7CE7MB 
INFO: Successfully deployed new configuration to environment.

Ahora así de simple hemos actualizado el enviroment para que use la versión de php7 sin tener downtime y manteniendo los servicios relacionados como pueden ser las bases de datos.

Espero que les sirva !

HOWTO Custom AMI en Elastic Bean Stalk de AWS ( Amazon Web Services )

Elastic Bean Stalk se ha convertido en una de mis herramientas favoritas. El fácil deploy de mis aplicaciones utilizando git, la maquina con php5 y la conexión al RDS han hecho que me vuelva comodo en la forma como manejo las versiones y las máquinas para mi software. Además hay que tomar en cuenta que las instancias micro son libres de pago.

La AMI ( Amazon Machine Image ) en la que se lanzan todas las instancias de la aplicación subida por ElasticBeanStalk es una distribución propia de Amazon con un Vanilla Kernel. Esta versión utiliza yum para la instalación de paquetes.

La razón de utilizar una maquina CUSTOM / PROPIA es debido a que la maquina por defecto no tenga todo lo que necesitas. En mi caso particular necesitaba una librería de php-pear para mi aplicación escrita en php.

En mi caso, la idea es extender una imagen linux ( existen distintas versiones incluyendo windows ). Las AMIs en las que me puedo basar dependiendo de la arquitectura son las siguientes:

  1. 32: ami-15812b7c – amazon/PHPBeanstalk32-2012.08.09T20.48.38.0000
  2. 64: ami-ff812b96 – amazon/PHPBeanstalk64-2012.08.09T20.51.54.0000

Y los pasos a seguir son los siguientes:

  1. Crear una instancia en EC2 basada en una de estas imágenes.
  2. Modificar Nuestra nueva Imagen y crear una AMI a partir de ella.
  3. Establecer que nuestra aplicación en BeanStalk utilice nuestra nueva AMI ( Custom AMI )
OJO : Estoy asumiendo que ya tienen una aplicación andando en ElasticBeanStalk, si no la tienen es posible que necesiten una para corroborar este tutorial.

Crear la Instancia de EC2

  1. Accedemos a nuestro panel de control para EC2 dentro del dashboard de AWS.
  2. Ingresamos al link que corresponde a la lista de AMIS.
  3. Seleccionamos mostrar todas las AMIs de AMAZON ( ver dibujo ).
  4. Buscamos la AMI en la que nos basaremos. En mi caso : ami-ff812b96 ( 64Bits ).
  5. Seleccionamos el AMI e iniciamos la instancia ( LAUNCH AMI )
AMIs en el panel de control de EC2
AMIs en el panel de control de EC2
LAUNCH the AMI instance
Muestra como iniciar la Instancia seleccionada y como buscarla
Dependiendo de la forma que hayas seleccionado para conectarte, simplemente conéctate a la instancia recién creada y agrega todas las librerías o aplicaciones que necesites tener instaladas.

Crear el AMI

Ahora, al tener nuestra instancia ya modificada, el crear una AMI a partir de ella es super sencillo.
  1. Selecciona con el boton derecho tu Instancia.
  2. Haz click en «Create Image ( EBS AMI )». 
  3. Sigue el wizard.
Create Image from Instance EC2
Como crear una imagen a partir de una instancia en EC2
Ahora al acceder a nuestras AMIs podemos encontrar nuestra nueva imagen. Por ahora solo necesitaremos su ID.
My Ami ID and Info
El ID de mi nueva imagen y su información

Establecer el Custom AMI en ElasticBeanStalk

Ahora esto debería ser la parte más sencilla.
  1. Ingresamos al panel de ElasticBeanStalk.
  2. Seleccionamos el enviroment en donde queremos usar nuestra custom AMI.
  3. Seleccionamos «Edit Configuration».
  4. En Custom AMI ID ponen el ID de su imagen.
  5. y … LISTO !.
Custom AMI ID
Custom AMI ID en Elastic Bean Stalk
Créanme … es más sencillo cuando es explicado ….

 

Yii Framework in Amazon Elastic Beanstalk << The application did not respond at the health check URL.>>

Amazon Elastic Beanstalk es una gran sistema en el cual puedes subir tu aplicación sin necesidad de preocupar de la configuración del servidor y el manejo de los recursos de este mismo.

Este sistema para funcionar posee un health check que se encarga de revisar que todo funcione como debe antes de mostrar la aplicación al público, si esta revisión no es aprobada la aplicación no responderá.

Al usar un framework, especialmente si desarrollamos una aplicación que requiera inicio de sesión, especialmente si este es MVC, debemos preocuparnos de pasar esta prueba de antemano.

En este caso es bastante sencillo, simplemente se debe crear un controlador con una vista que muestre el estado del servicio de manera dinámica o un mensaje de manera estática y asegurarnos que sea accesible por todo el mundo. En este caso si estamos manejando una aplicación basadao en roles y permisos, asegurarnos que todos ( ‘*’ ) tengan acceso a a esta página.

En mi caso usando Yii, cree un controlador llamado health que simplemente responde de manera estática que todo está bien.

  1. Crear Vista + Controlador.
  2. Asegurarnos que sea accesible por todos.
  3. Ingresar la nueva dirección a nuestro «health check url».
Controlador:
class HealthController extends Controller
{
	public function actionIndex()
	{
		$this->renderPartial('index');
	}

}
Vista:
breadcrumbs=array(
	'Health',
);?>

The Service is up and Running.

Agregarlo a la configuración de Beanstalk:
AWS HEALTH CHECK

 

De esta manera es super sencillo tener el sistema UP & Running. Existen distintas respuestas que se le pueden dar al servidor para que seas notificado de algún problema.