文章原文:https://owo.cab/106 ,同期発表 xLog
前書き#
AWS Lambda とは#
AWS Lambda は、事前にサーバーを設定したり管理したりすることなく、コードを実行できる計算サービスです。Lambda は、高可用性の計算インフラストラクチャ上でコードを実行し、サーバーやオペレーティングシステムのメンテナンス、容量の調整、弾力的なスケーリング、ログ記録など、計算リソースのすべての管理作業を実行します。Lambda を使用すると、ほぼすべてのタイプのアプリケーションやバックエンドサービスのためにコードを実行できます。Lambda がサポートする言語のいずれかでコードを提供するだけで済みます。
コードを Lambda 関数に整理できます。Lambda は、必要なときにのみ関数を実行し、毎日数件のリクエストから毎秒数千件のリクエストに自動的にスケールします。消費した計算時間に対してのみ料金が発生し、コードが実行されていないときは料金が発生しません。
AWS Lambda を使用する理由#
- 管理不要
AWS Lambda はサーバーレス計算サービスであり、インフラストラクチャを自動的にスケールおよび管理するため、サーバーの管理やメンテナンスを考慮する必要がなく、コードを書いて Lambda にアップロードするだけで済みます。 - 低コスト
以前のボットはすべてサーバー上で実行されており、ボットが使用されているかどうかにかかわらず、サーバーは常に稼働しており、運用コストが増加していました。上記のように、実際に実行されたコードの時間に対してのみ支払うため、Lambda を使用することで運用コストを大幅に削減できます。 - 高速デプロイ
数分でコードを本番環境にデプロイできます。
関連する中国語のチュートリアルを探しても見つからなかったので、手軽に記録しておきます(
試み#
Telegram ボットの作成#
Telegram で@BotFatherを検索し、指示に従ってボットを作成します。
作成が完了すると、token(赤線で示した部分)が得られます。後のボット操作に使用するためにtokenを保持します。
Lambda 関数の作成#
AWS Lambda 関数コンソールに移動し、関数の作成を選択して新しい関数を作成します。
任意の関数名を入力し、ランタイムとしてPython 3.10を選択し、関数の作成をクリックします。
作成が完了すると、いくつかのサンプルコードが表示されます。
API の作成#
API Gateway コンソールに移動し、REST APIの中で構築をクリックします。
ここでREST APIを選択しますが、もちろんHTTP APIを選択することもできます。
ActionsメニューでCreate Methodをクリックします。
設定を簡単にするために、ここではANYメソッドを選択します。
Use Lambda Proxy integrationにチェックを入れ、Lambda Functionを入力し、Saveをクリックします。
ActionsメニューのDeploy APIをクリックします。
Deployment stageでNew Stageを選択し、任意の名前を入力してDeployをクリックします。
完了すると、Invoke URLが得られます。
Invoke URLにアクセスしてみて、"Hello from Lambda!"が返ってくれば、Lambda と API が正常に作成されたことを示します。
簡単なボットの構築#
Lambda コンソールに戻り、設定タブをクリックして、ボットトークンを保存するための環境変数を新しく作成します。
ローカルコンピュータに新しいフォルダを作成し、Lambda 関数のコードを保存するためのlambda_function.pyファイルを作成します。
環境変数のボットトークンを使用するための変数を宣言します。
import os
BOT_TOKEN = os.environ['BOT_TOKEN']
メッセージを送信するための関数を作成します。
import requests
def send_message(chat_id, text):
params = {
"text": text,
"chat_id": chat_id,
"parse_mode": "MarkdownV2"
}
requests.get(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
params=params
)
ボットのメッセージを処理するための簡単な関数を作成します。この部分はニーズに応じてより豊富な内容を追加できます。
ここではリピートボットを作成します(?
import json
def process_event(event):
message = json.loads(event['body']['message'])
chat_id = message['chat']['id']
text = message['text']
if text:
send_message(chat_id, text) # メッセージを受け取ったときにメッセージを繰り返す
最後に、Lambda 関数のエントリポイントを作成します。
注意、必ずステータスコード 200 を返すこと。そうしないと Telegram サーバーはボットがメッセージを受け取っていないと見なし、同じ内容を繰り返し送信します、そして(手動で滑稽
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200 # ステータスコード200を返す
}
完全なコード
import os
import json
import requests
BOT_TOKEN = os.environ['BOT_TOKEN']
def send_message(chat_id, text):
params = {
"text": text,
"chat_id": chat_id,
"parse_mode": "MarkdownV2"
}
requests.get(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
params=params
)
def process_event(event):
message = json.loads(event['body']['message'])
chat_id = message['chat']['id']
text = message['text']
if text:
send_message(chat_id, text)
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200
}
依存関係のインストール#
Lambda はすべての依存関係を提供しないため、自分でインストールする必要があります。
先ほど作成したフォルダに移動し、そのディレクトリでpipを使用してrequestsをそのフォルダにインストールします。
pip install --target ./ requests
そのフォルダ内のすべての内容(lambda_function.pyを含む)を.zipファイルにパッケージ化します。
AWS Lambda コンソールでコードタブを選択し、zipファイルからアップロードをクリックします。
Telegram ボット Webhook の設定#
API Gateway は Lambda 関数と Telegram サーバーを接続する橋渡しであり、Webhook を設定することで、ユーザーがボットにメッセージを送信するたびにその内容を API Gateway に渡して Lambda で使用できるようにします。
Webhook を設定するために、Telegram Bot API にリクエストを送信します。
curl https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={GATEWAY_URL}
<BOT_TOKEN>と<API_ENDPOINT_URL>を置き換えることに注意してください。例えば:
curl https://api.telegram.org/bot5653724882:AAHcfYeYzEDfcg2svKzO9ZpiAFPKl4ulKuQ/setWebhook?url=https://6sgwszwmw0.execute-api.ap-southeast-1.amazonaws.com/Test
{"ok":true,"result":true,"description":"Webhook is already set"}が返ってくれば、設定成功です。
完成#
Telegram でボットに任意のメッセージを送信すると、ボットは送信したメッセージを繰り返します。大成功です~
結論#
この部分は ChatGPT によって生成されました
要するに、AWS Lambda はサーバーレス計算サービスであり、ユーザーが事前にサーバーを設定したり管理したりすることなくコードを実行できるようにします。このサンプルプロジェクトは、AWS Lambda と Telegram API の出発点として機能し、数分でコードを本番環境にデプロイし、Telegram ボットを通じてユーザーと対話する方法を示しています。さらに、AWS Lambda は自動的にインフラストラクチャをスケールおよび管理できるため、このサービスを使用することで運用コストを大幅に削減できます。
AWS Lambda や他の AWS サービスについてさらに学びたい場合は、AWS 公式サイトで関連文書やチュートリアルを参照することをお勧めします。