204 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| layout: pattern
 | ||
| title: Serverless
 | ||
| folder: serverless
 | ||
| permalink: /patterns/serverless/
 | ||
| categories: Architectural
 | ||
| tags:
 | ||
|  - Cloud distributed
 | ||
| ---
 | ||
| 
 | ||
| ## Serverless
 | ||
| 
 | ||
| Serverless eliminates the need to plan for infrastructure and let's you focus on your 
 | ||
| application. 
 | ||
| 
 | ||
| Following are optimization katas you should be aware of while building a serverless 
 | ||
| applications
 | ||
| 
 | ||
| * The Lean function
 | ||
|     * Concise logic - Use functions to transform, not transport (utilize some of the 
 | ||
|     integration available from the provider to transport), and make sure you read only
 | ||
|      what you need
 | ||
|     * Efficient/single purpose code - avoid conditional/routing logic and break down 
 | ||
|     into individual functions, avoid "fat"/monolithic functions and control the 
 | ||
|     dependencies in the function deployment package to reduce the load time for your 
 | ||
|     function
 | ||
|     * ephemeral environment - Utilize container start for expensive initializations
 | ||
| * Eventful Invocations
 | ||
|     * Succinct payloads - Scrutinize the event as much as possible, and watch for 
 | ||
|     payload constraints (async - 128K)
 | ||
|     * resilient routing - Understand retry policies and leverage dead letter queues 
 | ||
|     (SQS or SNS for replays) and remember retries count as invocations
 | ||
|     * concurrent execution - lambda thinks of it's scale in terms of concurrency and 
 | ||
|     its not request based/duration based. Lambda will spin up the number of instances 
 | ||
|     based on the request. 
 | ||
| * Coordinated calls
 | ||
|     * Decoupled via APIs - best practice to setup your application is to have API's as
 | ||
|      contracts that ensures separation of concerns
 | ||
|     * scale-matched downstream - make sure when Lambda is calling downstream 
 | ||
|     components, you are matching scale configuration to it (by specifying max 
 | ||
|     concurrency based on downstream services)
 | ||
|     * secured - Always ask a question, do I need a VPC?
 | ||
| * Serviceful operations
 | ||
|     * Automated - use automated tools to manage and maintain the stack 
 | ||
|     * monitored applications - use monitoring services to get holistic view of your 
 | ||
|     serverless applications
 | ||
| 
 | ||
| ## Intent
 | ||
| 
 | ||
| Whether to reduce your infrastructure costs, shrink the time you spend on ops tasks, 
 | ||
| simplify your deployment processes, reach infinite scalability, serverless cuts time 
 | ||
| to market in half.
 | ||
|  
 | ||
| ## Explanation
 | ||
| 
 | ||
| Serverless computing is a cloud computing execution model in which the cloud provider 
 | ||
| dynamically manages the allocation of machine resources. Pricing is based on the 
 | ||
| actual amount of resources consumed by an application, rather than on pre-purchased 
 | ||
| units of capacity. 
 | ||
| 
 | ||
| ## Class diagram
 | ||
| 
 | ||
| 
 | ||
| ## Serverless framework
 | ||
| 
 | ||
| [Serverless](https://serverless.com/) is a toolkit for deploying and operating serverless architectures. 
 | ||
| 
 | ||
| ## (Function as a Service or "FaaS")
 | ||
| 
 | ||
| The term ‘Serverless’ is confusing since with such applications there are both server 
 | ||
| hardware and server processes running somewhere, but the difference to normal 
 | ||
| approaches is that the organization building and supporting a ‘Serverless’ application
 | ||
|  is not looking after the hardware or the processes - they are outsourcing this to a vendor.
 | ||
| 
 | ||
| Some of the Serverless Cloud Providers are 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| ...
 | ||
| 
 | ||
| Anything that triggers an Lambda Function to execute is regarded by the Framework as 
 | ||
| an Event. Most of the Serverless Cloud Providers support following Events
 | ||
| - Http
 | ||
| - PubSub Events
 | ||
| - scheduled
 | ||
| 
 | ||
| AWS supports processing event generated from AWS Services (S3/Cloudwatch/etc) and 
 | ||
| using aws as a compute engine is our first choice.
 | ||
| 
 | ||
| ## (Backend as a Service or "BaaS")
 | ||
| This example creates a backend for ‘persons’ collection which uses DynamoDB NoSQL 
 | ||
| database service also provided by Amazon. 
 | ||
| 
 | ||
| ## AWS lambda function implementation
 | ||
| 
 | ||
| [AWS Lambda SDK](https://aws.amazon.com/sdk-for-java/) provides pre-defined interface 
 | ||
| `com.amazonaws.services.lambda.runtime
 | ||
| .RequestHandler` to implement our lambda function. 
 | ||
| 
 | ||
| ```java
 | ||
| public class LambdaInfoApiHandler implements RequestHandler<Map<String, Object>, ApiGatewayResponse> {
 | ||
| 
 | ||
|   private static final Logger LOG = Logger.getLogger(LambdaInfoApiHandler.class);
 | ||
|   private static final Integer SUCCESS_STATUS_CODE = 200;
 | ||
| 
 | ||
| 
 | ||
|   @Override
 | ||
|   public ApiGatewayResponse handleRequest(Map<String, Object> input, Context context) {
 | ||
|     
 | ||
|   }
 | ||
| }
 | ||
| ```
 | ||
| handleRequest method is where the function code is implemented. Context provides 
 | ||
| useful information about Lambda execution environment. AWS Lambda function needs a 
 | ||
| deployment package. This package is either a .zip or .jar file that contains all the 
 | ||
| dependencies of the function.
 | ||
| 
 | ||
| `serverless.yml` contains configuration to manage deployments for your functions.
 | ||
| 
 | ||
| ## Run example in local
 | ||
| 
 | ||
| # Pre-requisites
 | ||
| 
 | ||
| * Node.js v6.5.0 or later.
 | ||
| * Serverless CLI v1.9.0 or later. You can run npm install -g serverless to install it.
 | ||
| * An AWS account. If you don't already have one, you can sign up for a free trial that includes 1 million free Lambda requests per month.
 | ||
| * [Set-up](https://serverless.com/framework/docs/providers/aws/guide/credentials/) your Provider Credentials. Watch the video on setting up credentials
 | ||
| 
 | ||
| # build and deploy
 | ||
| 
 | ||
| * `cd serverless`
 | ||
| * `mvn clean package`
 | ||
| * `serverless deploy --stage=dev --verbose`
 | ||
| 
 | ||
| Based on the configuration in `serverless.yml` serverless framework creates following 
 | ||
| resources
 | ||
| 
 | ||
| * CloudFormation stack for S3 (ServerlessDeploymentBucket)
 | ||
| * IAM Role (IamRoleLambdaExecution)
 | ||
| * CloudWatch (log groups)
 | ||
| * API Gateway (ApiGatewayRestApi) 
 | ||
| * Lambda function
 | ||
| * DynamoDB collection
 | ||
| 
 | ||
| The command will print out Stack Outputs which looks something like this
 | ||
| 
 | ||
| ```yaml
 | ||
| endpoints:
 | ||
|   GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info
 | ||
|   POST - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person
 | ||
|   GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id}
 | ||
|   
 | ||
| ```
 | ||
| 
 | ||
| ```yaml
 | ||
| CurrentTimeLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:xxxxxxxxxxx:function:lambda-info-http-endpoint-dev-currentTime:4
 | ||
| ServiceEndpoint: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev
 | ||
| ServerlessDeploymentBucketName: lambda-info-http-endpoin-serverlessdeploymentbuck-2u8uz2i7cap2
 | ||
| ```
 | ||
| access the endpoint to invoke the function.
 | ||
| 
 | ||
| Use the following cURL commands to test the endpoints
 | ||
| 
 | ||
| ```cURL
 | ||
| curl -X GET \
 | ||
|   https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info \
 | ||
|   -H 'cache-control: no-cache'
 | ||
| ```
 | ||
| 
 | ||
| ```cURL
 | ||
| curl -X POST \
 | ||
|   https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person \
 | ||
|   -H 'cache-control: no-cache' \
 | ||
|   -H 'content-type: application/json' \
 | ||
|   -d '{
 | ||
| 	"firstName": "Thor",
 | ||
| 	"lastName": "Odinson",
 | ||
| 	"address": {
 | ||
| 		"addressLineOne": "1 Odin ln",
 | ||
| 		"addressLineTwo": "100",
 | ||
| 		"city": "Asgard",
 | ||
| 		"state": "country of the Gods",
 | ||
| 		"zipCode": "00001"
 | ||
| 	}
 | ||
| }'
 | ||
| ```
 | ||
| 
 | ||
| ```cURL
 | ||
| curl -X GET \
 | ||
|   https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id} \
 | ||
|   -H 'cache-control: no-cache'
 | ||
| ```
 | ||
| 
 | ||
| ## Credits
 | ||
| 
 | ||
| * [serverless docs](https://serverless.com/framework/docs/)
 | ||
| * [Serverless Architectures](https://martinfowler.com/articles/serverless.html)
 | ||
| * [Serverless Black Belt](https://youtu.be/oQFORsso2go)
 |