aws-lambda
Framework bez serwera
Szukaj…
Wprowadzenie
Struktura aplikacji typu open source do łatwego budowania architektur bez serwerów na AWS Lambda i innych. W tej sekcji opisano sposób konfigurowania bezserwerowego środowiska programowania aplikacji z odpowiednimi przykładami.
Uwagi
„Serverless” to framework: https://serverless.com/
Bez serwera
Instaluj globalnie bez serwera
npm install serverless -g
Utwórz funkcję AWS Lamdba w Node.js
serverless create --template aws-nodejs
Przykład 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
Wdróż na żywo konto AWS
serverless deploy
Utwórz prostą operację CRUD
Utwórz prostą operację CRUD przy użyciu Framework Serverless
Zainstaluj Framework Serverless globalnie
npm install serverless -g
Utwórz prostą usługę Lambda
serverless create --template aws-nodejs --path myService
Przejdź do katalogu myService, który powinien zawierać
- serverless.yml
- handler.js
- event.json
Wszystkimi konfiguracjami usług bezserwerowych zarządza serwerless.yml
Zmień jego zawartość, aby zdefiniować usługę CRUD.
Przykładowy plik 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'
Ten plik definiuje
- Język programowania funkcji lambda
- Polityka wykonywania funkcji lambda
- Tworzenie tabeli Dynamodb i jej zasady
- Punkt końcowy HTTP (punkt końcowy bramy API)
Następnie musisz zdefiniować funkcję lambda (np. Node.js) w pliku handler.js, którą możesz zdefiniować.
'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);
});
};
Następnie musisz utworzyć nowe pliki w celu zdefiniowania funkcji CRUD
Utwórz te pliki
- todos-create.js
- todos-read-all.js
- todos-read-one.js
- todos-update.js
- todos-delete.js
Następnie zdefiniuj te funkcje w każdym pliku.
dla 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);
});
};
Dla 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);
});
};
Dla 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);
});
};
Dla 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);
});
};
Aby uruchomić te aplikacje, musisz zainstalować zależności npm
-
npm init
inicjalizacja npm -
npm install aws-sdk --save
install aws-sdk -
npm install uuid --save
Rozlokowanie
Teraz możesz wdrożyć te projekty
cd myService
sprawdź, czy jesteś w katalogu projektu, a następnie możesz wdrożyć swój kod
serverless deploy
Użyj punktu końcowego
Po pomyślnym wdrożeniu wyświetlasz w konsoli nazwy bramek interfejsu API.
Przetestuj Utwórz punkt końcowy
curl -X POST https://XXXX.execute-api.region.amazonaws.com/dev/todos --data '{ "body" : "Learn Serverless" }'
Test na odczyt punktu końcowego (przeczytaj wszystko)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos
Test na odczyt punktu końcowego (odczyt jeden)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id>
Testuj punkt końcowy aktualizacji
curl -X PUT https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id> --data '{ "body" : "Understand Serverless" }'
Test na usunięcie punktu końcowego
`curl -X DELETE https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id`>