Implementar una aplicación web con contenedores en Amazon ECS

GUÍA DE INTRODUCCIÓN

Módulo 2: crear infraestructura e implementar la aplicación

En este módulo, creará un clúster ECS e implementará la aplicación con el CDK.

Introducción

En este módulo, creará una aplicación AWS CDK, que a la vez creará toda la infraestructura necesaria para configurar un clúster ECS e implementará un contenedor de ejemplo en ella.

Lo que aprenderá

  • Crear una aplicación CDK sencilla
  • Crear un clúster ECS con Fargate para capacidad
  • Crear una definición de tarea y servicio para implementar nuestra aplicación

 Tiempo de realización

15 minutos

 Requisitos previos del módulo

  • Una cuenta de AWS con acceso de nivel de administrador**
  • Navegador recomendado: la última versión de Chrome o Firefox

[**] Es posible que las cuentas creadas en las últimas 24 horas aún no tengan acceso a los servicios necesarios para este tutorial.

Implementación

Crear la aplicación CDK

Primero, asegúrese de tener CDK instalado. Si no lo tiene instalado, diríjase a Introducción a AWS CDK:

cdk --version

Ahora crearemos el esqueleto de la aplicación CDK con TypeScript como el lenguaje elegido: Ejecute los siguientes comandos en el terminal:

mkdir cdk-ecs-infra
cd cdk-ecs-infra
cdk init app --language typescript

De este modo obtendremos lo siguiente:

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Executing npm install...
✅ All done!

Crear el código para la pila de recursos

Diríjase al archivo /lib/cdk-ecs-infra-stack.tsdonde escribirá el código para la pila de recursos que creará.

Una pila de recursos es un conjunto de recursos de infraestructura de la nube (en su caso particular, serán todos recursos de AWS), que se aprovisionarán en una cuenta específica. La cuenta/región donde se aprovisionan estos recursos se puede configurar en la pila, según se trató en la guíaIntroducción a AWS CDK.

En esta pila de recursos creará los siguientes recursos:

  • Rol de IAM: este rol se asignará al contenedor para que pueda llamar a otros servicios de AWS.
  • Definición de tarea ECS: los parámetros específicos que se utilizarán al lanzar el contenedor.
  • Patrón ECS para el servicio de equilibro de carga de Fargate: esto abstrae la complejidad de todos los componentes necesarios para crear el clúster, el balanceador de carga, el servicio y configura todo para que funcione de forma conjunta.

Crear el clúster ECS

Para comenzar a crear el clúster ECS, primero debe importar los módulos adecuados:

npm i @aws-cdk/aws-s3-assets

Luego, debe agregar la dependencia en la parte superior del archivo lib/cdk-eb-infra-stack.ts.

npm i @aws-cdk/aws-ec2 @aws-cdk/aws-ecs @aws-cdk/aws-ecs-patterns @aws-cdk/aws-iam 

Luego, editará el archivo lib/cdk-eb-infra-stack.ts para agregarle la dependencia en la parte superior:

import ecs = require('@aws-cdk/aws-ecs'); // Allows working with ECS resources
import ec2 = require('@aws-cdk/aws-ec2'); // Allows working with EC2 and VPC resources
import iam = require('@aws-cdk/aws-iam'); // Allows working with IAM resources
import ecsPatterns = require('@aws-cdk/aws-ecs-patterns') // Helper to create ECS services with loadbalancers, and configure them

Estos módulos proporcionan acceso a todos los componentes necesarios para implementar la aplicación web. El primer paso es agregar el siguiente código para localizar la VPC predeterminada existente en la cuenta:

// Look up the default VPC
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
   isDefault: true
});

Luego, definirá qué contenedor utilizar y cómo debería configurarse. Esto se realiza al crear una definición de tarea para suministrar el puerto del contenedor, la cantidad de cpu y memoria que necesita y la imagen del contenedor que se utilizará. Para esta guía, crearemos la imagen del contenedor que se proporciona con la aplicación de ejemplo en la carpetaSampleAppy haremos que CDK administre la creación, carga e implementación del contenedor por nosotros. También crearemos un rol de IAM vacío para adjuntarlo a la definición de la tarea para futuras guías. 

Para crear una definición de tarea y un rol de IAM, agregue el siguiente código:

const taskIamRole = new iam.Role(this, "AppRole", {
    roleName: "AppRole",
    assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
});

const taskDefinition = new ecs.FargateTaskDefinition(this, 'Task', {
    taskRole: taskIamRole,
});

taskDefinition.addContainer('MyContainer', {
    image: ecs.ContainerImage.fromAsset('../SampleApp'),
    portMappings: [{ containerPort: 80 }],
    memoryReservationMiB: 256,
     cpu : 256,
});

En el siguiente código, puede ver que especificó un tipo de definición de tarea para implementar en Fargate mediante FargateTaskDefintion y ContainerImage.fromAsset. CDK creará la imagen de contenedor con el Dockerfile en el directorio SampleApp.

A continuación, tendrá que configurar el clúster ECS, definir un servicio, crear un balanceador de carga, configurarlo para que se conecte al servicio y establecer las reglas del grupo de seguridad necesarias. Un servicio en ECS se utiliza para lanzar una definición de tarea al especificar el número de copias que se desea, las estrategias de implementación y otras configuraciones. Para este ejemplo, solo lanzaremos 1 copia del contenedor. Un grupo de seguridad actúa como un firewall virtual para que la instancia controle el tráfico entrante y saliente, pero no es necesario configurarlo ya que el patrón ECS utilizado lo hará por usted. 

Agregue el siguiente código al proyecto debajo de la definición de la tarea:

new ecsPatterns.ApplicationLoadBalancedFargateService(this, "MyApp", {
    vpc: vpc,
    taskDefinition: taskDefinition,
    desiredCount: 1,
    serviceName: 'MyWebApp',
    assignPublicIp: true,
    publicLoadBalancer: true,
})

Está pasando el objeto vpc que buscó con anterioridad para especificar dónde crear todos los recursos, junto con la definición de la tarea que define qué imagen de contenedor implementar. desiredCount indica la cantidad de copias que se desean, serviceName, cómo llamar al servicio y publicLoadBalancer se establece en true (verdadero) para poder acceder a él a través de Internet. La línea que establece assignPublicIp en true (verdadero) es importante en este ejemplo ya que utilizamos la VPC predeterminada que no tiene subredes privadas. Se recomienda lanzar servicios en subredes privadas, pero ese tema está fuera del alcance de esta guía.

Ya está listo para implementar la aplicación web, pero antes, necesita establecer CDK en la cuenta en la que está implementando. 

Edite el archivo bin/cdk-ecs-infra.ts y anule el comentario de la línea 14:

env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },

Esto utilizará el ID de la cuenta y la región configurada en AWS CLI. Para poder utilizar CDK, es necesario arrancarlo. Esto creará la infraestructura necesaria para que CDK administre la infraestructura en la cuenta. Para arrancar CDK, ejecute cdk bootstrap. Debería ver un resultado similar a este:

cdk bootstrap

#output
⏳  Bootstrapping environment aws://0123456789012/<region>...
✅  Environment aws://0123456789012/<region> bootstrapped

Esto creará la infraestructura necesaria para que CDK administre la infraestructura en la cuenta. Recomendamos que repase la guía Introducción a AWS CDK si no está familiarizado con la configuración de una aplicación CDK.

Una vez que se haya completado el proceso de arranque, deberá ejecutar cdk deploy para implementar el contenedor, el clúster y las demás infraestructuras requeridas. Debería ver un resultado similar a este:

gsg-build-ecs-2

CDK le preguntará antes de crear la infraestructura, ya que esta acción es la que cambia la configuración de la seguridad; en su caso, mediante la creación de roles de IAM y grupos de seguridad. Presione y luego Enter (Intro) para implementar. CDK configurará ahora toda la infraestructura que haya definido y tardará unos minutos en completarse. 

Mientras se ejecuta, verá actualizaciones como estas:

gsg-build-ecs-3

Una vez completado, verá la salida con el enlace a la URL pública para acceder al servicio de este modo:

gsg-build-ecs-4

Ejemplo de código completo

import * as cdk from '@aws-cdk/core';
import ecs = require('@aws-cdk/aws-ecs');
import ec2 = require('@aws-cdk/aws-ec2');
import iam = require('@aws-cdk/aws-iam');
import ecsPatterns = require('@aws-cdk/aws-ecs-patterns')

export class CdkEcsInfraStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

      // Look up the default VPC
      const vpc = ec2.Vpc.fromLookup(this, "VPC", {
        isDefault: true
      });

      const taskIamRole = new iam.Role(this, "AppRole", {
        roleName: "AppRole",
        assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
      });

      const taskDefinition = new ecs.FargateTaskDefinition(this, 'Task', {
        taskRole: taskIamRole,
      });

      taskDefinition.addContainer('MyContainer', {
        image: ecs.ContainerImage.fromAsset('../SampleApp'),
        portMappings: [{ containerPort: 80 }],
        memoryReservationMiB: 256,
        cpu : 256,
      });

      new ecsPatterns.ApplicationLoadBalancedFargateService(this, "MyApp", {
        vpc: vpc,
        taskDefinition: taskDefinition,
        desiredCount: 1,
        serviceName: 'MyWebApp',
        assignPublicIp: true,
        publicLoadBalancer: true,
      })

  }
}

Conclusión

En este módulo aprendió a crear un clúster ECS con un balanceador de carga para servir el tráfico al contenedor que se ejecuta en Fargate con un patrón ECS suministrado por CDK. En el siguiente módulo, eliminará todos los recursos creados en esta guía.

Siguiente: eliminar recursos

Háganos saber cómo lo hicimos.

Agradecemos sus comentarios
Nos alegra que esta página le haya ayudado. ¿Le gustaría compartir detalles adicionales para ayudarnos a seguir mejorando?
Cerrar
Agradecemos sus comentarios
Lamentamos que esta página no le haya ayudado. ¿Le gustaría compartir detalles adicionales para ayudarnos a seguir mejorando?
Cerrar