いいねカウンタ @piyoppi/counter-tools を作りました
先日の記事 でブログにいいねできるようになった旨お知らせしましたが、このために @piyoppi/counter-tools を作りました。
せっかくつくったので、このアプリケーションについてご紹介します。
(このページは @piyoppi/counter-tools の実装の変更に伴い更新される可能性があります。)
@piyoppi/counter-tools とは?
Webページ(=URL)ごとに「いいね」を受け付けたり、現在の「いいね」の数を取得したりするアプリケーションです。
各ページに「いいね」ボタンを設置したり、カウント値を表示するカスタム要素を設置することができます。
@piyoppi/counter-tools の構成
このアプリケーションは以下の要素で構成されています。
- @piyoppi/counter-api カウント値を素得したり、カウントをインクリメントしたりするAPI
- @piyoppi/counter-button カウント値を表示したり、カウントをインクリメントするボタンを提供するカスタム要素
- actions-upload-url-whitelist-to-s3 sitemap.xmlからURLホワイトリストを生成して登録するGitHub Actions
各種サーバサイドのリソースにAWSが提供するサービスを用いています。
@piyoppi/counter-api は「カウント値の返却」「インクリメント」のエンドポイントを持っており、いずれもURLをリクエストパラメータとして受け付けます。 このURLは「現在表示中のウェブページのURL」が設定されることを期待しています。 このURLがStorage(S3)に配置されたURLホワイトリスト内に存在すれば、データベース内のカウンタをインクリメントします。
actions-upload-url-whitelist-to-s3 にサイトマップを入力することで、URLホワイトリストをGitHub ActionsのWorkflowで生成し、Storage(S3)にアップロードできます。
@piyoppi/counter-button はこれらのエンドポイントを利用してカウント値を表示したり、カウンタをインクリメントするUIを提供します。
アプリケーションの使い方
@piyoppi/counter-tools を予めクローンしておきます。
git clone git@github.com:piyoppi/counter-tools.git
@piyoppi/counter-api のデプロイ
まずは @piyoppi/counter-api をデプロイします。
このアプリケーションは Serverless Framework を用いて構成を管理しています。 serverlessコマンドをインストールします。
npm install -g serverless
また、お使いのAWSアカウントに紐づく各種リソースを作成するために、AWS CLIを使うなどして資格情報をセットアップしておきます
ここまでの準備が完了したら、@piyoppi/counter-tools のリポジトリ内の packages/counter
に移動し、パラメータを適切な値に変更したうえで以下のコマンドを実行します。
cd packages/counter
serverless deploy \
--param='sitemap=https://example.com/sitemap/sitemap-index.xml' \
--param='bucket=counter-settings' \
--param='urllist=urllist' \
--param='origin=http://localhost:3000'
各パラメータは以下のように設定します。
パラメータ | 設定する値 | 例 |
---|---|---|
sitemap | サイトマップのURL | https://example.com/sitemap/index.xml |
bucket | URLホワイトリストを 設置するS3バケット名(デプロイとともに作成される) | counter-settings |
urllist | URLホワイトリストのオブジェクト名 | urllist |
origin | 設置対象のページのオリジン | https://example.com |
デプロイが完了したら、URLホワイトリストを更新します。デプロイされたLambda Functionのうち、「updateUrlList」を呼び出します。 このLambda Functionはデプロイ時にsitemapパラメータに設定したサイトマップにアクセスし、設定したS3バケットにURLホワイトリストのオブジェクト(オブジェクト名はデプロイ時に指定したurllistパラメータの値)を配置します。
(この作業は actions-upload-url-whitelist-to-s3 を使って自動化することができます。)
aws lambda invoke --function-name counter-dev-updateUrlList out --log-type Tail --query 'LogResult' --output text | base64 -d
作業が完了したら、以下のようなコマンドでインクリメントできるようになります。urlパラメータに指定するURLは、URLホワイトリストに含まれている必要があります。
curl -X POST \
-H'content-type: application/json' \
-d'{"url": "https://example.com/weblog/"}' \
https://xxxxxxx.execute-api.xxxxx.amazonaws.com/count