はじめに
今回作成したDiscordBot(Python)は、Discordのチャンネルに対してメッセージを書き込むものを作成しました。
また、毎日0:00に書き込んでほしいので、EventBridgeからLambdaを起動して書き込む仕組みにしました。
用途としては、FiveMのガソリンスタンドを経営しており、ガソリンの価格を日々変更したく、一定の範囲のランダム値を投稿するのと、ゲーム内でのX(ツイッター)でポストするためのテンプレート文章をDiscordのチャンネルに投稿するものを作成しました。
構成イメージ
EventBridgeからLambdaを起動して、Discordのチャンネルにメッセージを書き込みます。
【全体の概要構成】
Discordの動作イメージ
特定のチャンネルに対して、毎日0:00に価格がランダム(280-420の間)でDiscordBotがメッセージを記載します。
↑この文章をコピペして、ゲーム内でつぶやいています。
Pythonのコード
import discord
import random
import os
import asyncio
TOKEN = os.environ['DISCORD_BOT_TOKEN']
CHANNEL_ID = int(os.environ['DISCORD_CHANNEL_ID'])
CHANNEL_ID_TW = int(os.environ['DISCORD_CHANNEL_ID_TW'])
intents = discord.Intents.default()
client = discord.Client(intents=intents)
async def send_gas_price():
await client.wait_until_ready()
channel = client.get_channel(CHANNEL_ID)
channel_tw = client.get_channel(CHANNEL_ID_TW)
if channel is not None:
price = round(random.uniform(280, 420), 2)
message = f"本日のガソリン販売価格は {price} 円です"
await channel.send(message)
else:
print("チャンネルが見つかりません")
if channel_tw is not None:
message = f"本日の8140番地GSのガソリン販売価格は {price} 円/Lです!!\n(他のGSは、700円台/Lです)"
await channel_tw.send(message)
else:
print("チャンネルが見つかりません")
@client.event
async def on_ready():
await send_gas_price()
await client.close()
def lambda_handler(event, context):
loop = asyncio.get_event_loop()
loop.run_until_complete(client.start(TOKEN))
DiscordBotのトークンやチャンネルIDはLambdaの環境変数に登録して呼び出します。
TOKEN = os.environ['DISCORD_BOT_TOKEN']
CHANNEL_ID = int(os.environ['DISCORD_CHANNEL_ID'])
CHANNEL_ID_TW = int(os.environ['DISCORD_CHANNEL_ID_TW'])
なお、チャンネルは複数にメッセージを書き込むため、2つ用意しています。
DiscordBotのトークンやチャンネルIDの確認については、過去の記事を参照してください。
Lambdaでのデプロイ
外部ライブラリ(dicord.py)を使用するため、Zipにまとめてのデプロイを実施しています。
事前準備
1)アップロードするディレクトリを作成します。
mkdir 35-GS-price-Discord-Bot
cd 35-GS-price-Discord-Bot
2)外部ライブラリをフォルダに格納(install)します。
pip install discord.py -t .
pip install requests -t .
3)同じディレクトリ内にlambda_function.pyを作成します。
(上記で記載しているpythonコード)
4)35-GS-price-Discord-Botフォルダをzipで圧縮します。
Lmabdaの作成
AWSマネージメントコンソールからLabmda関数を作成します。
[選択する内容]
関数名:任意の名前
ランタイム:Python 3.12
アーキテクチャ:任意
【Zipのアップロード】
アップロード元で.zipファイルを選択しアップロードします。
タイムアウト値の変更
デフォルトの3秒だと、タイムアウトしてしまうので、タイムアウト値を30秒に変更します。
Lambdaの環境変数の設定
Lambdaの画面から「設定」タブをクリックし、左メニューの「環境変数」をクリックすします。
キーにpythonで記載したキー名(DISCORD_BOT_TOKENなど)を記載し、値にトークンやチャンネルIDを入力します。
EventBridgeの設定
Lambdaを毎日0:00に実行するEventBridgeを作成します。
今回はLabmdaの画面から[+トリガーを追加]をクリックします。
トリガーの設定で[EventBridge(CloudWach Envets)]を選択します。
新規のルールを作成を選択し、ルール名とスケジュール式を入力します。
Linuxのcronとは若干書式が異なります。また、UTCのため0時に起動するためには15時にする必要があります。
動作テスト
Lmabdaの動作テストをするには、テストタブから[テスト]をクリックします。
※今回のスクリプトはそのままの実行できます。
これでLambdaのデプロイとEventBridgeの設定は完了です。
最後に
今回は定期的に呟くDiscordBotであり、常時起動させておく必要がなかったため、Lambdaで実装しました。
また、今回はLambdaでのDiscordBot実装が初めてだったのと、今後の他のDiscordBotをLambdaで作成する予定もないため、Lambdaレイヤーは使わずに、外部モジュールも全部合わせてZipにしています。
次回は、Lambdaレイヤーを使った実装に挑戦してみようと思います。