"Wann immer Sie ein Webhook-Update erhalten, haben Sie zwei Möglichkeiten"Vom
Telegramm Bot Api Faq
Hallo Habr!
Das serverlose Konzept (genauer gesagt die Implementierung als AWS Lambda-Service) war für mich lange Zeit eine relativ klare, aber sehr abstrakte Idee. Sie klang oft in Radio-T, Diskussionen über das Reddit, kam aber nie in mein Leben. Arbeitsprojekte leben nicht in der Cloud, sondern zu Hause - warum? Virtuelle Computer werden billiger, Docker wurde beherrscht und alles funktioniert einwandfrei.
Die Präsentation der Yandex Cloud-Funktionen und insbesondere die angekündigten Preise für diesen Service gaben jedoch Anlass zum Nachdenken.
TL; DR - an einem regnerischen Freitagabend werden wir einen einfachen Telegramm-Bot in Javascript schreiben, der auf Anfragen mit einfachen Nachrichten antworten kann. Wenn dies Ihr Heimprojekt ist, kostet Sie die Verwendung mit ziemlicher Sicherheit viel billiger als die kostengünstigste VPS.
Lass uns gehen.
Was ist Serverless im gängigsten Sinne?
Ich werde nicht sehr tief in den Dschungel gehen, Artikel zu diesem Thema erscheinen regelmäßig auf Habré. Dies ist eine Gelegenheit, eine Funktion in der Cloud in einer der von der Plattform unterstützten Programmiersprachen zu platzieren, um die Bedingungen für den Betrieb festzulegen - und das ist alles. Wenn der Auslöser auftritt, steigt die virtuelle Umgebung an, die Funktion arbeitet darin und wird ausgeschaltet. Zusammen mit der Umwelt.
Was sind die Vorteile dieses Ansatzes?
Sicherheit
Mit der neuesten Version des Compilers / Interpreters erhalten Sie eine sichere isolierte Umgebung.
Anstatt Updates für Pakete auf einem realen Betriebssystem in der virtuellen Maschine zu überwachen und Sicherheitsrichtlinien und eine Firewall einzurichten, laden Sie das Programm auf den Server hoch und es funktioniert.
Stabilität und Ausfallsicherheit
Anstatt pm2 zu konfigurieren, eine Neustartrichtlinie einzurichten, einen Speicherverlust zu überwachen und die Nuancen der Bereitstellung zu verstehen, laden Sie das Programm einfach auf den Server hoch, und der Dienstanbieter kümmert sich um den Rest.
Preis, vor allem in der Heimat von Low-Load-Projekten
Beim Aufladen werden die während der Ausführung für die Funktion reservierte Speichermenge und die Anzahl der Anrufe berücksichtigt. Laut Dokumentation kosten 10.000.000 Funktionsstarts mit 800 ms und einem Speicherlimit von 512 MB 3.900 Rubel.
Was bedeutet das für mich? Mein typisches Haustierprojekt ist ein Bot, der geplante Fragen für eine in engen Kreisen bekannte Veranstaltung beantwortet. Sie müssen es einmal im Jahr mehrere Tage lang ausführen. Letztes Jahr beantwortete er 1000 Anfragen von Teilnehmern, 128 MB sind mehr als genug für ihn, die Ausführungszeit der Funktion beträgt 300 ms. Ein solcher Anwendungsfall kostet 0,046₽ .
Ja, 4,6 Kopeken. Außerdem werde ich keine Zeit mit Einstellungen verbringen, was noch angenehmer ist. Keine Regeln für pm2, keine Aktualisierung der Docker-Datei oder der Umgebung und eine Kirsche auf dem Kuchen - SLA 99.9.
Von den bisher ungelösten Aufgaben (aber ich nehme an, es ist eine Frage der Zeit) - die Bindung externer Domänen sowie die Feinabstimmung von http-Methoden, die als Auslöser für die Funktion dienen. Jetzt wird der http-Trigger bei allen DELETE-, GET-, HEAD-, OPTIONS-, PATCH-, POST- oder PUT-Anforderungen für einen automatisch generierten Einstiegspunkt wie https://functions.yandexcloud.net/xxxxxxxxxxxxxxx ausgelöst.
Von den guten Nachrichten ist dies ein vollwertiges https, das alle Telegrammanforderungen für die Arbeit mit API über webHooks erfüllt. AWS Lambda verfügt jedoch über Add-Ons in Form von API-Gateway, und die Triggereinstellung selbst ist bei Bedarf breiter.
Eine offensichtliche Einschränkung des serverlosen Ansatzes selbst, unabhängig von der Plattform - Sie müssen genau das verwenden, was sie bieten. Sie können keinen Code in nicht unterstützten Programmiersprachen schreiben oder nicht standardmäßige Compiler- / Interpreter-Parameter verwenden. Es kann auch zusätzliche Einschränkungen geben , um alle Teilnehmer am Entwicklungsprozess zu schützen.
Wie erstelle ich eine .js-Datei, um in Yandex.Cloud zu arbeiten?
Kurzanleitung durch die Weboberfläche:
- Funktion erstellen
- Erstellen Sie eine Datei in der Weboberfläche mit einem beliebigen Namen und einer beliebigen Erweiterung js
- Wählen Sie einen Interpreter - nodejs10 oder nodejs12
- In der Datei schreiben wir eine Funktion mit einem Parameter in exports.myFunction (also in einem beliebigen Feld beim Export).
- Geben Sie das Zeitlimit der Funktion an: RAM (128 MB - 1024 MB in Schritten von 128 MB), Einstiegspunkt (Dateiname.myFunction)
- Machen Sie die Funktion öffentlich
Eine in eine Datei geschriebene Funktion kann:
Rufen Sie die http-Anforderungsdaten über den Eingabeparameter ab:
Die Funktion empfängt die Anfrage nicht in ihrer reinen Form und steuert natürlich nicht den Fortschritt der Anfrage - sie empfängt in ihrem einzigen Parameter ein Objekt mit Informationen über die Anfrage:
{ "httpMethod": "< HTTP >", "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "queryStringParameters": "< queryString->", "multiValueQueryStringParameters": "< queryString->", "requestContext": "< >", "body": "< >", "isBase64Encoded": <true false> }
Antwort auf http Anfrage
gemäß der Dokumentation :
{ "statusCode": <HTTP >, "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "body": "< >", "isBase64Encoded": <true false> }
Also etwas Freitag, nutzlos
Schauen Sie sich zunächst an, was bereits vor uns geschrieben wurde - Implementierungen solcher Bots für den AWS Lambda-Wagen und den kleinen Wagen .
Sie haben ein Problem: Um das Rad nicht neu zu erfinden und eine vertraute Schnittstelle bereitzustellen, initiieren alle diese Implementierungen nach Erhalt der Anfrage einen Beitrag an den Telegramm-API-Server. Aber du kannst es einfacher machen.
Wie Sie auf KDPV und dem Zitat am Anfang des Beitrags sehen können, hört das Telegramm bei der Arbeit mit webHook auf die Antwort auf seine Aktualisierungsnachricht, um zu verstehen, ob sie von unserem Bot verarbeitet wurde. Darüber hinaus ist er bereit, die Nachricht als Teil derselben Antwort anzunehmen.
Laut Dokumentation sollte die Antwort nur eine Funktion enthalten ( checkMessage und sendPhoto aktiviert ). Für viele Projekte wird dies ausreichen.
Wir werden den Traditionen folgen und das Habrovchanam grüßen:
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 } }
Stellen Sie die Einstellungen auf Minimum ein:

Und sagen Sie Telegram, dass wir webHook verwenden werden:
curl -F "url=https://functions.yandexcloud.net/{secret_function_id}" https://api.telegram.org/bot{secret_bot_key}/setWebhook
Das ist alles. Der Bot arbeitet.

Sie können mit ihm chatten: @YandexServerlessBot
Zusammenfassend lässt sich sagen, dass Serverless in einigen Fällen extrem billig, praktisch und zeitsparend ist. Jede Dokumentation sollte sorgfältig gelesen werden. Dann kann es angenehm überraschen.
Wenn Sie interessiert sind, begrüßen Sie die Dokumentation zu Yandex Cloud-Funktionen. Es gibt viele interessante Dinge, von der Integration mit anderen Cloud-Diensten bis hin zum Debuggen, Laden von Zeitplänen usw.
Konferenzvideos sind auch auf YouTube verfügbar.
UPD : Wie weitere Untersuchungen gezeigt haben (dank IRT für den Tipp), sind tg-Server ohne solche Tricks zugänglich, sodass Sie herkömmliche API-Anforderungen sicher verwenden können.