Aws Lambda for Java Architects CJug-Chicago 2016-08-30
- 1. AWS Lambda for Java Architects
Given by Derek C. Ashmore
August 30, 2016
©2016 Derek C. Ashmore, All Rights Reserved 1
- 2. Who am I?
• Professional Geek
since 1987
• Java/J2EE/Java EE
since 1999
• Roles include:
• Developer
• Architect
• Project Manager
• DBA
• System Admin
©2016 Derek C. Ashmore, All Rights Reserved 2
- 3. Discussion Resources
• This slide deck
– http://www.slideshare.net/derekashmore
• Sample code on my Github
– https://github.com/Derek-Ashmore/
• Sample Java AWS Lambda Source
– https://github.com/Derek-Ashmore/AWSLambdaExamples
• Slide deck has hyper-links!
– Don’t bother writing down URLs
©2016 Derek C. Ashmore, All Rights Reserved 3
- 4. Agenda
The “What”
and “Why” of
AWS Lambda
Developing
Lambda
Supporting
Lambda
Lambda and
Microservices
Summary /
Q&A
©2016 Derek C. Ashmore, All Rights Reserved 4
- 5. What are AWS Lambdas?
• You provide custom code -> AWS runs it
– Java, Node.js, Python
• Computing power with less management
– AWS manages the hardware
– AWS autoscales that hardware
– AWS maintains that hardware
• Lambdas are event driven
– API Gateway (e.g. RESTful Web Service call)
– Many more
• Lambdas are stateless
• Not to be confused with “Lambda Expressions” in Java 8
©2016 Derek C. Ashmore, All Rights Reserved 5
- 6. Lambda Event Sources
• API Gateway
• SNS Messaging
Subscriptions
• Schedule
• Storage writes
– S3, DynamoDB, Kenesis
©2016 Derek C. Ashmore, All Rights Reserved 6
• SES Email receipt
• Cloudwatch
– Schedule, Events, log entries
• Cognito (Security)
• CloudFormation
– Creation script
- 7. What’s the Business Benefit
• Less Maintenance Hassle
• Unlimited Parallelism
• Current cost advantage
– Don’t pay for idle
– CPU cost currently lower
• Free tier
– 1 M executions and 400K compute seconds per month
– Memory allocated determines allowed free-tier runtime
• 20 cents per 1 M executions + memory/runtime cost
– Administration cost
• No O/S upgrades, server backups, etc.
©2016 Derek C. Ashmore, All Rights Reserved 7
- 8. There’s no free lunch
• Less control over environment
– Harder to tune
– Memory and time limits on execution
• No Java EE amenities
– No connection pooling, session support, caching
• Proprietary Interface
– Potential Technical Lock-in
• No Guarantee that AWS cost will be constant
– Potential Business Risk
• Modern version of CGI
©2016 Derek C. Ashmore, All Rights Reserved 8
- 9. Agenda
The “What”
and “Why” of
AWS Lambda
Developing
Lambda
Supporting
Lambda
Lambda and
Microservices
Summary /
Q&A
©2016 Derek C. Ashmore, All Rights Reserved 9
- 10. Lambda Java API
• RequestHandler interface
• JSON marshalling of Request and Response
• Execution Context
• Deployment Zip Artifact
– Typically one RequestHandler per Zip artifact
©2016 Derek C. Ashmore, All Rights Reserved 10
- 11. Lambda Request / Response Sample
• Expose REST API that collects email addresses
for a mailing list
– https://scrubbed/prod/EmailCollector
• Sample request/response
©2016 Derek C. Ashmore, All Rights Reserved 11
- 12. Implementing a RequestHandler
• RequestHandler interface is generic.
– POJOs represent the request and response
– POJOs determine JSON request/response format
– Execution Context class provided by AWS
• This class specified when Lambda defined
• Note the wrapping try/catch
– Portion of the Context provided by AWS -> need more
– AWS Does marshalling
– ContextedRuntimeException from Apache Commons Lang3
• Note that the Lambda is thin -> Business logic is elsewhere
• Sample is on GitHub (here)
©2016 Derek C. Ashmore, All Rights Reserved 12
- 13. Implementing a RequestHandler
• RequestHandler interface is generic.
– POJOs represent the request and response
– POJOs determine JSON request/response format
– Execution Context class provided by AWS
• This class specified when Lambda defined
• Note the wrapping try/catch
– Portion of the Context provided by AWS -> need more
– AWS Does marshalling
– ContextedRuntimeException from Apache Commons Lang3
• Note that the Lambda is thin -> Business logic is elsewhere
• Sample is on GitHub (here)
©2016 Derek C. Ashmore, All Rights Reserved 13
- 14. Implementing a RequestHandler
• RequestHandler interface is generic.
– POJOs represent the request and response
– POJOs determine JSON request/response format
– Execution Context class provided by AWS
• This class specified when Lambda defined
• Note the wrapping try/catch
– Portion of the Context provided by AWS -> need more
– AWS Does marshalling
– ContextedRuntimeException from Apache Commons Lang3
• Note that the Lambda is thin -> Business logic is elsewhere
• Sample is on GitHub (here)
©2016 Derek C. Ashmore, All Rights Reserved 14
- 15. What’s in the Context?
• Execution Context provided by AWS
• Contains:
– AWS Request ID -> Get logs for specific request
– Function name, version, arn
– Cognito identity
– Remaining time/memory
– Mobile client information (AWS Mobile SDK)
• Environment name/value map
• Custom name/value map
©2016 Derek C. Ashmore, All Rights Reserved 15
- 16. Resource Support
• Java 8 Runtime ->
– you can configure memory available
• Log4J logging available
– Viewable/searchable in Cloudwatch logs
– Custom Log4J Appender provided
• Third party jars can be included
– Including AWS SDK for AWS Tasks (executing other Lambdas)
– JDBC Drivers
– HttpClient or Apache CXF
• Keep in Mind
– You create/destroy all database connections
• No connection pooling (Lambdas are stateless)
– Caching APIs have limited benefit (Lambdas are stateless)
– No Remote Debug capability
©2016 Derek C. Ashmore, All Rights Reserved 16
- 17. Lambda Deployment Package
• Zip Organization
– Root is in the classpath
– Lib contains 3rd party jars
• Maven example here
– Need maven-dependency-plugin, maven-antrun-plugin
©2016 Derek C. Ashmore, All Rights Reserved 17
- 18. API Gateway
• Exposes Lambdas as a RESTful Web Service
– Can be publicly available or part of a secured
private microservice library
©2016 Derek C. Ashmore, All Rights Reserved 18
- 19. Gateway Lambda Integration
©2016 Derek C. Ashmore, All Rights Reserved 19
• Integrations do basic transformations
– Map headers and parameters to Lambda request
fields
- 22. Gateway Models (con’t)
• Jackson can generate the Json schema needed as
a Model
– No Mavin plugin for this
– Example Java code to generate (here)
– Example Mavin pom generating on build (here)
©2016 Derek C. Ashmore, All Rights Reserved 22
- 23. Lambdas and SNS Topics
• Lambdas can subscribe to SNS Publish/subscribe
topics
• Request Message is type SNSEvent
©2016 Derek C. Ashmore, All Rights Reserved 23
- 24. Lambdas can be scheduled
• Lambda executions can be scheduled through
CloudWatch
– Cron expressions supported
©2016 Derek C. Ashmore, All Rights Reserved 24
- 25. Tooling Gotchas
• API Gateway requires client with Server Name
Indication (SNI) support
– Most recent SoapUI does not (reference)
– Had to write my own test client using Httpclient
4.2 or above
©2016 Derek C. Ashmore, All Rights Reserved 25
- 26. Agenda
The “What”
and “Why” of
AWS Lambda
Developing
Lambda
Supporting
Lambda
Lambda and
Microservices
Summary /
Q&A
©2016 Derek C. Ashmore, All Rights Reserved 26
- 27. Versioning Support
• Lambda versioning and aliases
– Aliases are labels (e.g. PROD, TEST, DEV) that can be
reassigned to different versions.
– Versions are unique an can’t be changed.
• S3 versioning possible for Lambda Zip artifacts
• You need a correlation between source control
and Lambda version
– Possibilities
• Tag all Lambda versions in source control and include the
Lambda version number
• Breadcrumbs in the deployed Zip that describe the specific
source control change number used for the build
©2016 Derek C. Ashmore, All Rights Reserved 27
- 28. Lifecycle Environment Support
• Configuration Support
– Baked into the deployment zip
• You can’t just move the zips from environment to
environment
• Spring profiles not an option as you don’t control JVM
parms
– API Gateway does have staging variables
• No Remote Debug Support
©2016 Derek C. Ashmore, All Rights Reserved 28
- 29. Automated Deployment Options
• Nothing out of the box
• One possibility
– Load Lambda function from S3 bucket
– Jenkins plugin to load build artifacts to S3
• https://wiki.jenkins-ci.org/display/JENKINS/S3+Plugin
– Use AWS CLI to Manage lambda publishing and
aliases
©2016 Derek C. Ashmore, All Rights Reserved 29
- 30. Performance
• Start-up Time – Python, Node.js, Java
– Berezovsky performance test
• Throughput – Java and Node.js
– Both have a JIT
– DZone comparison here
– Close enough that other factors would likely guide
your language choice
©2016 Derek C. Ashmore, All Rights Reserved 30
- 31. Agenda
The “What”
and “Why” of
AWS Lambda
Developing
Lambda
Supporting
Lambda
Lambda and
Microservices
Summary /
Q&A
©2016 Derek C. Ashmore, All Rights Reserved 31
- 33. Using Lambdas as Microservices
• Lambda / API Gateway is a deployment option for microservices
– No differences in design principles
• Single purpose
• Self-contained
– Still design for failure
• Don’t “assume” that Lambda outages can’t happen
– A Lambda might need external resources that aren’t available
• Off Limits: Coding patterns that use state
– Lambdas must be stateless
– Fail fast patterns
• Service Call Mediator
• Circuit Breaker
– Performance Patterns
• Expiring Cache (API Gateway allows request caching)
©2016 Derek C. Ashmore, All Rights Reserved 33
- 35. Retry Pattern
©2015 Derek C. Ashmore, All Rights Reserved 35
• Best for asynchronous tasks
• Limit the number of tries
• You must stay under your Lambda execution time limit!
• Use sleep interval between tries
• Only addresses temporary outages
• Sample Retry Pattern implementation here.
• Tooling Support:
– Apache CXF supports Retry
– Spring Batch RetryTemplate
– Apache HttpClient (Example here)
- 36. Dispatch via Messaging
©2015 Derek C. Ashmore, All Rights Reserved 36
• Place work instruction on persistent queue
• If receivers are down, work stacks in queue
• Work throttled by number of receivers
• Queue can be SES, JMS or AMQP
• Tooling Support:
– JMS Api (easy API – many use natively)
– Spring JMSTemplate or RabbitTemplate (producer)
- 38. Custom Rollback (continued)
• Reverses a transaction previously posted
• Only use this for multi-service transactions
– Keeping the transaction within one service is
preferred
• This pattern is completely custom
– No special product support available
• More information here
©2015 Derek C. Ashmore, All Rights Reserved 38
- 39. Contract Testing
• Critical for MS architectures
– Contract changes can break other services
– Bulkhead for rogue developers
– Makes individual services more disposable
• Consumer-based testing
• Tooling support
– Apache HttpClient (4.2 or above)
©2015 Derek C. Ashmore, All Rights Reserved 39
- 40. Agenda
The “What”
and “Why” of
AWS Lambda
Developing
Lambda
Supporting
Lambda
Lambda and
Microservices
Summary /
Q&A
©2016 Derek C. Ashmore, All Rights Reserved 40
- 41. Chief Complaints
• Documentation leaves a lot to be desired
– This is an understatement.
– For Java Lambdas, you are almost on your own.
• Lambda start-up time not consistent
– Sometimes long start-up time for JVM
– Python is the fastest
• Optimizations that depend on state aren’t as easy
– You would have to persist that state
• This would have it’s own concurrency and performance
issues
©2016 Derek C. Ashmore, All Rights Reserved 41
- 42. Implementation Tips
• Separation of Concerns
– Keep Lambda code separate from business logic
• Might want to change vendors someday
– Keep AWS SDK code separate from business logic
• Same reason
– Invoke other Lambdas through the API Gateway, not directly through the AWS
SDK
• Same reason
– Keep Business Logic locally runnable/debuggable
• Remote debug isn’t yet possible
• Ensure you can always tie AWS Request Id to your business transaction
– Need a way to gather logs from a complete business transactions and the
many services it might use
– All invocations get unique AWS request Ids
• For example, lambda invokes other lambdas
– Configure log4j layout to include AWS Request Id (example)
©2016 Derek C. Ashmore, All Rights Reserved 42
- 43. Lambda and the Gartner Hype Cycle
©2016 Derek C. Ashmore, All Rights Reserved 43
- 44. Further Reading
• This slide deck
– http://www.slideshare.net/derekashmore
• AWS Lambda Reading List
– http://www.derekashmore.com/2016/04/aws-lambda-reading-list.html
©2016 Derek C. Ashmore, All Rights Reserved 44
- 45. Questions?
• Derek Ashmore:
– Blog: www.derekashmore.com
– LinkedIn: www.linkedin.com/in/derekashmore
– Twitter: https://twitter.com/Derek_Ashmore
– GitHub: https://github.com/Derek-Ashmore
– Book: http://dvtpress.com/
©2016 Derek C. Ashmore, All Rights Reserved 45