Serverless Architecture Patterns
And Best Practices
Arun Gupta Adrian Hornsby
Principal Technologist Cloud Architecture Evangelist
argu@amazon.com adhorn@amazon.com
@arungupta @adhorn
arun-gupta adhorn
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Agenda
1. Serverless Key Concepts
2. Lambda Basics
3. Lambda Best Practices
4. Serverless Application Model
5. CI/CD using CodeStar
6. Monitoring
7. Event Processing
8. Real-time Streaming
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Serverless Key Concepts
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Serverless means…
No servers to provision Scales with usage
or manage
Never pay for idle Availability and fault tolerance
built in
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Spectrum of AWS offerings
“On EC2” Managed Serverless
AWS Amazon Amazon
Amazon Amazon ES
Amazon EC2 Lambda Cognito Kinesis
EMR
Amazon Amazon Amazon
Amazon Amazon S3 DynamoDB SQS
ElastiCache Redshift
Microsoft SQL Amazon
Server RDS Amazon API Amazon AWS IoT
Gateway CloudWatch
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Basics
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Using AWS Lambda
Bring your own code Simple resource model
• Node.js, Java, Python, C#, • Select power rating from
Go 128 MB to 3 GB
• Bring your own libraries • CPU and network
(even native ones) allocated proportionately
Flexible use Flexible authorization
• Synchronous or • Securely grant access to
asynchronous resources and VPCs
• Integrated with other • Fine-grained control for
AWS services invoking your functions
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda execution model
Synchronous (push) Asynchronous (event) Stream-based
Amazon Amazon Amazon
API Gateway SNS DynamoDB
Amazon Amazon
S3 Kinesis
/api/hello
reqs changes
AWS Lambda
service
AWS Lambda AWS Lambda
function function function
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Anatomy of a Lambda function
Handler() function Event object Context object
Function to be executed Data sent during Lambda Methods available to
upon invocation Function Invocation interact with runtime
information (request ID,
log group, etc.)
public String handleRequest(Book book, Context context) {
saveBook(book);
return book.getName() + " saved!";
}
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Separate the Lambda handler from core logic
public class BookPostHandler implements RequestHandler<Book, String> {
static DynamoDBMapper mapper = DDBUtil.getMapper();
public String handleRequest(Book book, Context context) {
System.out.println("Adding book: " + book);
saveBook(book);
return book.getName() + " saved!";
}
private void saveBook(Book book) {
mapper.save(book);
}
}
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Minimize package size to necessities
<dependencies>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-dynamodb -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-dynamodb</artifactId>
<version>1.11.127</version>
</dependency>
</dependencies>
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Use Environment Variables to modify operational behavior
String region = System.getenv("AWS_REGION");
. . .
String bucket = System.getenv(“S3_BUCKET”);
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Self-contain dependencies in your function package
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Leverage “Max Memory Used” to right-size your functions
• Calculate 1000x all prime numbers < 1m
Memory Compute time Cost
128 MB 11.722965 secs $0.024628
256 MB 6.678945 secs $0.028035
512 MB 3.194954 secs $0.026830
1024 MB 1.465984sec $0.024638
https://github.com/jconning/lambda-cpu-cost
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Lambda Best Practices
• Delete large unused functions (75GB limit per region)
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Meet
SAM!
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Serverless Application Model
CloudFormation extension optimized for serverless
New serverless resource types: functions, APIs, and tables
Supports anything CloudFormation supports
Open specification (Apache 2.0)
https://github.com/awslabs/serverless-application-model
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SAM Template
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple CRUD webservice.
Resources:
GetFunction:
Type: AWS::Serverless::Function
Properties:
Handler: org.sample.aws.samlocal.BookGetHandler
Runtime: java8
CodeUri: ./target/sam-local-java-1.0-SNAPSHOT.jar
Policies: AmazonDynamoDBReadOnlyAccess
Timeout: 30
Environment:
Variables:
TABLE_NAME: !Ref Table
Events:
}
GetResource:
Type: Api
Properties:
Path: /books
Method: get
Table:
Type: AWS::Serverless::SimpleTable
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SAM Commands
Package
Creates a deployment package (.zip file)
Uploads deployment package to an S3 bucket
Adds a CodeUri property with S3 URI
Deploy
Creates CloudFormation resources
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
SAM Local
• CLI for local testing of Serverless apps
• Works with Lambda functions and
“proxy style” APIs
• Response object and function logs
available on your local machine
• Currently supports Java, Node.js and
Python
• Accepting PRs
https://github.com/awslabs/aws-sam-local
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
CI/CD using AWS CodeStar, AWS
CodeBuild and AWS CodePipeline
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Monitoring
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS X-Ray Integration with Serverless
• Lambda instruments incoming requests for all
supported languages
• Lambda runs the X-Ray daemon on all languages
with an SDK
var AWSXRay = require(‘aws-xray-sdk-core‘);
AWSXRay.middleware.setSamplingRules(‘sampling-rules.json’);
var AWS = AWSXRay.captureAWS(require(‘aws-sdk’));
S3Client = AWS.S3();
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
X-Ray Trace Example
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Event Processing
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Event driven
Event A on B triggers C A B C
Invocation Action
Lambda functions
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Event-driven platform
Invoked in response to events Access any service,
- Changes in data including your own
- Changes in state
Any custom
S3 event DynamoDB Kinesis
notifications Streams events
Such as…
SNS DynamoDB Lambda
SNS CloudTrail Cognito
events
Lambda functions
events events
Redshift Kinesis S3
Custom CloudWatch
events events
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Event-driven actions
S3: Lambda: S3:
Source Bucket Resize Images Destination Bucket
Triggered on
PUTs
Users upload photos
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
AWS Step Functions:
Orchestrate a Serverless processing
workflow using AWS Lambda
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Real-time Streaming
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
https://aws.amazon.com/solutions/case-studies/supercell/
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Amazon Kinesis makes it easy to work with real-time
streaming data
Amazon Kinesis Amazon Kinesis Amazon Kinesis
Streams Analytics Firehose
• For Technical Developers • For all developers, data • For all developers, data
• Collect and stream data scientists scientists
for ordered, replay-able, • Easily analyze data • Easily load massive
real-time processing streams using standard volumes of streaming data
SQL queries into Amazon S3, Redshift,
ElasticSearch
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Amazon Kinesis
Write: 1MB Shard 1 Read: 2MB
Shard 2
Shard 3
…
…
Shard n
Producers Consumers
** A shard is a group of data records in a stream
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Processing a Kinesis Streams with AWS Lambda
Kinesis Stream
Shard 1 Shard 2 Shard 3 Shard 4 ... Shard n
Gets Records
1x per sec
10k records
...
• Single instance of Lambda function per shard
• Polls shard once per second
• Lambda function instances created and removed automatically as stream is scaled
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Kinesis Analytics
Use SQL to build real-time applications
Connect to streaming source
Easily write SQL code to process streaming data
Continuously deliver SQL results
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Real-time Analytics Demo
http://quad.adhorn.me
Real-time analytics
Amazon
Cognito
Amazon Amazon Amazon Amazon Amazon
Kinesis Kinesis Kinesis Lambda DynamoDB
JavaScript SDK Stream Analytics Stream
Amazon S3
Further Reading
Serverless Architectures with AWS Lambda
https://d1.awsstatic.com/whitepapers/serverless-architectures-with-aws-lambda.pdf
Optimizing Enterprise Economics with Serverless Architectures
https://d0.awsstatic.com/whitepapers/optimizing-enterprise-economics-serverless-architectures.pdf
Serverless Applications Lens - AWS Well-Architected Framework
https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf
Streaming Data Solutions on AWS with Amazon Kinesis
https://d1.awsstatic.com/whitepapers/whitepaper-streaming-data-solutions-on-aws-with-amazon-kinesis.pdf
AWS Serverless Multi-Tier Architectures
https://d1.awsstatic.com/whitepapers/AWS_Serverless_Multi-Tier_Archiectures.pdf
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
More info:
https://aws.amazon.com/serverless/
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
Thank you!
© 2017, Amazon Web Services, Inc. or its Affiliates. All rights reserved.