Serverless шагает по планете. Сравним SberCloud и AWS

от автора

image

Мне с друзьями довелось поучаствовать в хакатоне SberCloud.Advanced Hacking и пощупать облачные сервисы Сбера. На моем текущем месте работы я каждый день работаю с Serverless стеком от AWS (CloudFront + Lambda Edge + S3 + Lambda + Step Functions + Aurora PostgreSQL Serverless + DynamoDB + Cognito). Так что мне есть с чем сравнить. Если заинтересовались, то добро пожаловать под кат.

Недавно Сбер выкатил в публичный доступ свою облачную платформу SberCloud. К сожалению, сейчас, чтобы ей воспользоваться, нужно быть юридическим лицом. Представители Сбера говорят, что, возможно, доступ для физических лиц появится в следующем году. Но тем не менее, в рамках хакатона, я смог посмотреть, что там внутри, как обычный смертный. Что я там увидел? Огромное количество сервисов прям, как у AWS, на любой вкус.

Меня прежде всего интересовал Serverless стек. Вообще, мало кто может похвастаться настоящими Serverless сервисами, у которых стоимость использования зависит только от реальной нагрузки. Сервером с платой за месяц уже ни кого не удивишь.

Я хотел собрать приложение аналогичное такому в AWS.

AWS Serverless Application

Вот что получилось на стеке SberCloud.

SberCloud Serverless Application

Я быстренько создал лямбду FunctionGraph.

FunctionGraph. 1
FunctionGraph. 2

Прикрутил к ней API Gateway. Настроил HTTP/HTTPS trigger.

API Gateway

Кстати, читать логи лямбды оказалось намного удобнее чем в AWS. Всё в одном месте. Ненужно прыгать по вкладкам и искать нужный Log Stream.

FunctionGraph Logs

К сожалению, настоящей Serverless базы данных у SberCloud не нашлось. Пришлось взять сервис с фиксированной платой.

RDS Postgres

Настроил Environment variables от PostgreSQL пользователя у лямбды FunctionGraph.

Environment variables

Написал небольшой 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.

Object Storage Service. 1
Object Storage Service. 2

Некое SDK для работы с SberCloud имеется, но чего-то полезного мне там найти не удалось.

SberCloud SDK

Для загрузки картинок из браузера в 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:

Документация

На хакатоне мы с ребятами делали изоморфное приложение на React+Redux. Презентация нашего проекта:

ссылка на оригинал статьи https://habr.com/ru/post/532814/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *