Introducción al uso de sam sync para sincronizar con Nube de AWS - AWS Serverless Application Model

Introducción al uso de sam sync para sincronizar con Nube de AWS

El comando sam sync de la Interfaz de la línea de comando de AWS Serverless Application Model (CLI de AWS SAM) proporciona opciones para sincronizar rápidamente los cambios de la aplicación local con la Nube de AWS. Utiliza sam sync al desarrollar sus aplicaciones para:

  1. Detectar y sincronizar automáticamente los cambios locales en la Nube de AWS.

  2. Personalizar los cambios locales que se sincronizan con la Nube de AWS.

  3. Preparar tu aplicación en la nube para probarla y validarla.

Con sam sync, puede crear un flujo de trabajo de desarrollo rápido que reduzca el tiempo necesario para sincronizar los cambios locales con la nube para realizar pruebas y validaciones.

nota

Se recomienda usar el comando sam sync para entornos de desarrollo. Para los entornos de producción, recomendamos usar sam deploy o configurar una canalización de integración y entrega continuas (CI/CD). Para obtener más información, consulta Implementación de la aplicación y los recursos con AWS SAM.

El comando sam sync forma parte de AWS SAM Accelerate. Accelerate AWS SAM proporciona herramientas que puede utilizar para acelerar la experiencia de desarrollo y prueba de aplicaciones sin servidor en la Nube de AWS.

Detectar y sincronizar automáticamente los cambios locales en la Nube de AWS.

Ejecute sam sync con la opción --watch para comenzar a sincronizar tu aplicación con la Nube de AWS. Esto hace lo siguiente:

  1. Crear tu aplicación: este proceso es similar a usar el comando sam build.

  2. Implementar tu aplicación: la CLI de AWS SAM implementa tu aplicación en AWS CloudFormation utilizando su configuración predeterminada. Se usan los siguientes valores predeterminados:

    1. Las credenciales de AWS y los ajustes de configuración generales que se encuentran en su carpeta de usuario de .aws.

    2. La configuración de implementación de la aplicación se encuentra en el archivo samconfig.toml de la aplicación.

    Si no se encuentran los valores predeterminados, la CLI de AWS SAM se lo comunicará y saldrá del proceso de sincronización.

  3. Esté atento a los cambios locales: la CLI de AWS SAM sigue ejecutándose y vigila los cambios locales en tu aplicación. Esto es lo que ofrece la opción --watch.

    Esta opción puede que esté activada de forma predeterminada. Para ver los valores predeterminados, consulta el archivo samconfig.toml de tu aplicación. A continuación se muestra un ejemplo de un archivo:

    ... [default.sync] [default.sync.parameters] watch = true ...
  4. Sincronizar los cambios locales con la Nube de AWS: cuando realiza cambios locales, la CLI de AWS SAM detecta y sincroniza esos cambios con la Nube de AWS a través del método más rápido disponible. Según el tipo de cambio, puede ocurrir lo siguiente:

    1. Si el recurso actualizado es compatible con las API de servicio de AWS, la CLI de AWS SAM lo usará para implementar los cambios. Esto da como resultado una sincronización rápida para actualizar el recurso en la Nube de AWS.

    2. Si el recurso actualizado no es compatible con las API de servicio de AWS, la CLI de AWS SAM realizará una implementación en CloudFormation. Esto actualiza toda la aplicación en la Nube de AWS. Si bien no es tan rápido, evita que tenga que iniciar una implementación manualmente.

Dado que el comando sam sync actualiza automáticamente la aplicación en la Nube de AWS, solo se recomienda su uso en entornos de desarrollo. Cuando ejecuta sam sync, se le pedirá que confirme:

**The sync command should only be used against a development stack**.

Confirm that you are synchronizing a development stack.

Enter Y to proceed with the command, or enter N to cancel:
 [Y/n]: ENTER

Personalizar los cambios locales que se sincronizan con la Nube de AWS

Proporcionar opciones para personalizar los cambios locales que se sincronizan con la Nube de AWS. Esto puede acelerar el tiempo que se tarda en ver los cambios locales en la nube para probarlos y validarlos.

Por ejemplo, existe la opción --code de sincronizar solo los cambios de código, como el código de función de AWS Lambda. Durante el desarrollo, si se centra específicamente en el código Lambda, sus cambios llegarán rápidamente a la nube para probarlos y validarlos. A continuación, se muestra un ejemplo:

$ sam sync --code --watch

Para sincronizar solo los cambios de código de una función o capa de Lambda específica, utiliza la opción --resource-id. A continuación, se muestra un ejemplo:

$ sam sync --code --resource-id HelloWorldFunction --resource-id HelloWorldLayer

Preparar tu aplicación en la nube para probarla y validarla.

El comando sam sync busca automáticamente el método más rápido disponible para actualizar la aplicación en la Nube de AWS. Esto puede acelerar sus flujos de trabajo de desarrollo y pruebas en la nube. Al utilizar las API de servicio de AWS, puede desarrollar, sincronizar y probar rápidamente los recursos compatibles. Para ver un ejemplo práctico, consulta el módulo 6: AWS SAM Accelerate en el taller completo de AWS SAM.

Opciones para el comando de sincronización sam

Las siguientes son algunas de las opciones principales que puede utilizar para modificar el comando sam sync. Para obtener una lista de todas las opciones, consulta sam sync.

Realiza una implementación de CloudFormation de un solo uso

Usa la opción --no-watch para desactivar la sincronización automática. A continuación, se muestra un ejemplo:

$ sam sync --no-watch

La CLI de AWS SAM realizará una implementación de CloudFormation de un solo uso Este comando agrupa las acciones realizadas por los comandos sam build y sam deploy.

Omita la implementación de CloudFormation inicial

Se puede personalizar si se requiere una implementación de CloudFormation cada vez sam sync que se ejecuta.

  • Proporciona --no-skip-deploy-sync para requerir una implementación de CloudFormation cada vez que se ejecuta sam sync. Esto garantiza que su infraestructura local esté sincronizada con la CloudFormation, lo que evita pérdidas. El uso de esta opción añade tiempo adicional a su flujo de trabajo de desarrollo y pruebas.

  • Proporciona --skip-deploy-sync para que la implementación de CloudFormation sea opcional. La CLI de AWS SAM comparará su plantilla de AWS SAM local con la plantilla CloudFormation implementada y se saltará la implementación de CloudFormation inicial si no se detecta un cambio. Saltarse la implementación de CloudFormation puede ahorrarle tiempo a la hora de sincronizar los cambios locales con la Nube de AWS.

    Si no se detecta ningún cambio, la CLI de AWS SAM seguirá realizando una implementación de CloudFormation en los siguientes escenarios:

    • Si han pasado 7 días o más desde la última implementación de CloudFormation.

    • Si se detecta una gran cantidad de cambios en el código de la función de Lambda, la implementación de CloudFormation es el método más rápido para actualizar la aplicación.

A continuación, se muestra un ejemplo:

$ sam sync --skip-deploy-sync

Sincronice un recurso de una pila anidada

Para sincronizar un recurso de una pila anidada
  1. Proporciona la pila raíz utilizando --stack-name.

  2. Identifique el recurso en la pila anidada con el siguiente formato: nestedStackId/resourceId.

  3. Proporciona el recurso en la pila anidada usando --resource-id.

    A continuación, se muestra un ejemplo:

    $ sam sync --code --stack-name sam-app --resource-id myNestedStack/HelloWorldFunction

Para obtener más información sobre cómo crear aplicaciones anidadas, consulta Reutilización del código y los recursos mediante aplicaciones anidadas en AWS SAM.

Especifica una pila de CloudFormation específica para actualizarla

Para especificar una pila de CloudFormation específica para actualizarla, proporciona la opción --stack-name. A continuación, se muestra un ejemplo:

$ sam sync --stack-name dev-sam-app

Acelere los tiempos de compilación al compilar el proyecto en la carpeta de origen

Para consultar los tiempos de ejecución y los métodos de compilación compatibles, puedes usar la opción de --build-in-source para compilar el proyecto directamente en la carpeta de origen. De forma predeterminada, AWS SAM CLI compila en un directorio temporal, lo que implica copiar el código fuente y los archivos del proyecto. Con --build-in-source, AWS SAM CLI compila directamente en la carpeta de origen, lo que acelera el proceso de compilación al eliminar la necesidad de copiar archivos en un directorio temporal.

Para obtener una lista de tiempos de ejecución y métodos de compilación compatibles, consulta --build-in-source.

Especificar archivos y carpetas que no iniciarán una sincronización

Utiliza la opción --watch-exclude para especificar cualquier archivo o carpeta que no iniciará una sincronización cuando se actualice. Para obtener más información acerca de esta opción, consulta --watch-exclude.

El siguiente es un ejemplo que excluye el archivo package-lock.json asociado a nuestra función de HelloWorldFunction:

$ sam sync --watch --watch-exclude HelloWorldFunction=package-lock.json

Cuando se ejecuta este comando, AWS SAM CLI iniciará el proceso de sincronización. Esta incluye lo siguiente:

  • Ejecute sam build para crear las funciones y preparar la aplicación para la implementación.

  • Ejecute sam deploy para implementar la aplicación.

  • Esté atento a los cambios en la aplicación.

Al modificar el archivo de package-lock.json, AWS SAM CLI no iniciará una sincronización. Cuando se actualice otro archivo, AWS SAM CLI iniciará una sincronización, que incluirá el archivo de package-lock.json.

El siguiente es un ejemplo de cómo especificar una función de Lambda de una pila secundaria:

$ sam sync --watch --watch-exclude ChildStackA/MyFunction=database.sqlite3

Solución de problemas

Para solucionar problemas de la CLI de AWS SAM, consulta Solución de problemas para AWS SAM CLI.

Ejemplos

Uso de sam sync para actualizar la aplicación Hello World

En este ejemplo, empezamos inicializando la aplicación de muestra Hello World. Para obtener más información sobre esta aplicación, consulta Tutorial: Implementación de una aplicación Hello World con AWS SAM.

Ejecutar sam sync inicia el proceso de creación e implementación.

$ sam sync The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without performing a CloudFormation deployment. This will cause drift in your CloudFormation stack. **The sync command should only be used against a development stack**. Confirm that you are synchronizing a development stack. Enter Y to proceed with the command, or enter N to cancel: [Y/n]: Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder (.aws-sam/deps/0663e6fe-a888-4efb-b908-e2344261e9c7) is missing for (HelloWorldFunction), downloading dependencies and copying/building source Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CleanUp Running PythonPipBuilder:ResolveDependencies Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpx_5t4u3f --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisam-s3-demo-bucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 11:17:19 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt Resource creation Initiated ack CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole - CREATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d Resource creation Initiated 5f9d CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd CREATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack creation succeeded. Sync infra completed. Infra sync completed. CodeTrigger not created as CodeUri or DefinitionUri is missing for ServerlessRestApi.

Una vez completada la implementación, modificamos el código HelloWorldFunction. La CLI de AWS SAM detecta este cambio y sincroniza la aplicación con la Nube de AWS. Como AWS Lambda es compatible con las API de servicio de AWS, se realiza una sincronización rápida.

Syncing Lambda Function HelloWorldFunction...
Manifest is not changed for (HelloWorldFunction), running incremental build
Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CopySource
Finished syncing Lambda Function HelloWorldFunction.

A continuación, modificamos el punto final de nuestra API en la plantilla de AWS SAM de la aplicación. Cambiamos /hello por /helloworld.

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: HelloWorldFunction: ... Properties: ... Events: HelloWorld: Type: Api Properties: Path: /helloworld Method: get

Como el recurso Amazon API Gateway no es compatible con la API de servicio de AWS, la CLI de AWS SAM realiza una implementación de CloudFormation automáticamente. El siguiente es un ejemplo de output:

Queued infra sync. Waiting for in progress code syncs to complete... Starting infra sync. Manifest is not changed for (HelloWorldFunction), running incremental build Building codeuri: /Users/.../Demo/sync/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction Running PythonPipBuilder:CopySource Build Succeeded Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9. Execute the following command to deploy the packaged template sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpuabo0jb9 --stack-name <YOUR STACK NAME> Deploying with following values =============================== Stack name : sam-app Region : us-west-2 Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samclisam-s3-demo-bucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"] Parameter overrides : {} Signing Profiles : null Initiating deployment ===================== 2023-03-17 14:41:18 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 0.5 seconds) --------------------------------------------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------------------------------------------- UPDATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded UPDATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack UPDATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi - UPDATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi - CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Requested update requires the ssionProd creation of a new physical resource; hence creating one. UPDATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi Resource creation Initiated ssionProd CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e Resource creation Initiated d3cd CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment8cf30e - d3cd UPDATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage - UPDATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE_CLEANUP_IN_PROGRE AWS::CloudFormation::Stack sam-app - SS DELETE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd DELETE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d DELETE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d - 5f9d UPDATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedSt - ack DELETE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermi - ssionProd UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app - --------------------------------------------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack ---------------------------------------------------------------------------------------------------------------------------------------------- Outputs ---------------------------------------------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/sam-app-HelloWorldFunctionRole-BUFVMO2PJIYF Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://pcrx5gdaof.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-2PlN6TPTQoco ---------------------------------------------------------------------------------------------------------------------------------------------- Stack update succeeded. Sync infra completed. Infra sync completed.

Más información

Para ver una descripción de las opciones de sam sync, consulta sam sync.