Cómo configurar una aplicación de Rails 4.1 en AWS con Elastic Beanstalk y PostgreSQL

Servicios web de Amazon

Actualización: esta publicación ahora está un poco desactualizada. Hay una NUEVA VERSIÓN de esta publicación que contiene instrucciones actualizadas para el nuevo Elastic Beanstalk and Rails 4.2.

Administrar operaciones en un equipo pequeño puede ser un verdadero dolor. En WillCall, nuestra infraestructura es bastante simple, pero aún tenemos que subir y bajar muchos servidores todos los días para manejar el tráfico variable en nuestros servicios. Hace tres años, cuando acabábamos de comenzar la empresa, estábamos haciendo esto manualmente con el chef , pero podía ser propenso a errores y empezar a sentirse como un trabajo de tiempo completo.

Para proyectos simples, herramientas como heroku pueden ser perfectas. Ideal para crear prototipos de aplicaciones y probar diferentes ideas sin mucha molestia. Pero cuando su proyecto se vuelve más complicado y desea tener más control de sus servidores, equilibradores de carga, trabajadores, condiciones de escalado automático, etc., también sentirá este dolor.

Hay muchos servicios que brindan la posibilidad de ejecutar y ejecutar rápidamente una aplicación de Rails mientras se mantiene el control total de su infraestructura, y mi favorito actual es Elastic Beanstalk de Amazon. El servicio es descrito acertadamente por Amazon de la siguiente manera:

AWS Elastic Beanstalk facilita aún más que los desarrolladores implementen y administren aplicaciones rápidamente en la nube de AWS. Los desarrolladores simplemente cargan su aplicación, y Elastic Beanstalk maneja automáticamente los detalles de implementación del aprovisionamiento de capacidad, balanceo de carga, escalado automático y monitoreo de estado de la aplicación.

¡Ahora que Amazon admite PostgreSQL a través de RDS, tener una aplicación Rails completamente respaldada por postgres nunca ha sido tan fácil!

Puede encontrar todo el código para esta publicación en github.com/jtescher/example-rails-elasticbeanstalk-blog

Si te quedas atascado o tienes otros problemas, la documentación de Elastic Beanstalk es bastante buena.

Empezando:

Regístrese para obtener una cuenta de AWS a través de las instrucciones en console.aws.amazon.com/elasticbeanstalk y luego descargue las herramientas de línea de comandos de Elastic Beanstalk a través de Homebrew (o aquí para PC)

 $ brew actualización 
$ brew install aws-elasticbeanstalk

Crea la aplicación:

La versión más actual de los rieles al momento de escribir esto es 4.1.0.rc1, así que eso es lo que usaremos ahora.

 $ gem install rails -v 4.1.0.rc1 
$ rails new blog -database = postgresql
$ cd blog
$ git init && git add -A && git commit -m "Confirmación inicial"

Inicializar entorno de habichuelas mágicas

 $ eb init 

Escogería la siguiente configuración, pero para una descripción de cada opción, vea el ejemplo de AWS aquí

 Ingrese su ID de clave de acceso de AWS (el valor actual es "AKIAIOSEXAMPLE"): 
 Ingrese su clave de acceso secreta de AWS (el valor actual es "PfiCYEXAMPLE"): 
 Seleccione una región de servicio AWS Elastic Beanstalk. 
2) EE. UU. Oeste (Oregón)
 Ingrese el nombre de la aplicación AWS Elastic Beanstalk 
(el valor generado automáticamente es "blog"):
 Ingrese un nombre de entorno de AWS Elastic Beanstalk 
(el valor actual es "blog-env"):
 Seleccione un nivel de entorno. 
1) WebServer :: Estándar :: 1.0
 Seleccione una pila de soluciones. 
44) 64 bit Amazon Linux 2013.09 ejecutando Ruby 1.9.3
 Seleccione un tipo de entorno 
1) LoadBalanced
 Crear una instancia de base de datos RDS? [y / n]: y 
 Cree una instancia de BD RDS a partir de (el valor actual es "[Sin instantánea]"): 1 
 Ingrese una contraseña maestra de RDS DB: 
Vuelva a escribir la contraseña para confirmar:
 Si finaliza su entorno, su Instancia de base de datos RDS se eliminará y perderá sus datos. 
Crear instantánea? [y / n]: y
 Adjunte un perfil de instancia (el valor actual es "[Crear un perfil de instancia predeterminado]"): 1 

A continuación, cree un archivo optionsettings en el directorio .elasticbeanstalk recién creado llamado optionsettings.blog-env (o su nombre de env personalizado como la extensión si lo personalizó)

 # .elasticbeanstalk / optionsettings.blog-env 
[aws: autoescalado: asg]
Zonas de disponibilidad personalizadas =
MaxSize = 4
MinSize = 1
 [aws: autoescalado: configuración de inicio] 
EC2KeyName =
InstanceType = t1.micro
 [aws: autoscaling: updatepolicy: rollingupdate] 
RollingUpdateEnabled = falso
 [aws: ec2: vpc] 
ELBScheme = public
ELBSubnets =
Subredes =
VPCId =
 [aws: elasticbeanstalk: aplicación] 
Application Healthcheck URL =
 [aws: elasticbeanstalk: application: environment] 
BUNDLE_WITHOUT = prueba: desarrollo
RAILS_SKIP_ASSET_COMPILATION = falso
RAILS_SKIP_MIGRATIONS = falso
 [aws: elasticbeanstalk: hostmanager] 
LogPublicationControl = falso
 [aws: elasticbeanstalk: monitoreo] 
Terminar automáticamente instancias insalubres = verdadero
 [aws: elasticbeanstalk: sns: topics] 
Punto final de notificación =
Protocolo de notificación = correo electrónico
 [aws: rds: dbinstance] 
DBDeletionPolicy = Instantánea
DBEngine = postgres
DBInstanceClass = db.t1.micro
DBSnapshotIdentifier =
DBUser = ebroot

Entonces puedes probar que todo funcionó con:

 $ eb estado 
El entorno "blog-env" no se está ejecutando.

Iniciando la aplicación

Para iniciar el funcionamiento del entorno: (comenzaremos la aplicación sin la aplicación de rieles primero para asegurarnos de que esté todo configurado correctamente)

 $ eb start 
¿Desea implementar el último compromiso de Git en su entorno? [y / n]: n
Esperando el entorno "blog-env" para su lanzamiento.
INFO createEnvironment está comenzando.
INFORMACIÓN Utilizando elasticbeanstalk-us-west-2-whatever como Amazon S3 s ...
INFO Grupo de seguridad creado llamado: sg-aebgroupid
INFO Creador de carga creado llamado: awseb-em-AWSEBLoa-xloadid ...
INFO Grupo de seguridad creado llamado: sg-cebgroupid
INFO creó la configuración de inicio de Escalado automático llamada: awseb-e ...
INFO Creando una base de datos RDS llamada: apdbnamez. Esto puede tomar un ...
INFO creó la base de datos RDS llamada: apdbnamez
INFORMACIÓN Esperando a que se inicien las instancias de EC2. Esto puede tomar algunos ...
INFO creado Grupo de escalamiento automático llamado: awseb-e-dse-stack-AWSE ...
INFO creó la política de grupo de escala automática denominada: arn: aws: autosca ...
INFO creó la política de grupo de escala automática denominada: arn: aws: autosca ...
INFO creó una alarma de CloudWatch llamada: awseb-e-dv-stack-AWSEBCl ...
INFO creó una alarma de CloudWatch llamada: awseb-e-dv-stack-AWSEBCl ...

El entorno ahora debería estar funcionando. Para ver el estado y la url:

 $ eb estado -verbose 
Recuperando el estado del entorno "blog-env".
URL: blog-env-hkdpsewdfsd.elasticbeanstalk.com
Estado: listo
Salud: verde
Nombre del entorno: blog-env
ID de entorno: e-jlksjdf8d8s
Nivel de entorno: WebServer :: Standard :: 1.0
Solución: 64 bits en Amazon Linux 2013.09 ejecutando Ruby 1.9.3
Etiqueta de versión: aplicación de muestra
Fecha de creación: 2014-01-20 18:45:40
Fecha de actualización: 2014-01-20 19:03:13
Descripción:
 Base de datos RDS: AWSEBRDSDatabase | sdfjlsdkflsk.sdfkjlsdkjf.us ... 
Motor de base de datos: postgres 9.3.1
Almacenamiento asignado: 10
Clase de instancia: db.t1.micro
Multi AZ: falso
Nombre de usuario principal: ebroot
Tiempo de creación: 2014-01-20 18:53:06
Estado de instancia de DB: disponible

Si abre la URL que devuelve este comando (debería ser URL: su-app-env.elasticbeanstalk.com) debería ver la página de bienvenida de Elastic Beanstalk:

Página de bienvenida de Elastic Beanstalk

Obtener la gema pg para trabajar en elasticbeanstalk

El paquete postgresql-devel yum es necesario para instalar la gema pg en amazon linux y la configuración de paquetes en las instancias Elastic Beanstalk es tan simple como colocar un archivo .config formateado en YAML en una carpeta .ebextensions de nivel superior.

 # .ebextensions / packages.config 
paquetes:
yum:
postgresql-devel: []

Configurando database.yml para trabajar con postgres de RDS

Las credenciales de la base de datos nunca deben estar codificadas y Elastic Beanstalk hace que las variables del entorno de administración sean bastante simples. Las variables de RDS se configuran y actualizan automáticamente para que su sección de producción de database.yml se pueda actualizar para que sea la siguiente:

 producción: 
<<: * predeterminado
base de datos: <% = ENV ['RDS_DB_NAME']%>
nombre de usuario: <% = ENV ['RDS_USERNAME']%>
contraseña: <% = ENV ['RDS_PASSWORD']%>
host: <% = ENV ['RDS_HOSTNAME']%>
puerto: <% = ENV ['RDS_PORT']%>

Configurando secrets.yml

De forma predeterminada, Rails ahora incluye un archivo secrets.yml y las claves de producción y la configuración deben establecerse allí como variables de entorno. El entorno predeterminado solo requiere la definición de una variable SECRET_KEY_BASE, así que vamos a agregar eso a su entorno. Primer intento:

 $ bundle exec rake secret 
5387fca6a0a69d945bb57e8be5bce3a119292216dfc95b270275c518641aa3e8db14a5ead261b1d50332a92ed860c544ef24356100ccb391507b1c5b8d46f39b

Luego vaya a console.aws.amazon.com/elasticbeanstalk/home y en blog-env a la izquierda debajo de la configuración, haga clic en el engranaje junto a 'Configuración del software'. En la parte inferior, ingrese SECRET_KEY_BASE a la izquierda y la salida del secreto de rake a la derecha.

Después de guardar, debería verse así:

Variables de entorno elástico de habichuelas mágicas

Añadiendo algunos andamios

Para finalizar, agreguemos un recurso de publicación para que podamos comenzar a bloguear:

 $ rails generan el título de la publicación de andamio: cuerpo de la cadena: texto 
$ bundle exec rake db: migrate

Despliegue de la aplicación a AWS

Confirme todos los cambios que acabamos de hacer:

 $ git add -A && git commit -am "Add post resource, configure database.yml para producción" 

Luego implemente con:

 $ git aws.push 

Si visita https://console.aws.amazon.com/elasticbeanstalk/home , debería ver el progreso de su aplicación a medida que se despliega.

¡Una vez que eso termine tienes tu aplicación funcional ejecutando Rails y postgres! ¡Vaya a su-app-env.elasticbeanstalk.com/posts y listo !:

Demostración final donde puedes editar publicaciones