[JavaScript, Node.JS, Amazon Web Services, ReactJS, Облачные сервисы] Serverless шагает по планете. Сравним SberCloud и AWS

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
14-Дек-2020 12:31


оригинал
Мне с друзьями довелось поучаствовать в хакатоне
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:

Документация: https://docs.sbercloud.ru/
На хакатоне мы с ребятами делали изоморфное приложение на React+Redux. Презентация нашего проекта: https://docs.google.com/presentation/d/1LNjg2xfFHljTuH6ke_lkF6o1m9HTfemWcxW0w1OOssc/edit?usp=sharing
Извините, данный ресурс не поддреживается. :(
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_javascript, #_node.js, #_amazon_web_services, #_reactjs, #_oblachnye_servisy (Облачные сервисы), #_sbercloud.advanced_hacking, #_aws, #_serverless, #_react, #_redux, #_hackathon, #_javascript, #_node.js, #_amazon_web_services, #_reactjs, #_oblachnye_servisy (
Облачные сервисы
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 08:40
Часовой пояс: UTC + 5