Мне с друзьями довелось поучаствовать в хакатоне
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 <T extends Record<string, any>>( sql: string): Promise<Array<T>> => { 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:
- SberCloud Advanced Hacking. Вебинар по Graph Engine Service
- SberCloud Advanced Hacking. Вебинар по API Gateway
- SberCloud Advanced Hacking. Вебинар по Function Graph
- SberCloud.Advanced Hacking // Открытие хакатона
- SberCloud.Advanced Hacking // Воркшоп. Петр Предтеченский
- SberCloud.Advanced Hacking // Воркшоп. Павел Кутаков
Документация: https://docs.sbercloud.ru/
На хакатоне мы с ребятами делали изоморфное приложение на React+Redux. Презентация нашего проекта: https://docs.google.com/presentation/d/1LNjg2xfFHljTuH6ke_lkF6o1m9HTfemWcxW0w1OOssc/edit?usp=sharing