Creación de la plantilla de AWS SAM - AWS CodeDeploy

Creación de la plantilla de AWS SAM

Cree un archivo de plantilla de AWS SAM que especifique los componentes de su infraestructura.

Para crear la plantilla de AWS SAM
  1. Cree un directorio llamado SAM-Tutorial.

  2. En el directorio SAM-Tutorial, cree un archivo denominado template.yml.

  3. Copie el código YAML siguiente en template.yml. Esta es la plantilla de AWS SAM.

    AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: A sample SAM template for deploying Lambda functions. Resources: # Details about the myDateTimeFunction Lambda function myDateTimeFunction: Type: AWS::Serverless::Function Properties: Handler: myDateTimeFunction.handler Runtime: nodejs18.x # Instructs your myDateTimeFunction is published to an alias named "live". AutoPublishAlias: live # Grants this function permission to call lambda:InvokeFunction Policies: - Version: "2012-10-17" Statement: - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: '*' DeploymentPreference: # Specifies the deployment configuration Type: Linear10PercentEvery1Minute # Specifies Lambda functions for deployment lifecycle hooks Hooks: PreTraffic: !Ref beforeAllowTraffic PostTraffic: !Ref afterAllowTraffic # Specifies the BeforeAllowTraffic lifecycle hook Lambda function beforeAllowTraffic: Type: AWS::Serverless::Function Properties: Handler: beforeAllowTraffic.handler Policies: - Version: "2012-10-17" # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus Statement: - Effect: "Allow" Action: - "codedeploy:PutLifecycleEventHookExecutionStatus" Resource: !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*' - Version: "2012-10-17" # Grants this function permission to call lambda:InvokeFunction Statement: - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: !Ref myDateTimeFunction.Version Runtime: nodejs18.x # Specifies the name of the Lambda hook function FunctionName: 'CodeDeployHook_beforeAllowTraffic' DeploymentPreference: Enabled: false Timeout: 5 Environment: Variables: NewVersion: !Ref myDateTimeFunction.Version # Specifies the AfterAllowTraffic lifecycle hook Lambda function afterAllowTraffic: Type: AWS::Serverless::Function Properties: Handler: afterAllowTraffic.handler Policies: - Version: "2012-10-17" Statement: # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus - Effect: "Allow" Action: - "codedeploy:PutLifecycleEventHookExecutionStatus" Resource: !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*' - Version: "2012-10-17" Statement: # Grants this function permission to call lambda:InvokeFunction - Effect: "Allow" Action: - "lambda:InvokeFunction" Resource: !Ref myDateTimeFunction.Version Runtime: nodejs18.x # Specifies the name of the Lambda hook function FunctionName: 'CodeDeployHook_afterAllowTraffic' DeploymentPreference: Enabled: false Timeout: 5 Environment: Variables: NewVersion: !Ref myDateTimeFunction.Version

Esta plantilla especifica lo siguiente. Para obtener más información, consulte Conceptos de la plantilla de AWS SAM.

Una función de Lambda llamada myDateTimeFunction

Cuando se publica esta función de Lambda, la línea AutoPublishAlias de la plantilla la vincula a un alias denominado live. Más adelante en este tutorial, una actualización de esta función desencadena una implementación de AWS CodeDeploy que desvía gradualmente el tráfico de producción de la versión original a la versión actualizada.

Dos funciones de validación de implementación de Lambda

Las siguientes funciones de Lambda se ejecutan durante los enlaces de ciclo de vida de CodeDeploy. Las funciones contienen código que valida la implementación de actualizado myDateTimeFunction. El resultado de las pruebas de validación se transfiere a CodeDeploy utilizando su método de la API de PutLifecycleEventHookExecutionStatus. Si la prueba de validación falla, se produce un error en la implementación y se revisa.

  • CodeDeployHook_beforeAllowTraffic se ejecuta durante el enlace de BeforeAllowTraffic.

  • CodeDeployHook_afterAllowTraffic se ejecuta durante el enlace de AfterAllowTraffic.

El nombre de ambas funciones comienza por CodeDeployHook_. El rol de CodeDeployRoleForLambda permite llamadas al método de invoke de Lambda solo en funciones de Lambda con nombres que comienzan con este prefijo. Para obtener más información, consulte Sección "hooks" de AppSpec para una implementación de AWS Lambda y PutLifecycleEventHookExecutionStatus en la Referencia de la API de CodeDeploy.

Detección automática de una función de Lambda actualizada

El término AutoPublishAlias indica al marco de trabajo que detecte cuándo cambia la función de myDateTimeFunction y, a continuación, la implementa con el alias live.

Una configuración de implementación

La configuración de implementación determina la velocidad a la que la aplicación CodeDeploy desvía el tráfico de la versión original de la función de Lambda función a la nueva versión. Esta plantilla especifica la configuración de implementación predefinida Linear10PercentEvery1Minute.

nota

No puede especificar una configuración de implementación personalizada en una plantilla de AWS SAM. Para obtener más información, consulte Create a Deployment Configuration.

Funciones de enlace de ciclo de vida de implementación

La sección Hooks especifica las funciones que se van a ejecutar durante los enlaces de eventos del ciclo de vida. PreTraffic especifica la función que se ejecuta durante el enlace BeforeAllowTraffic. PostTraffic especifica la función que se ejecuta durante el enlace AfterAllowTraffic.

Permisos para que Lambda invoque otra función de Lambda

El permiso lambda:InvokeFunction especificado concede al rol utilizado por la aplicación AWS SAM para invocar una función de Lambda. Esto es necesario cuando las funciones CodeDeployHook_beforeAllowTraffic y CodeDeployHook_afterAllowTraffic invocan la función de Lambda implementada durante las pruebas de validación.