> For the complete documentation index, see [llms.txt](https://ysfang82.gitbook.io/development-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ysfang82.gitbook.io/development-notes/aws-notes/service/compute-and-load-balancing/lambda.md).

# Lambda

**Introduction**

* A serverless compute service to run your code

**Feature**

* Support language: C#, Java, Node, Python, Javascript, etc.
* Lamda is charged with request times, duration, used memory.
* Limits:
  * RAM: 128 \~ 3G
    * RAM is linked to CPU allocation (cannot be set accrodingly)&#x20;
    * 2 vCPU are allocated after 1.5G of RAM
  * Timeout: 15 minutes (Can break into sub executions but be careful with the latency.)
  * `/tmp` storage: 512 MB (can't process big files)
  * Councurrency execution: 1000 (differs by region, can be requested to increase).
  * If your code is too large to upload and can not break the code down
    * Consider deploying with Elastic BeanStalk.
* Security
  * IAM Roles policy: for Lambda execution.
  * Resource-based policy: allow other accounts, services to invoke / manage the Lambda.
  * Networking
    * Sits in the AWS VPC (by default)
      * Can access publicly
      * Cannot link to resources in a private Subnet.
    * Can create within your VPC
      * To access a resource in a private Subnet, the Lambda must be created within the private Subnet and do:
        * Assign Security Group with outbound rule to the Lambda
        * Use a NAT if needs to have a public access.
        * Can attach VPC Endpoint to asscess S3 / DynamoDB without requiring an IGW to save cost.
      * Reasons of `EC2ThrottledException`:
        * ​Does not have sufficient subnet IPs / subnet ENIs.
* Logging, monitoring and tracing
  * CloudWatch: trace logs, metrics. (Make sure the Lambda has execution role with CloudWatch privilege).
  * X-Ray:&#x20;
    * Can help debug / trace the end-to-end latency.
    * Enable in Lambda configuration (runs the X-Ray daemon for you)
    * Use AWS SDK in Code
    * Ensure Lambda has correct IAM execution role.
* Invocation
  * Synchronous: by CLI, SDK, API Gateway
    * Clients waiting for the response.
    * Handling exception by client side.
  * Asynchronous: like S3, SNS, CloudWatch events
    * When error, Lambda woud attempt for 3 retries. (so make sure the process is idempotent).
    * Can define a destination or DLQ (dead-letter queue, supports SNS, SQS, Lambda for failed processing).
  * [Event Source Mapping](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html) (Poll model, by another Lambda to trigger your Lambda)
    * In-ordered services: Kinesis data streams, SQS FIFO, DynamoDB streams and SQS (not guarenteed in-ordered) are supported.
    * Lambda Event Source Mapping would do poll from the source and send to Lambda function in a batch way.&#x20;
    * If Lambda returns an error, the entire batch is reprocessed until success.
      * Kinesis, DynamoDB streams: would stop processing later shards.
      * SQS FIFO: stop, unless a SQS DLQ has been defined.
* Destinations (AWS suggests to replace DLQ)
  * Can configure to send result to a destination.
  * Asynchronous: can define destinations for successful and failed events to:
    * SQS
    * SNS
    * Lambda
    * EventBridge Bus
  * Event Source Mapping: for discarded event batches (only for failures).
    * SQS
    * SNS
* Versions
  * When you work on a Lambda function, we work on `$LATEST`. When publish a Lambda, a version is created.
  * Versions&#x20;
    * are immutable.
    * have increasing version numbers.
    * get their own ARN.
    * include their code and configurarion.
    * can be accessed.
  * Aliases are pointers to Lambda versions.
    * Aliases are mutable and have ARNs.
    * Aliases enable stable configuration of event triggers / destinations.
    * Deployment to shift alias can be supported with CodeDeploy strategies:
      * Linear: grow traffic every N minutes until 100%.
      * Canary: try X percent then 100%.
      * AllAtOnce: immediate.
    * Can create pre & post traffic hooks to check the health of Lambda.
    * Scenarios:
      * can define a dev, test etc to point to a Lambda version.
      * can enable blue / green deployment by assigning weights to point to different Lambda versions.
