やりたいこと
AWSのLambdaを用いて、毎分0秒に「やっほー」と呟くDiscordのBotを作成します。
本記事の対象者
- とりあえずLambdaで何かしてみたい方
- サーバーレスでBotを作ってみたい方
前提条件
Discordの開発者ポータルからアプリ作成+Bot作成は済んでおり、Botトークンが取得できている状態(まだない方は、簡単なのでぜひ取得してみてください)
↑こちらの画面のToken発行ボタンから取得するものです。
※Botのアイコン画像はぷしおメーカー様で作成しました。
1. 関数の作成
- Lambdaコンソールを開く
- 「関数の作成」を押す
- 「一から作成」を選択
- 関数名は「discordBotMessage」
- ランタイムは「Python3.11」
- 他の項目はそのままで「関数の作成」を押す
これでdiscordBotMessage関数が作成されますので、ここからコーディング開始…といきたいところですが、次に「レイヤー追加」という作業をします。
レイヤーの追加
レイヤーとは、Lambdaの仕様の一つで、外部のライブラリ等を使用するためのものです。
コードをzipにしてアップロードすることで、Lambda関数内で任意のプログラムが使用可能になります。
今回、pythonでHTTP通信するためのrequestsを使用したいので、そのためのレイヤーを追加します。
Zipの作成
ローカルで以下実行(pipが使えない方はこちらの記事を参考にしてください)
mkdir python
pip install -t python requests
zip -r9 layer.zip python
layer.zipが作成されます。
レイヤー作成
- Lambdaコンソールのメニューから「レイヤー」を押す
- 「レイヤーの作成」を押す
- 名前に「python-requests」
- アップロードボタンからlayer.zipをアップロード
- 互換性のアーキテクチャ両方にチェック
- 「作成」を押す
レイヤーの追加
- discordBotMessage関数のページに戻り、画面下部「レイヤーの追加」を押す
- 「カスタムレイヤー」を選択し、プルダウンから「python-requests」を選択、バージョンに「1」を選択して「追加」ボタンを押す
2. 関数のコーディング
discordBotMessage関数に以下実装(Botトークンをソース直書きはあまり望ましくないと思いますが、今回はなるべく簡略に済ましたいので…)
import json
import requests
def lambda_handler(event, context):
# Discord APIのエンドポイント [channel_id]にはボットメッセージ送信先のチャンネルIDを入れてください
url = "https://discord.com/api/channels/[channel_id]/messages"
# ヘッダー [bot_token]には使用するBotトークンを入れてください
headers = {
"Authorization": "Bot [bot_token]",
"Content-Type": "application/json"
}
# 送信内容
payload = {
"content": "やっほー"
}
# POSTリクエストを送信
r = requests.post(url, json=payload, headers=headers)
data = r.json()
# ログに結果を出す
print(json.dumps(data))
DiscordのチャンネルIDの取得については、こちらの記事を参考にして取得してください。(めちゃ簡単です!)
実装できたら、「Deploy」を押してください。
3. Test実行
まずはちゃんと関数が動くかを検証します。
- 「Test」を押す
- 「テストイベントを設定」というモーダルが出ますが、何も入力せず「呼び出す」を押す
4. トリガーを設定する
Lambdaを実行するためのトリガーを設定します。今回は、定時刻に実行したいのでEventBridgeを設定します。
- 「関数の概要」の「トリガーを追加」を押す
- プルダウンから「EventBridge」を選択
- 「Create a new rule」を選択
- Rule nameに「discord-bot-message」と入力
- Schedule expressionに
cron(* * ? * * *)
を入力し、「追加」を押す
備考
Schedule expressionの時刻指定ですが、UTC時間なので注意
例:日本の朝10時の場合はcron(0 1 ? * * *)
と指定(日本時間にするため-9時間する)
5. 動作確認
まとめ
いかがでしたでしょうか?Lambdaを触ったことがなかった方も、なんとなくLambdaがどんなものかが分かったのではないかと思います。トリガーには様々なAWSサービスを設定できるので、いろいろ試してみてください!
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。