Мне с друзьями довелось поучаствовать в хакатоне SberCloud.Advanced Hacking и пощупать облачные сервисы Сбера. На моем текущем месте работы я каждый день работаю с Serverless стеком от AWS (CloudFront + Lambda Edge + S3 + Lambda + Step Functions + Aurora PostgreSQL Serverless + DynamoDB + Cognito). Так что мне есть с чем сравнить. Если заинтересовались, то добро пожаловать под кат.
Недавно Сбер выкатил в публичный доступ свою облачную платформу SberCloud. К сожалению, сейчас, чтобы ей воспользоваться, нужно быть юридическим лицом. Представители Сбера говорят, что, возможно, доступ для физических лиц появится в следующем году. Но тем не менее, в рамках хакатона, я смог посмотреть, что там внутри, как обычный смертный. Что я там увидел? Огромное количество сервисов прям, как у AWS, на любой вкус.
Меня прежде всего интересовал 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 // Воркшоп. Павел Кутаков
На хакатоне мы с ребятами делали изоморфное приложение на React+Redux. Презентация нашего проекта:
ссылка на оригинал статьи https://habr.com/ru/post/532814/
Добавить комментарий