13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lambdaで定時刻に呟くDiscord Botを作る

Last updated at Posted at 2024-04-15

やりたいこと

AWSのLambdaを用いて、毎分0秒に「やっほー」と呟くDiscordのBotを作成します。

本記事の対象者

  • とりあえずLambdaで何かしてみたい方
  • サーバーレスでBotを作ってみたい方

前提条件

Discordの開発者ポータルからアプリ作成+Bot作成は済んでおり、Botトークンが取得できている状態(まだない方は、簡単なのでぜひ取得してみてください)
スクリーンショット 2024-04-07 17.48.08.png
↑こちらの画面のToken発行ボタンから取得するものです。
※Botのアイコン画像はぷしおメーカー様で作成しました。

1. 関数の作成

  1. Lambdaコンソールを開く
  2. 「関数の作成」を押す
  3. 「一から作成」を選択
  4. 関数名は「discordBotMessage」
  5. ランタイムは「Python3.11」
  6. 他の項目はそのままで「関数の作成」を押す

スクリーンショット 2024-04-07 17.25.20.png

これでdiscordBotMessage関数が作成されますので、ここからコーディング開始…といきたいところですが、次に「レイヤー追加」という作業をします。

レイヤーの追加

レイヤーとは、Lambdaの仕様の一つで、外部のライブラリ等を使用するためのものです。
コードをzipにしてアップロードすることで、Lambda関数内で任意のプログラムが使用可能になります。
今回、pythonでHTTP通信するためのrequestsを使用したいので、そのためのレイヤーを追加します。

Zipの作成

ローカルで以下実行(pipが使えない方はこちらの記事を参考にしてください)

mkdir python
pip install -t python requests
zip -r9 layer.zip python

layer.zipが作成されます。

レイヤー作成

  1. Lambdaコンソールのメニューから「レイヤー」を押す
  2. 「レイヤーの作成」を押す
  3. 名前に「python-requests」
  4. アップロードボタンからlayer.zipをアップロード
  5. 互換性のアーキテクチャ両方にチェック
  6. 「作成」を押す

スクリーンショット 2024-04-07 17.31.45.png

レイヤーの追加

  1. discordBotMessage関数のページに戻り、画面下部「レイヤーの追加」を押す
  2. 「カスタムレイヤー」を選択し、プルダウンから「python-requests」を選択、バージョンに「1」を選択して「追加」ボタンを押す

スクリーンショット 2024-04-07 17.33.24.png

2. 関数のコーディング

discordBotMessage関数に以下実装(Botトークンをソース直書きはあまり望ましくないと思いますが、今回はなるべく簡略に済ましたいので…)

discordBotMessage.py
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実行

まずはちゃんと関数が動くかを検証します。

  1. 「Test」を押す
  2. 「テストイベントを設定」というモーダルが出ますが、何も入力せず「呼び出す」を押す

スクリーンショット 2024-04-07 17.39.32.png
Discordに通知が来てるのを確認できました。

4. トリガーを設定する

Lambdaを実行するためのトリガーを設定します。今回は、定時刻に実行したいのでEventBridgeを設定します。

  1. 「関数の概要」の「トリガーを追加」を押す
  2. プルダウンから「EventBridge」を選択
  3. 「Create a new rule」を選択
  4. Rule nameに「discord-bot-message」と入力
  5. Schedule expressionにcron(* * ? * * *)を入力し、「追加」を押す

スクリーンショット 2024-04-07 18.02.02.png

備考

Schedule expressionの時刻指定ですが、UTC時間なので注意
例:日本の朝10時の場合はcron(0 1 ? * * *)と指定(日本時間にするため-9時間する)

5. 動作確認

スクリーンショット 2024-04-07 17.46.30.png
毎分0秒にメッセージが来ているのが確認できました!

まとめ

いかがでしたでしょうか?Lambdaを触ったことがなかった方も、なんとなくLambdaがどんなものかが分かったのではないかと思います。トリガーには様々なAWSサービスを設定できるので、いろいろ試してみてください!

告知

最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

みなさまからのご応募をお待ちしております。

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?