Provisioned Concurrency for Lambda Functions

Aprovisiona funciones lambdas con políticas de escalado según la concurrencia en aws.

Uno de los problemas que te podrías encontrar a la hora de incursionar en en aplicaciones serverless mas enfocado en aws, es encontrar el lenguaje de programación idóneo que te de las mejores posibilidades y aprovechar la ventaja de utilizarlo solo cuando lo necesites, te podrías dar cuenta que los lenguajes como python y go son los mejores y que Java es uno de los mas demorados en levantar en frio.

Pero por alguna razón técnica o del negocio te solicitan que tus lambdas echas en java tengan menos cold start podrías utilizar un aprovisionamiento de dichas lambdas.

Requisitos para aprovisionar  

Debemos crear una alias y una versión del lambda, con la función tipo AWS::Serverless::Function utilizando la propiedad AutoPublishAlias

AWS SAM genera AWS::Lambda::Version y  AWS::Lambda::Alias recursos cuando se establece esta propiedad. Para obtener información sobre este escenario, consulte Se especifica la propiedad AutoPublishAlias.


.......
Resources:

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
      Runtime: java11
      MemorySize: 1024
      AutoPublishAlias: live
      Environment:
        Variables:
          ENVIRONMENT: test
      Events:
        HelloWorld:
          Type: HttpApi # Using the new HTTP API here
  .....

Luego creamos nuestra políticas de escalado de lambdas según nuestra concurrencia.

  .......
  MyScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 100
      MinCapacity: 1
      ResourceId: !Sub function:${MyFunction}:live # You need to specify an alis or version here
      RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
      ScalableDimension: lambda:function:ProvisionedConcurrency
      ServiceNamespace: lambda
    DependsOn: MyFunctionAliaslive # This is your function logical ID + "Alias" + what you use for AutoPublishAlias

  MyTargetTrackingScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: utilization
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref MyScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 0.70 # Any value between 0.1 and 0.9 can be used here
        PredefinedMetricSpecification:
          PredefinedMetricType: LambdaProvisionedConcurrencyUtilization
 .........

Y al final nos quedaría nuestro template de SAM de la siguiente manera con una lambda que se aprovisiona según la concurrencia.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  SAM Auto Scaling + Provisioned Concurrency
Globals:
  Function:
    Timeout: 30

Resources:

  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
      Runtime: java11
      MemorySize: 1024
      AutoPublishAlias: live
      Environment:
        Variables:
          ENVIRONMENT: test
      Events:
        HelloWorld:
          Type: HttpApi # Using the new HTTP API here

  MyScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 100
      MinCapacity: 1
      ResourceId: !Sub function:${MyFunction}:live # You need to specify an alis or version here
      RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
      ScalableDimension: lambda:function:ProvisionedConcurrency
      ServiceNamespace: lambda
    DependsOn: MyFunctionAliaslive # This is your function logical ID + "Alias" + what you use for AutoPublishAlias

  MyTargetTrackingScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: utilization
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref MyScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 0.70 # Any value between 0.1 and 0.9 can be used here
        PredefinedMetricSpecification:
          PredefinedMetricType: LambdaProvisionedConcurrencyUtilization

Este proceso de aprovisionar nuestras lambda nos mejora los tiempos de cold start y no se demora mas de un segundo en responder, la desventaja es que si aprovisiona una lambda vas a tener cobros fijos por cada lambda aprovisionada y se sale del modelo serverless de usar solo cuando lo necesitas pero es una solución que te podría solucionar ese requerimiento, y si tu presupuesto no se te ajusta mejor cambia de lenguaje de programación como a go o python que te dan mejores tiempos en el cold start y  en  general.

Nota: Recuerda que para utilizar la lambda que tienes aprovisionada debes configurar directamente con el arn del alias no de :LASTES

Happy code .

Auto aprovisionamiento y desa aprovisionamiento de lambdas aws
Auto aprovisionamiento y desa aprovisionamiento de lambdas automáticamente.

Reference:

New – Provisioned Concurrency for Lambda Functions | Amazon Web Services
It’s really true that time flies, especially when you don’t have to think about servers: AWS Lambda just turned 5 years old and the team is always looking for new ways to help customers build and run applications in an easier way. As more mission critical applications move to serverless, customers n…
AWS::Serverless::Function - AWS Serverless Application Model
Creates an AWS Lambda function, an AWS Identity and Access Management (IAM) execution role, and event source mappings that trigger the function.
AWS::ApplicationAutoScaling::ScalingPolicy - AWS CloudFormation
Use the AWS CloudFormation AWS::ApplicationAutoScaling::ScalingPolicy resource for ApplicationAutoScaling.
AWS::ApplicationAutoScaling::ScalingPolicy TargetTrackingScalingPolicyConfiguration - AWS CloudFormation
Use the AWS CloudFormation AWS::ApplicationAutoScaling::ScalingPolicy.TargetTrackingScalingPolicyConfiguration resource for ApplicationAutoScaling.