0. 簡単なまとめ
1. やりたいこと
- 図書館に自分が読みたい新刊が入荷されたことをいち早く知り予約することで、待たずに新刊を読めるようになりたい。
- 定期的に自動で入荷状況を調べる必要がある。金を使わないために図書館を使っているので、当然このシステムを稼働させるのに金を使いたくない。
2. 実現方法
- 無料のレンタルサーバーは色々あるようだが、今回は勉強のためにAWSを使った。大体の構成は下の図の通り。自分しか使わないシステムなので、ほぼほぼ無料で動かせるはず。
- 図書館の入荷状況を調べるために図書館のwebサイトをクローリングすると逮捕されるかもしれないので、株式会社カーリルが提供する図書館APIを使わせてもらった。
3. 仕様と実装
- コードは下記リンクに置いてます。今回はAWS CDKなる、コードでAWSのリソースの準備を行えるツールを使って実装しました。いわゆるInfrastructure as Codeというやつですね。言語はPython3です。
- 主要コンポーネントの役割
- その他のコンポーネント
- Lambdaがメールアドレスやアプリケーションキーのような機密情報にアクセスする必要がある。コードに埋め込みたくないので、SSMのParameter Storeを利用した。
- Lambdaの定期実行で異常が発生していないかウォッチするためにCloudWatch Logsを利用。Lambda実行時のエラーを検知して、Amazon SNSで登録しておいたメールアドレスに通知する。
- デフォルトの設定ではURLを知っていたら誰でもAPIにアクセスできてしまうので、API使用量とAPIキーを使ってアクセスを制限する。
4. 使い方
- 環境構築
- AWSの登録など
- AWSアカウント取得、シークレットキー作成、CDKのインストールが必要です。このページが参考になります。
- googleのアプリパスワード設定
- Lambdaからgmailを送信するのにアプリパスワードが必要なので作成してください。
- 図書館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 GatewayのGUI上で確認します。作成されたAPI(LibraryAlertApi)の下記の場所でAPIキーを表示できます。
- gui/config.jsというファイルを作成して、以下のようにエンドポイントとAPIキーを記載します。*1
const config = {
endpoint: "your endpoint URL",
apikey: "your API key",
}
- cdk deployが完了後に
- AWSの登録など
- 図書館と本の登録
- index.htmlをブラウザで開き、まずは図書館の登録をします。図書館のIDはカーリルの図書館マップで利用したい図書館のページから取得します。このIDは市町村内の図書館で共通なようなので、例えば"Tokyo_Machida"を指定すると町田の市立図書館全ての状況をチェックします。
このIDをページ右上のフォームに書き、"図書館の追加"ボタンを押して更新をすると、下の表に追加した図書館が表示されます。
- 次に本の登録をします。読みたい本のISBN-10を左上のフォームに書き、"本の追加"ボタンを押して更新すると、下の表に追加した本が表示されます。ISBN-10はamazonで確認できます。*2
- 以降は登録した図書館と本の組み合わせ全てが表に追加されて監視対象になります。図書館や本を削除したい場合は、図書館IDやISBNをそれぞれのフォームに入れて削除ボタンを押してページを更新してください。
- 1時間毎に起動するLambda functionで入荷状況が調べられます。もし新しく入荷があった場合は、「新刊入荷情報」というタイトルのメールが届きます。メール内容に図書館の予約ページへのリンクがあります。
- index.htmlをブラウザで開き、まずは図書館の登録をします。図書館のIDはカーリルの図書館マップで利用したい図書館のページから取得します。このIDは市町村内の図書館で共通なようなので、例えば"Tokyo_Machida"を指定すると町田の市立図書館全ての状況をチェックします。
5. 参考
- コードで学ぶAWS入門: CDKを使ってサーバレスなアーキを構築する際に多いに参考にさせてもらいました。これでCDKの大枠を掴んで、あとはCDKの公式リファレンスで使いたい機能を探せば大体何とかなりそう。
↓書籍化しているので広告貼っておきます。
-
vue.jsを使ってaxiosを学ぶ | アールエフェクト: フロントエンドの知識がほとんどないので、Vue3を使ってAPIを呼ぶために参考にさせてもらいました。
-
無料で読みたい!図書館APIで新書が図書館に登録されたタイミングでLINE通知する(その1) - Qiita: 同じことをGASで実現している人がいた。どう見てもこっちの方が簡単。GASは軽い処理を自動実行するならLambdaよりも楽そうなので、別の機会に使ってみたい。