Bot Telegram sans serveur dans Yandex.cloud, ou 4,6 kopecks pour 1000 messages

Résumé

"Chaque fois que vous recevez une mise à jour du webhook, vous avez deux options"
De Telegram Bot Api Faq


Bonjour, Habr!


Pendant longtemps, le concept sans serveur (ou plus précisément, sa mise en œuvre en tant que service AWS Lambda) a été pour moi une idée relativement claire mais très abstraite. Elle a souvent sonné dans Radio-T, des discussions sur le reddit, mais n'est jamais entrée dans ma vie. Les projets de travail ne vivent pas dans le cloud, mais les projets à domicile - pourquoi? Les ordinateurs virtuels deviennent moins chers, Docker est maîtrisé et tout fonctionne bien.


Mais la présentation de Yandex Cloud Functions, et en particulier les prix annoncés pour ce service, ont donné matière à réflexion.


TL; DR - un vendredi soir pluvieux, nous écrirons un bot Telegram simple en javascript qui peut répondre aux demandes avec des messages simples. S'il s'agit de votre projet de maison, son utilisation vous coûtera certainement beaucoup moins cher que le VPS le plus budgétaire.


Allons-y.


Qu'est-ce que Serverless dans le sens le plus courant?


Je n'irai pas très loin dans la jungle; des articles de synthèse sur ce sujet paraissent régulièrement sur Habré. C'est l'occasion de placer une fonction dans le cloud, dans l'un des langages de programmation pris en charge par la plateforme, pour fixer les conditions de son fonctionnement - et c'est tout. Lorsque le déclencheur se produit, l'environnement virtuel augmente, la fonction y fonctionne et s'éteint. Ensemble avec l'environnement.


Quels sont les avantages de cette approche?


La sécurité


Vous obtenez un environnement isolé sécurisé avec la dernière version du compilateur / interprète.


Au lieu de surveiller les mises à jour des packages sur un véritable système d'exploitation dans la machine virtuelle et de configurer des politiques de sécurité et un pare-feu, vous téléchargez le programme sur le serveur et cela fonctionne.


Stabilité et résilience


Au lieu de configurer pm2, de configurer une stratégie de redémarrage, de surveiller une fuite de mémoire et de comprendre les nuances du déploiement - oui, vous téléchargez simplement le programme sur le serveur et le fournisseur de services s'occupe du reste.


Prix, en particulier dans la maison des projets à faible charge


Lors de la facturation, la quantité de mémoire réservée à la fonction lors de son exécution et le nombre d'appels sont pris en compte. Selon la documentation, 10 000 000 lancements de fonctions, exécutant 800 ms avec une limite de mémoire de 512 Mo, coûteront 3 900 roubles.


Qu'est-ce que cela signifie pour moi? Mon projet d'animal de compagnie typique est un bot qui répond aux questions planifiées pour un événement bien connu dans les cercles étroits. Vous devez l'exécuter une fois par an, pendant plusieurs jours. L'année dernière, il a répondu à 1 000 demandes des participants, 128 Mo lui suffisent, le temps d'exécution de la fonction est de 300 ms. Un tel cas d'utilisation coûtera 0,046₽ .


Oui, 4,6 kopecks. De plus, je ne passerai pas de temps sur les réglages, ce qui est encore plus agréable. Aucune règle pour pm2, aucune actualisation du Dockerfile ou de l'environnement, et une cerise sur le gâteau - SLA 99.9.


Des tâches non résolues jusqu'à présent (mais, je suppose, c'est une question de temps) - la liaison de domaines externes, ainsi que le réglage fin des méthodes http qui servent de déclencheur pour la fonction. Désormais, le déclencheur http se déclenche sur l'une des demandes DELETE, GET, HEAD, OPTIONS, PATCH, POST ou PUT pour un point d'entrée généré automatiquement comme https://functions.yandexcloud.net/xxxxxxxxxxxxxxxx .


Parmi les bonnes nouvelles, il s'agit de https à part entière qui répondent à toutes les exigences de Telegram pour travailler avec des API via des webHooks. Mais AWS Lambda possède des modules complémentaires sous la forme d'API Gateway, et le paramètre de déclenchement lui-même est plus large si vous en avez besoin.


Une limitation évidente de l'approche sans serveur elle-même, quelle que soit la plate-forme - vous devez utiliser exactement ce qu'ils donnent. Vous ne pouvez pas écrire de code dans des langages de programmation non pris en charge ou utiliser des paramètres de compilateur / interprète non standard. Il peut également y avoir des restrictions supplémentaires conçues pour protéger tous les participants au processus de développement.


Comment créer un fichier .js pour travailler dans Yandex.Cloud?


Petit guide à travers l'interface web:


  • créer une fonction
  • créer un fichier dans l'interface Web avec n'importe quel nom et extension js
  • choisissez un interprète - nodejs10 ou nodejs12
  • dans le fichier, nous écrivons une fonction avec un paramètre dans exports.myFunction (enfin, dans un champ arbitraire dans les exportations)
  • indiquer le délai d'expiration de la fonction, RAM (128 Mo-1024 Mo par incréments de 128 Mo), point d'entrée (filename.myFunction)
  • rendre la fonction publique

Une fonction écrite dans un fichier peut:


Obtenez les données de demande http via le paramètre d'entrée:


la fonction ne reçoit pas la requête dans sa forme pure, et bien sûr ne contrôle pas la progression de la requête - elle reçoit dans son seul paramètre un objet avec des informations sur la requête:


{ "httpMethod": "< HTTP >", "headers": "<    HTTP->", "multiValueHeaders": "<    HTTP->", "queryStringParameters": "< queryString->", "multiValueQueryStringParameters": "<   queryString->", "requestContext": "<   >", "body": "< >", "isBase64Encoded": <true  false> } 

Répondre à la requête http


selon la documentation :


 { "statusCode": <HTTP  >, "headers": "<    HTTP->", "multiValueHeaders": "<    HTTP->", "body": "< >", "isBase64Encoded": <true  false> } 

Donc, quelque chose de vendredi, inutile


Tout d'abord, regardez ce qui a déjà été écrit avant nous - implémentations de tels bots pour le wagon et le petit chariot AWS Lambda.


Ils ont un problème - afin de ne pas réinventer la roue et de fournir une interface familière, toutes ces implémentations, à la réception de la demande, lancent une publication sur le serveur d'api du télégramme. Mais vous pouvez le faire plus facilement.


Comme vous pouvez le voir sur le KDPV, et la citation au début de l'article - lorsque vous travaillez via webHook, le télégramme écoute la réponse à son message de mise à jour afin de comprendre s'il a été traité par notre bot. De plus, il est prêt à accepter le message comme faisant partie de la même réponse.


Selon la documentation, la réponse ne doit contenir qu'une seule fonction (vérifié sendMessage et sendPhoto ). Pour de nombreux projets, cela suffira.


Nous suivrons les traditions et saluerons le Habrovchanam:


 exports.input = function (data){ let body = JSON.parse(data.body); let answer = { "method":"sendMessage", "chat_id": body.message.chat.id, "reply_to_message_id" : body.message.message_id, "text" : ", Habr!" }; return { "statusCode": 200, "headers": { 'Content-Type': 'application/json' }, "body": JSON.stringify(answer), "isBase64Encoded": false } } 

Définissez les paramètres au minimum:



Et dites à Telegram que nous utiliserons webHook:


 curl -F "url=https://functions.yandexcloud.net/{secret_function_id}" https://api.telegram.org/bot{secret_bot_key}/setWebhook 

C’est tout. Le bot fonctionne.



Vous pouvez discuter avec lui: @YandexServerlessBot


Tout cela en une seule image


Pour résumer - dans certains cas, le serveur sans serveur est extrêmement bon marché, pratique et permet d'économiser beaucoup de temps, et toute documentation doit être lue attentivement: alors cela peut agréablement surprendre.


Si vous êtes intéressé, bienvenue dans la documentation Yandex Cloud Functions, il y a beaucoup de choses intéressantes, de l'intégration avec d'autres services cloud au débogage, aux planifications de chargement, etc.


La vidéo de la conférence est également disponible sur YouTube .


UPD : Comme d'autres recherches l'ont montré (grâce à l' IRT pour la pointe), les serveurs tg sont accessibles sans de telles astuces, vous pouvez donc utiliser en toute sécurité les demandes d'api traditionnelles.

Source: https://habr.com/ru/post/fr470081/


All Articles