En este tutorial, me gustaría mostrarte cómo desplegar una aplicación Rails de ejemplo utilizando Amazon Elastic Container Service (ECS).
Creémoslo ejecutando rails nuevo sample-rails-appy, a continuación, generar una acción de controlador básica rails g controlador Índice de bienvenida y estableciendo rutas a la ruta raíz como `root to: welcome#index".
Nuestro objetivo es que esta página de bienvenida se despliegue utilizando ECS.
Crear un repositorio con Amazon Elastic Container Registry (ECR)
Amazon ECR es un registro de contenedores. Lo utilizaremos para almacenar las imágenes de nuestra aplicación y extraerlas de él para que se ejecuten en ECS.
Vaya a su AWS panelbusque Contenedor elástico Registro y haga clic en Comenzar. Verás la siguiente pantalla:
Crearemos un repositorio privado y lo llamaremos sample-rails-app.
El repositorio está ahí, pero está vacío. Queremos que contenga la imagen de nuestra aplicación. Este es el siguiente paso.
# lanzar errores si Gemfile ha sido modificado desde Gemfile.lock
RUN bundle config --global frozen 1
directorio de trabajo /app
COPIAR Gemfile Gemfile.lock ./
EJECUTAR bundle install
COPIAR . .
CMD ["rails", "server", "-b", "0.0.0.0"]
A continuación, debemos crear una imagen y enviarla al repositorio ECR.
Antes de eso, precompilemos los assets con `rails assets:precompile`.
Ahora, vaya al repositorio creado. En la parte superior de la pantalla, verá un icono Ver comandos push con detalles sobre cómo hacerlo.
En mi caso (Linux), lo ejecuto con estas instrucciones de AWS:
Asegúrate de que tu usuario tiene permiso para realizar esta operación. He añadido la política AmazonElasticContainerRegistryPowerUser a mi usuario, que tiene este aspecto:
Quiero que el mundo exterior sólo pueda conectarse a mi Application Load Balancer. Pasará tráfico a los contenedores que se ejecutan dentro de nuestro clúster ECS.
Ir a Servicios EC2 -> Equilibrio de la carga -> Equilibradores de cargapulse Crear equilibrador de cargaseleccione Equilibrador de carga de aplicaciones y haga clic en el botón Cree botón.
Establezca su nombre en sample-rails-app-albUtilice su VPC predeterminada y seleccione todas sus subredes.
Nos quedamos con Grupos de seguridad y Receptores y enrutamiento secciones.
Grupos de seguridad
Crearemos un nuevo grupo de seguridad para nuestro balanceador de carga. Funciona como un cortafuegos; estableceremos las reglas para el tráfico entrante y saliente. Queremos aceptar el tráfico http entrante (puerto TCP 80) y permitir todo el tráfico saliente.
Para ello, haga clic en "Crear un nuevo grupo de seguridad" enlace.
En la sección "Datos básicos", establezca el nombre y la descripción, deje la VPC por defecto.
En mi caso - nombre: "sample-rails-app-alb-sg", descripción: "http desde fuera, todo desde dentro"
Añade la regla de entrada con Tipo: HTTP y Fuente: En cualquier lugar-IPv4. Deja las reglas de salida como están.
Haga clic en crear grupo de seguridadA continuación, vuelva a la pestaña en la que estaba creando el Application Load Balancer, actualice los grupos de seguridad y añada el que acabamos de crear, elimine el predeterminado.
Receptores y enrutamiento
En esta sección, definiremos a dónde queremos que el balanceador de carga pase el tráfico. Dejar OyenteProtocolo y Puerto como HTTP y 80, ya que esto es exactamente lo que queremos, y haga clic en "Crear un grupo destinatario" enlace.
Establece el nombre como "sample-rails-app-alb-tg". El único cambio es el número de puerto. Lo pasaremos al puerto 3000 ya que es el de nuestra aplicación Rails. Ignora el siguiente paso (Objetivos registrados) y cree el grupo destinatario.
Ahora vuelve a la pestaña donde estábamos creando el Application Load Balancer, refresca el grupo de destino y selecciona el que acabamos de crear.
Ya tenemos listo nuestro Application Load Balancer, ahora vamos a jugar con ECS.
Creación de un clúster ECS
Hay un montón de términos aterradores que vas a ver - cluster, tareas, definición de tareas, servicios. Para hacerlo más simple, piensa en el clúster como un grupo de servidores (instancias EC2). En cada uno de ellos, ejecutamos tareas, que no son más que un grupo de contenedores ejecutándose juntos. La definición de tareas describe qué contenedores están en un grupo determinado y qué recursos nos gustaría darles (memoria, cpu). Los servicios vigilan estas tareas para asegurarse de que siempre hay un número correcto de tareas en ejecución en nuestro clúster.
Con esto en mente, vamos a crear nuestro clúster.
Vaya a la página ECS y haga clic en el botón Agrupaciones enlace y Crear clúster botón. Seleccione el botón "EC2 + Redes Linux"uno y haga clic en Siguiente paso.
Establezca el nombre del clúster en "sample-rails-app-cluster". Elija el tipo de instancia EC2, tomé la t2-micro ya que está disponible en el plan Free Tier. Deje el número de instancias como 1.
En la sección networking, usa tu VPC por defecto y selecciona todas sus subredes. Haz clic en crear, espera un poco y voilá, ya tenemos un nuevo Cluster ECS creado.
Definición de tareas
Haga clic en el botón Definiciones de tareas enlace, entonces Crear una nueva definición de tarea botón . Seleccione el botón CE2 y haga clic en Siguiente paso. La aplicación que vamos a ejecutar es muy simple, por lo que sólo necesitamos unas pocas opciones aquí.
Establecer Definición de tareas nombre a "sample-rails-app", vaya directamente a la Definiciones de los contenedores y haga clic en "Añadir contenedor". Nombre el Contenedor como "sample-rails-app", y establezca la ubicación de la imagen en el formato "repositorio-url/imagen:etiqueta". En la nueva pestaña del navegador, vaya a la ECR para copiar el URI de la imagen. En mi caso, era "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Establezca su Límite de Memoria a los 300-500MiB recomendados. Ahora, lo más complicado - Port Mapping.
Nuestra aplicación se ejecuta dentro de un contenedor en el puerto 3000. Así que pon 3000 como puerto del contenedor. Pondremos 0 como puerto del host, lo que básicamente significa que selecciona un puerto aleatorio. Afortunadamente, nuestro Application Load Balancer conocerá esta asignación de puertos y podrá dirigir el tráfico correctamente. Incluso podemos ejecutar múltiples tareas en esta única instancia.
Añada la variable de entorno RAILS_ENV y ponerlo en producción.
Ahora haga clic en Añadir para añadir nuestra definición de contenedor y haga clic en Cree para finalizar la configuración de la Definición de Tareas.
Servicio
Tenemos nuestro cluster, balanceador de carga y definición de tareas. Ahora tenemos que ejecutar de alguna manera estas tareas dentro de nuestro cluster. Este es el trabajo de los servicios. Ve al cluster recién creado, selecciona la opción Servicios y haga clic en Cree botón.
Establezca el tipo de lanzamiento como EC2, añada el nombre "sample-rails-app-service". Establezca el número de tareas en 1 y haga clic en Siguiente paso. En esta página, seleccione el botón de opción Application Load Balancer y elija el rol IAM existente para él. En la sección "Contenedor para equilibrar la carga", ya debería haber introducido un contenedor correcto "sample-rails-app:0:3000" y, a continuación, haga clic en "Añadir al equilibrador de carga."
Como "Puerto de escucha de producción", elija 80:HTTP; como nombre de grupo de destino, utilice el que hemos creado antes: "sample-rails-app-alb-tg" y haga clic en Siguiente paso. Deja Escalado automático tal como están, haga clic en Siguiente paso y Crear servicio.
Actualizar el grupo de seguridad ECS
Puede ir a la página de clústeres creados y comprobar el Tareas pestañas, debería haber una tarea en ejecución. El Servicio lo ha iniciado. Ahora ve a la página de servicios de EC2, haz clic en Load Balancers y mira los detalles de nuestro Application Load Balancer. Deberías tener ahí su nombre DNS. Cópialo y ábrelo en el navegador. Debería dirigirte a nuestra aplicación. Desafortunadamente, obtenemos el mensaje "504 tiempo de espera de la puerta de enlace" error.
El problema está en el grupo de seguridad de nuestro cluster. Sus reglas de entrada no permiten el tráfico entrante desde el balanceador de carga. Para solucionarlo, vuelve al panel EC2 y haz clic en el botón Grupos de seguridad enlace. Hay un nuevo grupo que fue creado durante el proceso de creación del cluster. Debe tener un nombre que empiece por "EC2ContainerService-sample-rails-app-cluster". Haga clic en él y edite las reglas de entrada. Como queremos permitir cualquier tráfico desde nuestra VPC, ve al panel de Amazon VPC y comprueba cuál es el CIDR IPv4 de tu VPC. Establece el tipo de regla a "Todo el tráfico" y el origen a CIDR IPv4. Guarde esta regla e intente cargar el nombre DNS del equilibrador.