PHP on Lambda

with Custom Runtimes

Ian Littman / @iansltx

NomadPHP US February 2020

Follow along at https://ian.im/lambno0220

What we'll cover

  • How Lambda works with Custom Runtimes (including PHP)
  • How to build an email reply bot with Lambda, SES, S3, and PHP
  • How to build a Lambda-powered API via API Gateway
  • ...including live demos using the AWS console 🤞

What We won't cover

  • Laravel Vapor
  • A deep dive into Bref
  • Building Lambda applications at the command line

WHY LAMBDA?

Shared-nothing-ish?

Wait, I thought Lambda Didn't Do PHP...

  • Custom runtime support has been available since 2018
  • Build the file system needed to run your function code
  • Store the file system as one or more (up to 5) Layers
    • Extracted to /opt (function code is in /var/task)
    • Versioned
    • Can include library dependencies (e.g. /vendor)
    • Zipped + submitted to AWS API (like functions)
  • Worker/polling model, NOT HTTP request based

Custom runtime lifecycle

  • Bootstrap (cold start)
  • Task execution (warm start)
  • Lambda decides when to kill the instance
    • Inactivity timeout
    • Task deadline (configurable, up to 15 minutes)
  • Initialize runtime
  • Prep function for execution
  • Pass env vars including file/method for handler function
  • If there's an error init-ing, make an API call

Task execution (warm start) Phase

  • Call APIs to process work
  • Next invocation (GET)
    • Request ID and more in headers
    • Task data in response body, JSON-encoded
  • Invocation response (POST)
    • Request ID in URL
    • Response in body
    • Consuming services may require specific format
  • Invocation error (POST)

Virtual Private Caveats

  • No internet connectivity by default
  • NAT Gateway is $$$ (4.5¢/hr + 4.5¢/GB)
  • Workaround: split functionality between functions:
    one that needs 'net connectivity, one that needs
    resources inside the VPC
  • Cold start times are no longer an issue as of late 2019
  1. SES rule pushes email to S3
  2. S3 triggers Lambda
  3. Lambda function executes...
    1. Grabs email from S3
    2. Parses using MIME parser
    3. RaNdOMlY CaPiTaLiZeS LEtTerS
    4. Sends email reply via SES
  1. HTTP request hits API Gateway
  2. Lambda function executes...
    1. Grabs query string parameter if there is one
    2. RaNdOMlY CaPiTaLiZeS LEtTerS
    3. Sends a JSON response
  3. API Gateway turns the Lambda payload into an HTTP response

...but you should probably use Bref in prod

Remember returntrue.win?

...or Vapor for Laravel-ites

Further Reading

Thanks! Questions?