Serverless шагает по планете. Сравним SberCloud и AWS
Мне с друзьями довелось поучаствовать в хакатоне
SberCloud.Advanced Hacking и пощупать облачные сервисы Сбера. На моем текущем месте работы я каждый день работаю с Serverless стеком от AWS (CloudFront + Lambda Edge + S3 + Lambda + Step Functions + Aurora PostgreSQL Serverless + DynamoDB + Cognito). Так что мне есть с чем сравнить. Если заинтересовались, то добро пожаловать под кат.
Недавно Сбер выкатил в публичный доступ свою облачную платформу SberCloud. К сожалению, сейчас, чтобы ей воспользоваться, нужно быть юридическим лицом. Представители Сбера говорят, что, возможно, доступ для физических лиц появится в следующем году. Но тем не менее, в рамках хакатона, я смог посмотреть, что там внутри, как обычный смертный. Что я там увидел? Огромное количество сервисов прям, как у AWS, на любой вкус https://sbercloud.ru/ru/products.
Меня прежде всего интересовал Serverless стек. Вообще, мало кто может похвастаться настоящими Serverless сервисами, у которых стоимость использования зависит только от реальной нагрузки. Сервером с платой за месяц уже ни кого не удивишь.
Я хотел собрать приложение аналогичное такому в AWS.
Вот что получилось на стеке SberCloud.
Я быстренько создал лямбду FunctionGraph.
Прикрутил к ней API Gateway. Настроил HTTP/HTTPS trigger.
Кстати, читать логи лямбды оказалось намного удобнее чем в AWS. Всё в одном месте. Ненужно прыгать по вкладкам и искать нужный Log Stream.
К сожалению, настоящей Serverless базы данных у SberCloud не нашлось. Пришлось взять сервис с фиксированной платой.
Настроил Environment variables от PostgreSQL пользователя у лямбды FunctionGraph.
Написал небольшой Serverless адаптер для работы с PostgreSQL базой из лямбды. Нужно аккуратно закрывать за собой соединения, а то они кончатся.
import { Client } from 'pg'
export const escapeId = (str: string): string => `"${String(str).replace(/(["])/gi, '$1$1')}"`
export const escapeStr = (str: string): string => `'${String(str).replace(/(['])/gi, '$1$1')}'`
export const executeStatement = async >(
sql: string
): Promise> => {
const client = new Client()
await client.connect()
try {
const res = await client.query(sql)
return res.rows
} finally {
await client.end()
}
}
Настроил Object Storage Service.
Некое SDK для работы с SberCloud имеется, но чего-то полезного мне там найти не удалось.
Для загрузки картинок из браузера в Object Storage Service через подписанный URL код пришлось писать самому. Не самое приятное занятие угадывать сигнатуры и считать хеши руками.
async (req: Request, res: Response) => {
validateUserHandler(req, res)
const { authToken } = context
const { userId } = req.params
const uploadId = uuidV4()
const body = Buffer.from(
JSON.stringify({
auth: {
identity: {
methods: ['token'],
token: {
id: authToken,
'duration-seconds': '900',
},
},
},
}),
'utf8'
)
const options = {
hostname: 'iam.ru-moscow-1.hc.sbercloud.ru',
port: 443,
path: '/v3.0/OS-CREDENTIAL/securitytokens',
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf8',
'Content-Length': body.length,
},
}
const credentialBuffer: Buffer = await new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
res.on('data', (data) => {
resolve(data)
})
res.on('error', (error) => {
reject(error)
})
})
req.write(body)
req.end()
})
const {
credential,
}: {
credential: { securitytoken: string; secret: string }
} = JSON.parse(credentialBuffer.toString('utf8'))
const { securitytoken, secret } = credential
const stringToSign = Buffer.from(
JSON.stringify({
expiration: '2020-12-31T12:00:00.000Z',
conditions: [
{ 'x-obs-acl': 'public-read' },
{ 'x-obs-security-token': securitytoken },
{ bucket: 'anti-cube-images' },
['starts-with', '$key', `${userId}/`],
],
}),
'utf8'
).toString('base64')
const hmac = crypto.createHmac('sha1', secret)
hmac.update(stringToSign)
const signature = hmac.digest('base64')
res.json({
uploadId,
signature,
})
}
В целом SberCloud мне понравился. Очень достойно. Не ожидал увидеть международный уровень облачных сервисов на российском рынке. Желаю Сберу обзавестись настоящей Serverless базой данных с платой только за использование. Лучше смотреть в этом плане в сторону CosmosDB от Azure или опенсорсного TiDB на своих серверах. У AWS сделано не особо грамотно, не копируйте у них.
Дополнительно про SberCloud можно посмотреть на YouTube:
Документация: https://docs.sbercloud.ru/
На хакатоне мы с ребятами делали изоморфное приложение на React+Redux. Презентация нашего проекта: https://docs.google.com/presentation/d/1LNjg2xfFHljTuH6ke_lkF6o1m9HTfemWcxW0w1OOssc/edit? usp=sharing