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

Anteriormente publiqué instrucciones hace un año acerca de cómo hacer esto en Rails 4.1 en una versión anterior de Elastic Beanstalk. Esta es la versión actualizada.

Implementar aplicaciones Rails puede ser complicado. Para proyectos simples, herramientas como Heroku pueden ser perfectas. Es ideal para crear prototipos de aplicaciones y probar diferentes ideas sin mucha molestia. Sin embargo, cuando su proyecto se vuelve más complicado y desea tener un mejor control de sus servidores, equilibradores de carga, trabajadores, condiciones de escalado automático, etc., no tendrá la flexibilidad que desea.

Hay muchos servicios que se pueden utilizar para obtener una aplicación de Rails rápidamente y sin perder el control total de su infraestructura. Una opción razonable es Amazon Elastic Beanstalk . 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!

Puedes encontrar todo el código para esta publicación en github.com/jtescher/example-rails-4.2-elastic-beanstalk-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 la consola de AWS 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

Inicializa la aplicación Rails

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

 $ gem install rails -v 4.2.1 
$ rails new blog
$ cd blog
$ git init && git add -A && git commit -m "Add rails andamio"

Andamio un recurso de publicación

Crearemos una aplicación de ejemplo simple que le permita manipular publicaciones. Para generar esto en Rails use:

 $ rails generan el título de la publicación de andamio: cuerpo de la cadena: texto 
$ bundle exec rake db: migrate
$ git add -A && git commit -am "Agregar recurso de publicación"

Inicializa la aplicación Elastic Beanstalk

Ahora podemos inicializar una nueva aplicación Beanstalk a través del comando eb.

 $ eb init 

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

 Seleccione una región predeterminada 
3) us-west-2: US West (Oregón)
 Seleccione una aplicación para usar 
[Crear nueva aplicación]
 Introduzca el nombre de la aplicación 
Blog
El blog de aplicaciones ha sido creado.
 Parece que estás usando Ruby. ¿Es esto correcto? 
(y / n): y
 Seleccione una versión de plataforma. 
1) Ruby 2.2 (Puma)
 ¿Desea configurar SSH para sus instancias? 
(s / n): n

Esto configurará un directorio .elasticbeanstalk en la raíz de su proyecto y lo agregará a su archivo .gitignore. No quiere que su configuración esté almacenada en git porque podría haber información privada allí. Vamos a comprometer esos cambios ahora:

 $ git commit -am "Ignorar ajustes de elasticbeanstalk" 

Creando el ambiente Elastic Beanstalk

Puede tener muchos entornos por aplicación Elastic Beanstalk. Esto puede ser útil para tener entornos de desarrollo y producción para la misma aplicación.

Para crear un nuevo entorno, ejecute lo siguiente:

 $ eb create blog-env: 
 Creación de archivo de la versión de la aplicación "b303". 
Subiendo blog / b303.zip a S3. Esto puede tardar un rato.
Carga completa.
Detalles del entorno para: blog-env
Nombre de la aplicación: blog
Región: us-west-2
Versión implementada: b303
ID del entorno: e-g5mkeawrnz
Plataforma: 64 bits Amazon Linux 2015.03 v1.3.0 ejecutando Ruby 2.2 (Puma)
Nivel: WebServer-Standard
CNAME: DESCONOCIDO
Actualizado: 2015-04-19 23: 38: 50.955000 + 00: 00
Estado de impresión:
INFORMACIÓN: createEnvironment está comenzando.
INFORMACIÓN: Usando elasticbeanstalk-us-west-2-83376862866 como contenedor de almacenamiento de Amazon S3 para datos de entorno.
INFORMACIÓN: Equilibrador de carga creado llamado: awseb-eg-AWSEBLoa-7R0CSEMQ6W2M
INFORMACIÓN: Grupo de seguridad creado llamado: awseb-e-g5mkeawrnz-stack-AWSEBSecurityGroup-56IUD2ZYQ5FR
INFORMACIÓN: configuración de inicio de creación automática de escala llamada: awseb-e-g5mkeawrnz-stack-AWSEBAutoScalingLaunchConfigurat ...
INFORMACIÓN: Grupo de escalamiento automático creado denominado: awseb-e-g5mkeawrnz-stack-AWSEBAutoScalingGroup-2URXDKL0NCIJ
INFORMACIÓN: Esperando a que se inicien las instancias de EC2. Esto puede tomar unos pocos minutos.
INFORMACIÓN: Política de grupo de escala automática creada llamada: arn: aws: autoscaling: us-west-2: 833768628226: scalingPolicy: 02920f8b ...
INFORMACIÓN: Política de grupo de escala automática creada llamada: arn: aws: autoscaling: us-west-2: 833768628666: scalingPolicy: b143cea1 ...
INFORMACIÓN: alarma creada de CloudWatch llamada: awseb-e-g5mkeawrnz-stack-AWSEBCloudwatchAlarmHigh-APCUnlMHNIS1
INFORMACIÓN: alarma creada de CloudWatch llamada: awseb-e-g5mkeawrnz-stack-AWSEBCloudwatchAlarmLow-1UL48B2CC2OM8
INFORMACIÓN: Se agregó la instancia de EC2 'i-7f4b6eb7' al Grupo de escalamiento automático 'awseb-e-g7mkeawrnz-stack-AWSEBAutoScalingGroup-2URX ...
INFORMACIÓN: Aplicación disponible en blog-env-zckzptpdgy.elasticbeanstalk.com.
INFORMACIÓN: Entorno lanzado con éxito: blog-env

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

 $ eb estado 
Detalles del entorno para: blog-env
Nombre de la aplicación: blog
Región: us-west-2
Versión implementada: b303
ID del entorno: e-g5mkeawrn
Plataforma: 64 bits Amazon Linux 2015.03 v1.3.0 ejecutando Ruby 2.2
Nivel: WebServer-Standard
CNAME: blog-env-zckzptpdg2.elasticbeanstalk.com
Actualizado: 2015-04-19 23: 51: 59.259000 + 00: 00
Estado: listo
Salud: verde

Lo último que tenemos que hacer para configurar Rails es agregar una variable de entorno SECRET_KEY_BASE .

Para generar un nuevo uso de clave secreta:

 $ rake secret 
f655b5cfeb452e49d9182c6b5e6856704e6e1674082fa1e5f1a330782bad1833ba4cc30951e094f9250c87573dc0bbd3d46d37c5d79ff57 ...

Luego, para agregar el secreto a su entorno de judías elásticas, use:

 $ eb setenv SECRET_KEY_BASE = f655b5cfeb452e49d9182c6b5e6856704e6e1674082fa1e5f1a330782bad1833ba4cc30951e094f9250 ... 

Ahora, si navega hacia [YOUR-ENV] .elasticbeanstalk.com / posts, debería ver su vista de índice de publicaciones:

Usando PostgreSQL con Rails

En este momento, nuestra aplicación solo está utilizando SQLite, que no está hecho para uso de producción y no se puede compartir entre instancias. Podemos resolver esto agregando PostgreSQL a su aplicación y a su entorno Elastic Beanstalk.

Añadiendo la gema pg

Abra su Gemfile. Mueva la gema sqlite3 a su bloque de desarrollo y prueba y agregue un grupo de producción con la gema de pg. Después debería verse algo como esto:

 fuente 'https://rubygems.org' 

# Bundle edge Rails en su lugar: gem 'rails', github: 'rails / rails'
gem 'rails', '4.2.1'
# Usar SCSS para hojas de estilo
gema 'sass-rails', '~> 5.0'
# Usar Uglifier como compresor para activos de JavaScript
gem 'uglifier', '> = 1.3.0'
# Use CoffeeScript para activos y vistas de .coffee
gema 'cafe-rails', '~> 4.1.0'
# Consulte https://github.com/rails/execjs#readme para ver los tiempos de ejecución más compatibles.
# gem 'therubyracer', plataformas:: ruby
 # Use jquery como la biblioteca de JavaScript 
gema 'jquery-rails'
# Turbolinks hace que los siguientes enlaces en su aplicación web sean más rápidos. Leer más: https://github.com/rails/turbolinks
gema 'turbolinks'
# Desarrollar API JSON con facilidad. Leer más: https://github.com/rails/jbuilder
gema 'jbuilder', '~> 2.0'
# bundle exec rake doc: rails genera la API en doc / api.
gema 'sdoc', '~> 0.4.0', grupo:: doc
 # Usar ActiveModel has_secure_password 
# gem 'bcrypt', '~> 3.1.7'
 # Usa Unicornio como servidor de aplicaciones 
# gem 'unicornio'
 # Usar Capistrano para el despliegue 
# gem 'capistrano-rails', grupo:: desarrollo
 grupo: desarrollo,: prueba hacer 
# Usar sqlite3 como base de datos para Active Record
gema 'sqlite3', '~> 1.3.10'
 # Llamar 'byebug' en cualquier parte del código para detener la ejecución y obtener una consola de depurador 
gema 'byebug'
 # Acceda a una consola IRB en páginas de excepción o usando <% = console%> en vistas 
gem 'web-console', '~> 2.0'
 # Spring acelera el desarrollo al mantener su aplicación ejecutándose en segundo plano. Leer más: https://github.com/rails/spring 
gema 'primavera'
fin
 grupo: producción hacer 
# Usar PostgreSQL como base de datos para Active Record
gema 'pg', '~> 0.18.1'
fin

Ahora ejecuta $ bundle install para instalar la gema.

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 establecerlas como variables de entorno sea bastante simple. Las variables de RDS se configuran y actualizan automáticamente para que su sección de producción de config / database.yml se pueda actualizar de la siguiente manera:

 producción: 
<<: * predeterminado
adaptador: postgresql
codificación: unicode
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']%>

Hacer que la gema pg funcione en Elastic Beanstalk

Ahora agreguemos la base de datos a nuestro entorno. Esto requiere algunos pasos pero te guiaré a través de él. Primero vaya a la sección Elastic Beanstalk en la consola de AWS: console.aws.amazon.com/elasticbeanstalk/?region=us-west-2 (tenga en cuenta que la región es us-west-2, si se implementó en una región diferente, consulte ahí.)

Ahora haga clic en blog-env y vaya a configuración en el panel de navegación izquierdo. En la parte inferior, deberías ver:

Ahora haga clic en "crear una nueva base de datos RDS", configure el motor de DB en "postgres" y cree un nombre de usuario maestro y una contraseña maestra.

Haga clic en "Guardar" y tendrá una instancia de PostgreSQL en pleno funcionamiento y las variables de entorno se habrán agregado automáticamente a su entorno Beanstalk.

Ahora para instalar la gema pg en su servidor, se requiere el paquete postgresql93-devel yum. La configuración de paquetes en instancias de Elastic Beanstalk es tan simple como soltar un archivo .config con formato YAML en una carpeta .ebextensions de nivel superior.

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

Ahora confirma este cambio y vuelve a implementar la aplicación.

 $ git add -A && git commit -am "Agregar PostgreSQL como base de datos de producción" 
$ eb deploy

Una vez hecho esto, puede volver a cargar la página / posts y ver su aplicación Rails respaldada por postgres totalmente funcional. ¡Hurra!