Implementar aplicaciones sin servidor de forma gradual AWS SAM - AWS Serverless Application Model

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implementar aplicaciones sin servidor de forma gradual AWS SAM

AWS Serverless Application Model(AWS SAM) viene integrado con CodeDeploy para proporcionar implementaciones AWS Lambda graduales. Con solo unas pocas líneas de configuración, AWS SAM hace lo siguiente por ti:

  • Implementa nuevas versiones de la función de Lambda y crea automáticamente alias que apuntan a la nueva versión.

  • Cambia gradualmente el tráfico de clientes a la nueva versión hasta que esté satisfecho de que funciona como se esperaba. Si una actualización no funciona correctamente, puedes deshacer los cambios.

  • Define funciones de prueba previas y posteriores al tráfico para verificar que el código recién implementado está configurado correctamente y que la aplicación funciona como se espera.

  • Revierte automáticamente la implementación si se activan las alarmas de CloudWatch.

nota

Si habilita las implementaciones graduales a través de la plantilla de AWS SAM, se crea automáticamente un recurso de CodeDeploy. Puedes ver el recurso CodeDeploy directamente a través de la AWS Management Console.

Ejemplo

El siguiente ejemplo demuestra el uso de CodeDeploy para trasladar gradualmente a los clientes a la versión recién implementada de la función de Lambda:

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before & after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction

Estas revisiones de la plantilla de AWS SAM hacen lo siguiente:

  • AutoPublishAlias: al añadir esta propiedad y especificar un nombre de alias, AWS SAM:

    • Detecta cuándo se implementa código nuevo, en función de los cambios en el URI de Amazon S3 de la función de Lambda.

    • Crea y publica una versión actualizada de esa función con el código más reciente.

    • Crea un alias con el nombre que usted le indique (a menos que ya exista un alias) y apunta a la versión actualizada de la función de Lambda. Las invocaciones de la función deben utilizar el cualificador de alias para poder usar esta característica. Si no estás familiarizado con el control de versiones y los alias de las funciones de Lambda, consulta Control de versiones y alias de las funciones de AWS Lambda.

  • Deployment Preference Type: En el ejemplo anterior, el 10 % del tráfico de clientes se desvía inmediatamente a la nueva versión. Transcurridos 10 minutos, todo el tráfico se desvía a la nueva versión. Sin embargo, si fallan las pruebas previas o posteriores al tráfico, o si se activa una alarma de CloudWatch, CodeDeploy revierte la implementación. Puedes especificar cómo debe desviarse el tráfico entre versiones de las siguientes maneras:

    • Canary: el tráfico se desvía en dos incrementos. Puedes elegir entre opciones de valores controlados predefinidos. Las opciones especifican el porcentaje de tráfico que se desvía a la versión actualizada de la función de Lambda en el primer incremento y el intervalo, en minutos, antes de que se desvíe el tráfico restante en el segundo incremento.

    • Linear: El tráfico se desvía en incrementos iguales con el mismo número de minutos entre incrementos. Puedes elegir opciones lineales predefinidas que especifiquen el porcentaje de tráfico desviado en cada incremento y el número de minutos entre cada incremento.

    • AllAtOnce: todo el tráfico se desvía a la vez desde la función de Lambda original a la versión de la función de Lambda actualizada.

    En la siguiente tabla se describen otras opciones de cambio de tráfico que están disponibles además de la utilizada en el ejemplo.

    Tipo de preferencia de implementación

    Canary10Percent30Minutes

    Canary10Percent5Minutes

    Canary10Percent10Minutes

    Canary10Percent15Minutes

    Linear10PercentEvery10Minutes

    Linear10PercentEvery1Minute

    Linear10PercentEvery2Minutes

    Linear10PercentEvery3Minutes

    AllAtOnce

  • Alarms: se trata de alarmas de CloudWatch que se activan ante cualquier error provocado por la implementación. Cuando se detectan, anulan automáticamente la implementación. Por ejemplo, si el código actualizado que está implementando provoca errores en la aplicación. Otro ejemplo es si alguna métrica de CloudWatch AWS Lambda o una métrica personalizada que especificó ha superado el umbral de alarma.

  • Hooks: estas son funciones de testeo anteriores y posteriores al tráfico que realizan comprobaciones antes de que el tráfico empiece a desviarse a la nueva versión y una vez completado el desvío de tráfico.

    • PreTraffic: antes de que comience el desvío de tráfico, CodeDeploy invocará la función de Lambda de enlace previo al tráfico. Esta función de Lambda debe devolver la llamada a CodeDeploy e indicar el éxito o el fracaso. Si la función falla, se interrumpe y notifica el error a AWS CloudFormation. Si la función se ejecuta correctamente, CodeDeploy pasa al cambio de tráfico.

    • PostTraffic: una vez completado el cambio de tráfico, CodeDeploy invoca la función de Lambda posterior al enlace de tráfico. Esto es similar al enlace previo al tráfico, donde la función debe llamar a CodeDeploy para informar del éxito o fracaso de la operación. Utiliza enlaces posteriores al tráfico para ejecutar pruebas de integración u otras acciones de validación.

    Para obtener más información, consulta SAM Reference to Safe Deployments.

Implementación gradual de una función de Lambda por primera vez.

Al implementar una función de Lambda de forma gradual, CodeDeploy requiere una versión de función previamente implementada desde la que desviar el tráfico. Por lo tanto, su primera implementación debe realizarse en dos pasos:

  • Paso 1: implementa la función de Lambda y crea alias automáticamente con AutoPublishAlias.

  • Paso 2: haz tu implementación gradual con DeploymentPreference

Al realizar tu primera implementación gradual en dos pasos, CodeDeploy dispone de una versión anterior de la función de Lambda desde la que transferir el tráfico.

Paso 1: implementación de la función de Lambda

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live

Paso 2: realizar la implementación gradual

Resources: MyLambdaFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs20.x CodeUri: s3://bucket/code.zip AutoPublishAlias: live DeploymentPreference: Type: Canary10Percent10Minutes Alarms: # A list of alarms that you want to monitor - !Ref AliasErrorMetricGreaterThanZeroAlarm - !Ref LatestVersionErrorMetricGreaterThanZeroAlarm Hooks: # Validation Lambda functions that are run before and after traffic shifting PreTraffic: !Ref PreTrafficLambdaFunction PostTraffic: !Ref PostTrafficLambdaFunction

Más información

Para ver un ejemplo práctico de cómo configurar una implementación gradual, consulta el Módulo 5: implementaciones de valores controlados en el taller completo de AWS SAM.