取りあえず何か創る

ソフトウェアエンジニアだけど仕事以外でも何か作りたくなったので、主にその記録のためにブログを開設しました。

図書館APIで新刊の入荷をいち早く知る(AWS CDKで実装)

0. 簡単なまとめ

  • 図書館に自分が読みたい新刊が入荷された時に通知するシステムをAWSに実装。
  • コードは下記のリンク参照。AWSのCDKを使ったのでコードを動かすだけで簡単に同じ環境を準備できるはず。

    github.com

     

1. やりたいこと

  • 図書館に自分が読みたい新刊が入荷されたことをいち早く知り予約することで、待たずに新刊を読めるようになりたい。
  • 定期的に自動で入荷状況を調べる必要がある。金を使わないために図書館を使っているので、当然このシステムを稼働させるのに金を使いたくない。

2. 実現方法

Lambda
Lambda
Amazon API...
Amazon
DynamoDB
Amazon...
Amazon EventBridge
Amazon EventB...
Lambda
Lambda
メール通知本や図書館の編集定期実行図書館API
Viewer does not support full SVG 1.1

3. 仕様と実装

  • コードは下記リンクに置いてます。今回はAWS  CDKなる、コードでAWSのリソースの準備を行えるツールを使って実装しました。いわゆるInfrastructure as Codeというやつですね。言語はPython3です。

    GitHub - tsubasawb/LibraryAlert

  • 主要コンポーネントの役割
    • 図書館API
      • 本のISBNと図書館のIDを渡すと本の貸し出し状況を返す。
    • API Gateway
      • 以下のAPIを用意している。
        機能
        エンドポイント
        HTTPメソッド
        全ステータス取得
        /
        GET
        本を新規追加
        /books
        POST
        図書館を新規追加
        /libraries
        POST
        本の削除
        /books/<isbn>
        DELETE
        図書館の削除
        /libraries/<id>
        DELETE
      • いちいちAPIを叩くのは面倒なので、Vue.3を利用してwebページ経由でAPIを叩くようにした。どうせ自分しか使わないので、index.htmlはローカルに置いてある。
    • EventBridge
      • Lambdaを定期的に実行するトリガーを出力する。今回は1時間に1回実行するよう設定した。
    • Lambda
      • API: APIの数だけLambda Functionを用意している。API Gatewayからのリクエストをトリガーに動作して、DynamoDBの操作を行う。
      • 定期実行: メインの関数。DBに登録されている図書館と本の全ペアの入荷状況を図書館APIで調べ、アップデートがある場合はDBを更新してメールで通知する。
    • DynamoDB
      • 監視対象の図書館、本とそれらの入荷状況を持つ。図書館APIでは貸し出し状況は細かく分類されているが、今回は本が入荷されているかどうかだけを考慮した。
  •  その他のコンポーネント
    • Lambdaがメールアドレスやアプリケーションキーのような機密情報にアクセスする必要がある。コードに埋め込みたくないので、SSMのParameter Storeを利用した。
    • Lambdaの定期実行で異常が発生していないかウォッチするためにCloudWatch Logsを利用。Lambda実行時のエラーを検知して、Amazon SNSで登録しておいたメールアドレスに通知する。
    • デフォルトの設定ではURLを知っていたら誰でもAPIにアクセスできてしまうので、API使用量とAPIキーを使ってアクセスを制限する。

4. 使い方

  • 環境構築
    • AWSの登録など
      • AWSアカウント取得、シークレットキー作成、CDKのインストールが必要です。このページが参考になります。

        コードで学ぶAWS入門

    • googleのアプリパスワード設定
    • 図書館APIアプリケーションキー登録
    • 環境変数の設定
      • cloneしたディレクトリ内に.envファイルを作成し、下記の通りgmailアドレス、googleアプリパスワード、図書館APIアプリケーションキーを設定してください。
      • EMAIL = "your mail address@gmail.com"
        GOOGLE_PASS = "your password"
        APP_KEY = "your application key"
        
    • cdk deployの実行
      • python3 -m pip install -r requirements.txtで必要なモジュールをインストールして、cdk deployを実行するとAWSのサービスが立ち上がります。
      • 環境を削除したい場合はcdk destroyを実行してください。
    • エンドポイントとAPIキーの登録
      • cdk deployが完了後にLibraryAlert.LibraryAlertApiEndpointXXX = https://XXXX.amazonaws.com/prod/という表示がコンソールに現れます。このURLがエンドポイントです。
      • APIキーはAmazon API GatewayGUI上で確認します。作成されたAPI(LibraryAlertApi)の下記の場所でAPIキーを表示できます。

      • gui/config.jsというファイルを作成して、以下のようにエンドポイントとAPIキーを記載します。*1
        const config = {
            endpoint: "your endpoint URL",
            apikey: "your API key",
        }
  • 図書館と本の登録
    • index.htmlをブラウザで開き、まずは図書館の登録をします。図書館のIDはカーリルの図書館マップで利用したい図書館のページから取得します。このIDは市町村内の図書館で共通なようなので、例えば"Tokyo_Machida"を指定すると町田の市立図書館全ての状況をチェックします。

      このIDをページ右上のフォームに書き、"図書館の追加"ボタンを押して更新をすると、下の表に追加した図書館が表示されます。

    • 次に本の登録をします。読みたい本のISBN-10を左上のフォームに書き、"本の追加"ボタンを押して更新すると、下の表に追加した本が表示されます。ISBN-10はamazonで確認できます。*2

    • 以降は登録した図書館と本の組み合わせ全てが表に追加されて監視対象になります。図書館や本を削除したい場合は、図書館IDやISBNをそれぞれのフォームに入れて削除ボタンを押してページを更新してください。
    • 1時間毎に起動するLambda functionで入荷状況が調べられます。もし新しく入荷があった場合は、「新刊入荷情報」というタイトルのメールが届きます。メール内容に図書館の予約ページへのリンクがあります。

5. 参考

*1:これも.envに定義した方がいいんだろうけど、インストールするものが増えるのが嫌なのでjsファイル内に定義した。

*2:ISBNに貼られているリンクはカーリルのページ。貸し出し状況を表示する場合はカーリルへのリンクを貼らなければいけないらしいので。