Implementar una aplicación web en AWS Elastic Beanstalk

GUÍA DE INTRODUCCIÓN

Módulo 2: Crear infraestructura mediante AWS CDK

En este módulo creará una aplicación de CDK que, a su vez, creará toda la infraestructura necesaria para implementar su aplicación web de NodeJS mediante Elastic Beanstalk.

Introducción

En este módulo creará una aplicación de CDK que, a su vez, creará toda la infraestructura necesaria para implementar su aplicación web de NodeJS mediante AWS Elastic Beanstalk.

Lo que aprenderá

  • Crear una aplicación de CDK sencilla
  • Cargar un paquete en S3 con S3 Assets
  • Crear una aplicación de CDK, la versión de la aplicación y el entorno de Elastic Beanstalk

 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 de CDK

Asegúrese de que cuenta con la versión de CDK más reciente.

npm install -g cdk

Cree un nuevo directorio y acceda a él.

mkdir cdk-eb-infra
cd cdk-eb-infra

Inicie la aplicación de CDK que utilizará para crear la infraestructura.

cdk init app --language typescript

Crear el código para la pila de recursos

Vaya al archivo /lib/cdk-eb-infra-stack.ts; allí escribirá el código para la pila de recursos que va a crear. 

Una pila de recursos es un conjunto de recursos de infraestructura de la nube (en su caso particular, todos serán recursos de AWS), los cuales se aprovisionarán a una cuenta específica. La cuenta donde esos recursos van a aprovisionarse es la pila que configuró en los requisitos previos necesarios. En esta pila de recursos va a crear los siguientes recursos:

  • S3 Assets: lo ayudará a cargar su aplicación comprimida en S3 y brindará a la aplicación de CDK una forma de conseguir la ubicación del objeto.
  • Aplicación de Elastic Beanstalk: una colección lógica de componentes de Elastic Beanstalk, incluidos entornos, versiones y configuraciones del entorno.
  • Versión de la aplicación de Elastic Beanstalk: hace referencia a una iteración específica y etiquetada de código implementable para una aplicación web. Una versión de una aplicación apunta a un objeto de Amazon Simple Storage Service (Amazon S3) que contiene el código implementable, en su caso el archivo .zip que cargará a S3 mediante S3 Assets. Las aplicaciones pueden tener varias versión, y cada una de ellas es única.
  • Perfil de instancias y rol: un contenedor para un rol de AWS Identity and Access Management (IAM) que puede utilizar para transmitir información del rol a una instancia de Amazon EC2 cuando se inicie la instancia.
  • Entorno de Elastic Beanstalk: se trata de una colección de recursos de AWS que ejecutan una versión de la aplicación. Cada entorno ejecuta únicamente una versión de la aplicación a la vez.

Cargar la aplicación a S3 automáticamente

Para implementar su aplicación web, necesitará empaquetarla y cargarla en Amazon Simple Storage Service (S3) para que Elastic Beanstalk pueda implementar esa aplicación en el entorno.

Realizaremos el empaquetado de la aplicación en el Módulo 3 de esta guía, pero por ahora nos centraremos en cargarla en S3. Para ello, utilizará un constructor de CDK llamado S3Assets. Este módulo cargará sus archivos locales y el directorio en S3.

Para hacerlo en nuestra aplicación de CDK, primero debe instalar el módulo aws-s3-assets.

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

A continuación, en su archivo lib/cdk-eb-infra-stack.ts debe agregar la dependencia en la parte superior del archivo.

import s3assets = require('@aws-cdk/aws-s3-assets');

Dentro de la pila, bajo la línea comentada que dice “The code that defines your stack goes here” (El código que define su pila va aquí), agregue el código siguiente.

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

Este código utiliza el módulo S3 Assets y toma el archivo .zip de la aplicación web ubicado en la raíz de la aplicación de CDK, y lo carga en S3. Cuando actualice el archivo.zip e implementa esta pila, el archivo se actualizará en S3.

Agregar las dependencias de CDK de Elastic Beanstalk

Vamos a crear la aplicación, la versión de la aplicación y el entorno de Elastic Beanstalk, de modo que pueda implementar la aplicación web que subió a S3 mediante S3 Assets.

Primero, debe instalar el módulo de Elastic Beanstalk para CDK.

npm i @aws-cdk/aws-elasticbeanstalk

A continuación, agregue la dependencia a la parte superior del archivo /lib/cdk-eb-infra-stack.ts.

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Crear la aplicación de Elastic Beanstalk

Ahora puede crear la aplicación de Elastic Beanstalk. Tal y como se mencionó antes, la aplicación de Elastic Beanstalk es una colección lógica de componentes de Elastic Beanstalk, como una carpeta.

Ponga este código bajo el código de S3Assets. Este código creará la aplicación con el nombre MyWebApp en Elastic Beanstalk.

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Crear la versión de la aplicación de Elastic Beanstalk

Ahora debe crear una versión de la aplicación a partir del activo de S3 que creó antes. Este fragmento del código creará la versión de la aplicación mediante el nombre del bucket de S3 y la clave de objeto de S3 que S3 Assets y CDK brindarán a este método.

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

Antes de continuar, asegúrese de que la aplicación de Elastic Beanstalk existe antes de crear la versión de la aplicación; esto puede hacerse fácilmente con CDK.

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

Crear el perfil de instancias

Para crear su entorno de Elastic Beanstalk, deberá brindar un nombre de perfil de instancias existente.

Un perfil de instancias es un contenedor para un rol de AWS Identity and Access Management (IAM) que puede utilizar para transmitir información del rol a una instancia de Amazon EC2 cuando se inicie la instancia.

En su caso, el rol estará adjuntado a la política administrada AWSElasticBeanstalkWebTier. Esta política concede permisos a la aplicación para cargar registros en Amazon S3 y depurar información para AWS X-Ray.

Lo primero que debe hacer es instalar el módulo de IAM en su aplicación de CDK.

npm i @aws-cdk/aws-iam

Luego, importe la dependencia en la pila de CDK en la que hemos estado trabajando:

import iam = require('@aws-cdk/aws-iam');

Tras el código para crear la versión de la aplicación, puede agregar este código:

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

Lo primero que hace este código es crear un nuevo rol de IAM (myRole).

Para permitir que las instancias EC2 de su entorno asuman el rol, el perfil de instancias especifica Amazon EC2 como una entidad de confianza en la política de relación de confianza.

Agregaremos a ese rol la política administrada AWSElasticBeanstalkWebTier; a continuación, con ese rol y el nombre del perfil creamos el perfil de instancias.

Crear el entorno de Elastic Beanstalk

En esta última parte es necesario crear el entorno de Elastic Beanstalk. El entorno es una colección de recursos de AWS que ejecutan una versión de la aplicación. Para el entorno, necesitaremos brindar algo de información sobre la infraestructura.

Vamos a empezar con la creación del entorno. Cuando creas el entorno necesitas darle un nombre que aparecerá en la consola de Elastic Beanstalk; en este caso, nombraremos el entorno como MyWebAppEnvironment.

A continuación, debe proporcionar el nombre de la aplicación, que obtendrá de la definición de la aplicación de Elastic Beanstalk anterior.

El nombre de la pila de la solución es el nombre de la plataforma administrada que Elastic Beanstalk brinda para aplicaciones web en ejecución. Al usar el nombre de solución correcto, Elastic Beanstalk aprovisionará los recursos adecuados para su aplicación, por ejemplo las instancias de Amazon Elastic Compute Cloud (Amazon EC2). Debe elegir la pila de software correcta según el marco y la plataforma que elija para desarrollar su aplicación web. Para este caso en particular, va a utilizar esta cadena “64bit Amazon Linux 2 v5.4.4 running Node.js 14”. Al final de este módulo encontrará más información sobre nombres de pilas de soluciones, en caso de que esté interesado en saber de dónde viene esta cadena.

El atributo de ajustes de opciones le permite configurar el entorno de Elastic Beanstalk según sus necesidades:

  • IamInstanceProfile: aquí hará referencia al perfil de instancias creado en los pasos anteriores.
  • MinSize, MaxSize y InstanceTypes: configuraciones para sus instancias y el grupo de escalado automático que Elastic Beanstalk genera para usted. Se trata de parámetros opcionales, de modo que si no los configura, Elastic Beanstalk escogerá el tipo de instancias y los tamaños mínimo y máximo del grupo de escalado automático según la definición de la plataforma. Los está definiendo de modo que permanezca dentro del nivel gratuito de AWS.

Más información sobre Opciones de configuración para Elastic Beanstalk

Para definir todas estas opciones de configuración agregue las siguientes líneas de código:

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

Por último, tenemos la etiqueta de versión. Se trata de un atributo importante puesto que es una referencia de la versión de la aplicación que acabamos de crear.

Con toda esta información, ahora puede creer su entorno de Elastic Beanstalk.

Pegue este código en su archivo de definición de pila.

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

Errores comunes

Usar varias versiones de las bibliotecas de CDK

Un error común que puede darse al utilizar CDK es que, al importar una biblioteca y comenzar a utilizarla en su aplicación, la palabra “this” (esto) aparezca destacada y vea un error de compilación.

gsg_build_elb_1

Esto puede ocurrir porque está utilizando un módulo de CDK con una versión diferente a la de la biblioteca principal de CDK. CDK se actualiza muy a menudo, así que es un error bastante frecuente.

Para arreglarlo, es necesario actualizar todos los paquetes de CDK a la misma versión. Puede ver la versión de sus paquetes de CDK en el archivo package.json de su aplicación CDK.

gsg_build_elb_2

Más información

Más información sobre el nombre de pila de soluciones de Elastic Beanstalk

En la documentación puede obtener información sobre todas las plataformas compatibles con Elastic Beanstalk. Esta página se sigue actualizando a medida que se agregan nuevas plataformas y se retiran otras más antiguas.

Si tiene curiosidad por saber cómo obtener el nombre de plataforma correcto: por ejemplo, 64bit Amazon Linux 2 v5.4.4 ejecutando Node.js 14. Puede utilizar AWS CLI para obtener una lista de todas las plataformas compatibles.

aws elasticbeanstalk list-available-solution-stacks

Obtendrá una larga lista de cadenas de plataformas compatibles que puede utilizar en su aplicación CDK.

Conclusión

En este Módulo ha aprendido a crear todos los recursos necesarios de Elastic Beanstalk para implementar su aplicación de manera automática. En el siguiente módulo aprenderá cómo implementar esto en la nube y a actualizar su aplicación cuando haya cambios.

Siguiente: Implementar la aplicación

Háganos saber su opinión.

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