es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo actualizar una función de AWS Lambda utilizando una plantilla de CloudFormation?

Quiero implementar y actualizar una función de Lambda utilizando stacks de CloudFormation.

Mis flujos de trabajo para la creación de la stack son los siguientes:
1. Subir el código de mi función de Lambda (archivo zip) a S3.
2. Utilizar el bucket de S3 (donde se almacena el código de la función de Lambda) y el nombre de archivo de Lambda como parámetros de CloudFormation para crear las stacks utilizando la plantilla de CloudFormation.

Sin embargo, no tengo idea de cómo actualizar la función de Lambda utilizando la plantilla.
He intentado cargar el nuevo código de la función en S3 y guardarla con un nuevo nombre de archivo. Luego, he utilizado el nuevo archivo como parámetros para actualizar las stacks. Pero CloudFormation no puede detectar ningún cambio debido a que el archivo es un archivo zip.

Mis preguntas son:
1. ¿Cómo puedo actualizar la función de Lambda utilizando la plantilla de CloudFormation?
2. ¿Debo utilizar los recursos AWS::Lambda::Function o AWS::Serverless::Function? Quiero tener soporte para el control de versiones.

Gracias.

Mi plantilla de CloudFormation es la siguiente:

AWSTemplateFormatVersion: "2010-09-09"
Metadata: ""
Description: ""
Parameters:

  LambdaS3:
    Description: Nombre del bucket de S3 para la función de autorizador de la API Gateway
    Type: String

  Lambdafilename:
    Description: Nombre del archivo para la función de autorizador de la API Gateway (el más reciente)
    Type: String

Transform: AWS::Serverless-2016-10-31

Resources:

  LambdaFunction:
    DeletionPolicy: "Delete"
    Type: "AWS::Lambda::Function"
    Properties:
      Description: ""
      FunctionName: "LambdaFunction"
      Handler: "lambda_function.lambda_handler"
      Code:
        S3Bucket: !Ref LambdaS3
        S3Key: !Sub '${Lambdafilename}.zip'
      MemorySize: 512
      Role: !GetAtt IAMRole2.Arn
      Runtime: "python3.8"
      Timeout: 20
      TracingConfig:
        Mode: "PassThrough"

  LambdaFunction:
    DeletionPolicy: "Delete"
    Type: "AWS::Serverless::Function"
    Properties:
      Description: ""
      FunctionName: "LambdaFunction"
      Handler: "lambda_function.lambda_handler"
      CodeUri:
        Bucket: !Ref LambdaS3
        Key: !Sub '${Lambdafilename}.zip'
      MemorySize: 512
      Role: !GetAtt IAMRole2.Arn
      Runtime: "python3.8"
      Timeout: 20
      Tracing: "PassThrough"
      AutoPublishAlias: live
      DeploymentPreference:
        Type: Linear10PercentEvery10Minutes
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para actualizar una función Lambda utilizando una plantilla de CloudFormation, es necesario subir el nuevo código de la función a S3 con una nueva clave de objeto. Luego, se puede actualizar la pila de CloudFormation proporcionando el valor de la nueva clave de objeto como un parámetro de CloudFormation. CloudFormation detectará los cambios y actualizará la función Lambda con el nuevo código.

    Se pueden utilizar los recursos AWS::Lambda::Function o AWS::Serverless::Function para crear y actualizar las funciones Lambda. Ambos recursos admiten el control de versiones. Se recomienda utilizar AWS::Serverless::Function por su sintaxis abreviada y su soporte integrado para API Gateway, roles de IAM y otros recursos.

    Para utilizar el control de versiones con AWS::Serverless::Function, se puede definir una propiedad AutoPublishAlias y establecerla como un nombre de su elección. Esta propiedad creará una nueva versión de la función Lambda cada vez que se implemente una pila de CloudFormation y la publicará en el alias especificado. Luego se puede utilizar ese alias para invocar la función Lambda.

    Tenga en cuenta que al definir la propiedad CodeUri para AWS::Serverless::Function, es necesario utilizar la sintaxis abreviada de YAML como se muestra en la plantilla proporcionada. Esta sintaxis define un subobjeto con propiedades Bucket y Key por separado. Esto es diferente de la sintaxis JSON, que requiere que la propiedad CodeUri sea una cadena con la URL del objeto de S3.

Comments are closed.