KEMBAR78
AWS Lambda with ClaudiaJS | PDF
Serverless With
Lambda, NodeJS and ClaudiaJS
AWSome Meetup on 31st of October
Hi, I’m Riza
Serverless
ā€œA new cloud compu!ng trend
that changes the way you think
about wri!ng and maintaining
applica!ons.ā€
Tomasz Janczuk
Chief Architect for Webtasks at Auth0
ā€œThe essence of
the serverless trend is the
absence of the server
concept during so"ware
development.ā€
Tomasz Janczuk
Chief Architect for Webtasks at Auth0
Faas
Amazon Lambda
Google Func!ons
Azure Func!ons
GOTO; Conf 2017
"For 400.000 ac!ve user we have paid $0.53 for
Lambda. Now, beat that with your hos!ng cost!"
Gojko Adzic from MindMup
Designing for the Serverless Age
h!ps://www.youtube.com/watch?v=w7X4gAQTk2E
I’m sold!
Really?
ButILove’em
Especially this
Don’t you worry
*Fully-managed your serverless architecture
*Required to use CloudForma"on
*Build-in support for CI/CD workflows
* Golang-based framework
* Deployment op"mized
* Concurrent for quick deploy
* Deployment u"lity, not a framework
* Extensions for new features
* unit-test Lambda func"ons
ā€œServerless is like ice cream.
It’s nice to talk about it, but
much be"er to try out.ā€
The Casts
A Serverless Host
Deployment Library
Services
Database
The Architecture
First Act...

Ac!on!!
$ vim ~/.aws/credentials
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_ACCESS_SECRET
Second Act...

Install Claudia
$ npm install -g claudia
Third Act...

Write our service
$ mkdir claudia-icecream-shop
$ cd claudia-icecream-shop
$ npm init
$ npm install aws-sdk claudia-api-builder
$ vim index.js
Third Act...

Write our service
const ApiBuilder = require('claudia-api-builder')
const AWS = require('aws-sdk')
const api = new ApiBuilder()
const dynamoDb = new
AWS.DynamoDB.DocumentClient()
const TABLENAME = 'icecreams'
Third Act...

Write our service
api.post('/icecreams',
request 
=> {
const params = {
TableName: TABLENAME,
Item: {
icecreamid: request.body.id,
name: request.body.name
}
}
return dynamoDb.put(params).promise()
},
{ success: 201 }
)
Third Act...

Write our service
api.get('/icecreams', request 
=> {
return dynamoDb
.scan({ TableName: TABLENAME })
.promise()
.then(response 
=> response.Items)
})
module.exports = api
Fourth Act...

Setup DynamoDB
$ mkdir policy
$ vim policy/dynamodb-policy.json
Fourth Act...

Setup DynamoDB
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Scan"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Fourth Act...

Setup DynamoDB
Fourth Act...

Setup DynamoDB
$ aws dynamodb create-table 
--table-name
icecreams 
--attribute-definition 
AttributeName=icecreamid,AttributeType=S 

--key-schema 
AttributeName=icecreamid,KeyType=HASH 

--provisioned-throughput 
ReadCapacityUnits=1,WriteCapacityUnits=1 

--region ap-southeast-1 

--query TableDescription.TableArn 
--output
text
Fi"h Act...

Time for deploy
$ claudia create 
--region ap-southeast-1 

--api-module index 
--policies policy
Fi"h Act...

Time for deploy
{
"lambda": {
"role": "ice-cream-shop-executor",
"name": "ice-cream-shop",
"region": "us-east-1"
},
"api": {
"id": "your-service-id",
"module": "index",
"url": ā€œhttps:
//xxx.execute-api.ap-
southeast-1.amazonaws.com/latest"
}
}
$ curl -H "Content-Type: application/json"
-X POST -d
ā€˜{ā€œicecreamIdā€:ā€123","name":"chocolate"}' 
https:
//xxx.execute-api.ap-
southeast-1.amazonaws.com/latest/icecreams
Sixth Act...

Trying it out
Sixth Act...

Trying it out
$ curl https:
//xxx.execute-api.ap-
southeast-1.amazonaws.com/latest/icecreams
[{ā€œicecreamIdā€: 123, ā€œnameā€: ā€œchocolateā€}]
Seventh Act...

Some updates
$ claudia update
That’s Pretty much it!
Now go, you deserve some ice
cream!
h!ps://github.com/rizafahmi/claudia-ice-cream

AWS Lambda with ClaudiaJS