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 .
Reference: