💻

AWSでLambda, DynamoDBを使ってWordle構築してみた

2024/03/14に公開

はじめに

Wordleを勉強で作ってみました。この記事は備忘録として、AWSを用いたバックエンド構築について書き記したものになります。
https://kakutory.com/game_pages/MyWordleProject/

作ったきっかけ

2021年に登場した「Wordle」、そのシンプルさかつ面白さが理由で大流行。派生Wordleが次々に現れたり、New York Times社に買収されたり...月日が経った今でさえも、毎日遊んでる人がXに散見されるような、夢みたいなゲーム。

僕が一番魅力を感じるのは「毎日お題を更新する機能」のおかげで、作者であっても毎日遊べることです。2年ほど経った今でも変わらず毎日遊べるってすごいことだと思います。

この「毎日更新機能」を真似して「作者でさえも毎日遊べるゲームが作りたい!」と思い、色々考えた中で1つ面白そうな派生を思いつきました。が、当時あまりにデプロイ周りを考えておらず、挫折...
そこからだいぶ月日が空いたのですが、「まずはいったん本家を真似しよう!」と思い、再トライしてみました。

今回、AWSの勉強をしたいというのも目的の1つだったので、バックエンド構築やサイトホスティングはすべてAWSで行いました。
この記事ではバックエンド構築の全体像の話メインでお話します(後々ホスティング周りの備忘録を残す予定です)

全体像

フロントエンド

Viteで環境構築し、React+TypeScriptを使って作りました(今回フロントの詳細に関しては割愛します)。
S3とCloudfrontを使ってホスティングさせています。

バックエンド

以下のような構成になっています。

  1. (23:30をトリガー)明日のお題を更新
  2. (ゲーム開始時)今日のお題を取得
  3. (単語入力時)英単語の妥当性を確認

先程の図に数字を割り振るとこんな感じ。

いずれもAWS Lambdaを中心に構成しています。

  • 1はEventBridgeでスケジュール実行させています。
  • 2, 3はAPI GatewayによりAPI化させてます。

1. 明日のお題を更新

まずお題を作成するにあたって、こちらのサイトに掲載されている「5文字の単語リスト」を使用しています。このリストから、お題を毎日ランダムで選出しています。
https://copylists.com/words/list-of-5-letter-words/

このサイトの単語から、末尾sの複数形、動詞の三単現・過去形・過去分詞などを外し、現在477単語にしています。この単語リストをcsvに落とし込んで、S3のバケットに入れています。
23:30になったらS3にアクセスして単語をランダム選出し、DynamoDBのテーブル上に「明日の日付」と「明日の単語」を書き込みます。

2. 今日のお題を取得

ここではDBにアクセスして、単語取得するだけになります。ゲーム起動時に、「今日の日付」で検索をかけ、「今日の単語」を取り出します。

3. 英単語の妥当性を確認

このゲームでは「英単語として意味を持つ5文字」を入力しないと、単語を提出できないようになっています。この英単語妥当性チェックには「妥当な英単語リスト」を利用し、リストに存在するか否かで確認しています。単語リストはこちらのcsvを使用しました。
https://gist.github.com/dracos/dd0668f281e685bad51479e5acaadb93

このcsvの中身をDynamoDBに落としこみ、検索の効率化を目指しました。単語提出時にDBに検索をかけ、妥当性を確認します。
(ちなみにcsvからDBへの移行にはLambdaを使いました。が、最大ランタイム15分以内に終わらず、4回に分けて行いました。。もっといい方法があると思います)

作った感想

Wordle面白い

公開後も確認の意味もこめてずっと解いているのですが、やっぱり面白いですね。ここまでシンプルでいてよくこんな面白くなるなと、構築した身ながら嫉妬しました。「毎日更新」の仕組みが一番活きるのはこのゲームかもしれない。

勉強になった

かなりAWSの勉強になりました。特にLambdaやDynamoDBは初めて利用したのですが、かなりとっつきやすかったです。あと、気づきとして割とお金がかかりませんでした(月$0.5ほど)。事前に確かめてはいたんですが、ほんとにかからないんだと経験できてよかったです。

派生作れそうだ

自信がつきました。これなら派生いけそう。。4月までには作りたいところです。


以上になります!ここまで読んで下さってありがとうございました🙌

Discussion