aws-lambda
Framework senza server
Ricerca…
introduzione
Il framework open source e applicativo per costruire facilmente architetture senza server su AWS Lambda e altro. Questa sezione include, come configurare il framework serverless per lo sviluppo di applicazioni con esempi rilevanti.
Osservazioni
"Serverless" è un framework: https://serverless.com/
serverless
Installa serverless a livello globale
npm install serverless -g
Creare una funzione AWS Lamdba in Node.js
serverless create --template aws-nodejs
Esempio di un handler.js
'use strict'; // Your first function handler module.exports.hello = (event, context, cb) => cb(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event } ); // You can add more handlers here, and reference them in serverless.yml
Distribuisci per vivere l'account AWS
serverless deploy
Crea semplice operazione CRUD
Crea semplice operazione CRUD utilizzando Serverless Framework
Installa il framework Serverless a livello globale
npm install serverless -g
Crea un semplice servizio Lambda
serverless create --template aws-nodejs --path myService
Vai alla directory myService che dovrebbe contenere
- serverless.yml
- handler.js
- event.json
Tutta la configurazione del servizio Serverless è gestita da serverless.yml
Cambia i suoi contenuti per definire il servizio CRUD.
Esempio di file serverless.yml
service: serverless-crud
provider:
name: aws
runtime: nodejs4.3
region: us-east-1
stage: dev
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:DescribeTable
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:us-east-1:*:*"
functions:
create:
handler: handler.create
events:
- http:
path: todos
method: post
cors: true
readAll:
handler: handler.readAll
events:
- http:
path: todos
method: get
cors: true
readOne:
handler: handler.readOne
events:
- http:
path: todos/{id}
method: get
cors: true
update:
handler: handler.update
events:
- http:
path: todos/{id}
method: put
cors: true
delete:
handler: handler.delete
events:
- http:
path: todos/{id}
method: delete
cors: true
resources:
Resources:
TodosDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: id
AttributeType: S
KeySchema:
-
AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: 'todos'
Questo file definisce
- Linguaggio di programmazione della funzione Lambda
- Politica di esecuzione della funzione Lambda
- Creazione della tabella Dynamodb e politica
- Punto finale HTTP (punto finale gateway API)
Quindi devi definire la funzione lambda (ex. Node.js) nel file handler.js puoi definirla.
'use strict';
const todosCreate = require('./todos-create.js');
const todosReadAll = require('./todos-read-all.js');
const todosReadOne = require('./todos-read-one.js');
const todosUpdate = require('./todos-update.js');
const todosDelete = require('./todos-delete.js');
module.exports.create = (event, context, callback) => {
todosCreate(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};
context.succeed(response);
});
};
module.exports.readAll = (event, context, callback) => {
todosReadAll(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};
context.succeed(response);
});
};
module.exports.readOne = (event, context, callback) => {
todosReadOne(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};
context.succeed(response);
});
};
module.exports.update = (event, context, callback) => {
todosUpdate(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};
context.succeed(response);
});
};
module.exports.delete = (event, context, callback) => {
todosDelete(event, (error, result) => {
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
},
body: JSON.stringify(result),
};
context.succeed(response);
});
};
Quindi devi creare nuovi file per definire le tue funzioni CRUD
Crea questi file
- Todos-create.js
- all.js todos-lettura
- one.js todos-lettura
- Todos-update.js
- Todos-delete.js
Quindi definire queste funzioni in ogni file.
per todos-create.js
'use strict';
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
const uuid = require('uuid');
module.exports = (event, callback) => {
const data = JSON.parse(event.body);
data.id = uuid.v1();
data.updatedAt = new Date().getTime();
const params = {
TableName: 'todos',
Item: data
};
return dynamoDb.put(params, (error, data) => {
if (error) {
callback(error);
}
callback(error, params.Item);
});
};
Per todos-read-all.js
'use strict';
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (event, callback) => {
const params = {
TableName: 'todos',
};
return dynamoDb.scan(params, (error, data) => {
if (error) {
callback(error);
}
callback(error, data.Items);
});
};
For todos-read-one.js <br>
'use strict';
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (event, callback) => {
const params = {
TableName: 'todos',
Key: {
id: event.pathParameters.id
}
};
return dynamoDb.get(params, (error, data) => {
if (error) {
callback(error);
}
callback(error, data.Item);
});
};
Per todos-update.js
'use strict';
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (event, callback) => {
const data = JSON.parse(event.body);
data.id = event.pathParameters.id;
data.updatedAt = new Date().getTime();
const params = {
TableName : 'todos',
Item: data
};
return dynamoDb.put(params, (error, data) => {
if (error) {
callback(error);
}
callback(error, params.Item);
});
};
Per todos-delete.js
'use strict';
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (event, callback) => {
const params = {
TableName : 'todos',
Key: {
id: event.pathParameters.id
}
};
return dynamoDb.delete(params, (error, data) => {
if (error) {
callback(error);
}
callback(error, params.Key);
});
};
Per l'esecuzione di queste applicazioni è necessario installare le dipendenze di npm
-
npm init
npm -
npm install aws-sdk --save
installa aws-sdk -
npm install uuid --save
Distribuzione
Ora puoi implementare questi progetti
cd myService
verifica di essere nella directory del progetto, quindi puoi implementare il tuo codice
serverless deploy
Usa punto finale
Se la distribuzione è stata eseguita correttamente, visualizzare i nomi pont di gateway gateway API nella console.
Prova Crea punto finale
curl -X POST https://XXXX.execute-api.region.amazonaws.com/dev/todos --data '{ "body" : "Learn Serverless" }'
Test per Read End Point (Leggi tutto)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos
Test per Read End Point (Leggi uno)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id>
Test per l'endpoint dell'aggiornamento
curl -X PUT https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id> --data '{ "body" : "Understand Serverless" }'
Prova per Elimina punto finale
`curl -X DELETE https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id`>