aws-lambda
Сервер без сервера
Поиск…
Вступление
С открытым исходным кодом, инфраструктура приложений, позволяющая легко создавать серверные архитектуры на AWS Lambda и многое другое. В этом разделе рассказывается, как настроить безсерверную инфраструктуру для разработки приложений с соответствующими примерами.
замечания
«Без сервера» - это структура: https://serverless.com/
Serverless
Установите серверный сервер в глобальном масштабе
npm install serverless -g
Создайте функцию AWS Lamdba в Node.js
serverless create --template aws-nodejs
Пример 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
Разверните для жизни учетную запись AWS
serverless deploy
Создание простой операции CRUD
Создание простой операции CRUD с использованием безсерверной системы
Внедрение платформы без сервера во всем мире
npm install serverless -g
Создание простой лямбда-службы
serverless create --template aws-nodejs --path myService
Перейдите в каталог myService, который должен содержать
- serverless.yml
- handler.js
- event.json
Конфигурация всех серверов без сервера управляется сервером serverless.yml
Измените его содержимое, чтобы определить CRUD-сервис.
Пример файла 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'
Этот файл определяет
- Лямбда-программирование
- Политика выполнения Lambda-функций
- Создание таблицы Dynamodb и ее политика
- Конечная точка HTTP (конечная точка шлюза API)
Затем вы должны определить лямбда-функцию (например, node.js) в файле handler.js, которую вы можете определить.
'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);
});
};
Затем вам нужно создать новые файлы для определения функций CRUD
Создайте эти файлы
- Todos-create.js
- Todos чтения-all.js
- Todos чтения-one.js
- Todos-update.js
- Todos-delete.js
Затем определите эти функции в каждом файле.
для 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);
});
};
Для 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);
});
};
Для 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);
});
};
Для 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);
});
};
Для запуска этого приложения вам необходимо установить зависимости npm
-
npm init
npm инициализация -
npm install aws-sdk --save
install aws-sdk -
npm install uuid --save
развертывание
Теперь вы можете развернуть этот проект
cd myService
проверяет, что вы находитесь в каталоге проекта, тогда вы можете развернуть свой код
serverless deploy
Использовать конечную точку
Если вы успешно развернули, вы просмотрите имена конечных элементов интерфейса api в консоли.
Тест Создать конечную точку
curl -X POST https://XXXX.execute-api.region.amazonaws.com/dev/todos --data '{ "body" : "Learn Serverless" }'
Тест для чтения конечной точки (Читать все)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos
Тест для чтения End Point (Read One)
curl https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id>
Тест для конечной точки обновления
curl -X PUT https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id> --data '{ "body" : "Understand Serverless" }'
Тест для удаления конечной точки
`curl -X DELETE https://XXXX.execute-api.region.amazonaws.com/dev/todos/<id`>