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
-
Cree un directorio llamado
SAM-Tutorial. -
En el directorio
SAM-Tutorial, cree un archivo denominadotemplate.yml. -
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
AutoPublishAliasde la plantilla la vincula a un alias denominadolive. 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 dePutLifecycleEventHookExecutionStatus. Si la prueba de validación falla, se produce un error en la implementación y se revisa.-
CodeDeployHook_beforeAllowTrafficse ejecuta durante el enlace deBeforeAllowTraffic. -
CodeDeployHook_afterAllowTrafficse ejecuta durante el enlace deAfterAllowTraffic.
El nombre de ambas funciones comienza por
CodeDeployHook_. El rol deCodeDeployRoleForLambdapermite llamadas al método deinvokede 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
AutoPublishAliasindica al marco de trabajo que detecte cuándo cambia la función demyDateTimeFunctiony, a continuación, la implementa con el aliaslive. - 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
Hooksespecifica las funciones que se van a ejecutar durante los enlaces de eventos del ciclo de vida.PreTrafficespecifica la función que se ejecuta durante el enlaceBeforeAllowTraffic.PostTrafficespecifica la función que se ejecuta durante el enlaceAfterAllowTraffic. - Permisos para que Lambda invoque otra función de Lambda
-
El permiso
lambda:InvokeFunctionespecificado concede al rol utilizado por la aplicación AWS SAM para invocar una función de Lambda. Esto es necesario cuando las funcionesCodeDeployHook_beforeAllowTrafficyCodeDeployHook_afterAllowTrafficinvocan la función de Lambda implementada durante las pruebas de validación.