メインコンテンツまでスキップ

「Web」タグの記事が4件件あります

全てのタグを見る

AWS サーバーレスでブログのコメント API を自作した

· 約3分
ひかり
Main bloger

このブログにコメント機能を追加したくなり、AWS サーバーレスで API を自作しました。その設計と実装について紹介します。

構成

リクエストは以下の流れで処理されます。

ブラウザ (www.hikari-dev.com)
↓ HTTPS
API Gateway
├── GET /comment?postId=... → コメント取得
├── POST /comment → コメント投稿
└── PATCH /comment/{id} → 管理(非表示切り替え)

Lambda (Node.js 20 / arm64)

DynamoDB(コメント保存)
+ SES v2(管理者へのメール通知)

コードは TypeScript で書き、SAM(Serverless Application Model)で IaC 管理しています。Lambda は arm64(Graviton2)にして少しコストを抑えています。

DynamoDB のテーブル設計

テーブル名は blog-comments、パーティションキーは postId、ソートキーは commentId です。

キー説明
postIdString記事の識別子(例: /blog/2026/03/20/hime
commentIdStringULID(時系列ソート可能な ID)

ソートキーに ULID を使っているので、QueryCommand で取得したコメントは投稿順に自動的に並びます。UUID にしなかったのはこの理由です。

スパムフィルタリング

コメントを DynamoDB に書き込む前に、keywords.json に定義したキーワードと照合します。

キーワードにヒットした場合は isHidden: true で自動非表示にし、isFlagged: "1" を付与します。ヒットしなければ即時公開です。

isFlagged は Sparse GSI のキーとして使っています。ヒットしないコメントにはこの属性を持たせないため、GSI に余計なパーティションが増えず、コストと効率の両面で有利です。DynamoDB Document Client の removeUndefinedValues: true を設定するだけで実現できます。

管理者へのメール通知

コメントが投稿されるたびに SES v2 で自分宛にメールが届きます。本文には投稿者名、本文、評価、IP アドレス、フラグ状態が含まれます。

メール送信は非同期で行い、失敗しても握りつぶします。コメント投稿のレスポンス速度に影響しないようにするためです。

プライバシーへの配慮

DynamoDB には IP アドレスや User-Agent も保存しますが、GET エンドポイントのレスポンスには含めません。型定義レベルで分離しています。

セキュリティ

対策
ネットワークAWS WAF で 100 req / 5 分 / IP のレート制限
CORShttps://www.hikari-dev.com のみ許可
管理 APIAPI Gateway の API キー認証(X-Api-Key ヘッダー)
スパムキーワードフィルタで自動非表示

管理エンドポイント(PATCH /comment/{id})は SAM テンプレートで ApiKeyRequired: true を設定するだけで API キー認証が有効になります。Lambda Authorizer を自前で実装する必要がなく、シンプルです。

まとめ

サーバーレス構成なのでサーバー管理も不要で、DynamoDB のオンデマンド課金により低トラフィックな個人ブログでもコストを最小限に抑えられています。

コードは SAM + TypeScript + esbuild でまとめており、sam build && sam deploy だけでデプロイできます。

マイナンバーカード (マイナカード) 何に使った?

· 約6分
ひかり
Main bloger

平成 30 年に取得したマイナカード、 何に使ってどう便利だったかをまとめる。 不便なところもまとめる。

利用したこと

  1. コンビニで証明書印刷
    • 住民票の写し
    • 所得証明書

わざわざ、市役所 (出張所) に出向き、並ぶ必要がないので便利。

  1. 本人確認
    • スマホの通信契約
    • 証券会社の口座開設
    • 銀行の口座開設
    • なんとか Pay の本人確認
    • コロナワクチンの受付時の本人確認

今後はマイナンバーカードがないと本人確認は厳しいかも。 社会も性善説では通用しなくなってきてるし、仕方ないかも。 運転することはないのに、身分証明のために運転免許証を取るといったことはしなくていいのでそこは良い。多分、2割くらいはいそう。

  1. 確定申告

フォームに数値を打ち込んで送信するだけだった。医療費控除の計算もできるし、便利。

  1. 保険証利用

保険証を持ち歩かなくて済むのはいいが、 資格確認システムのバグで利用できなくて困ることが何回かあったので、念のため保険証を持ち歩くのがよさそう。 薬局で処方された医薬品情報がマイナポータルで確認できるのが便利。(薬のアレルギー持ちの人は特に) マイナカードを利用せず、保険証で利用したところは、 医療費の計算をしてくれるのかな?そこはちょっとわからない。

  1. 転出届

3月末の混む時期に市役所 (出張所) に行って、転出届を出すのは気が滅入るが、マイナポータルを利用し転出届がオンラインで出せる。 注意しなければならないことは、転入届を忘れないこと。 (ちなみに、市役所・区役所行くより、出張所のほうが混んでないのでおすすめ。) 転入時にマイナンバーの暗証番号も再設定しなければいけないのが面倒だった。

  1. スマホ電子証明書

スマホにマイナンバーの電子証明書を搭載できる。 マイナポータルにカードレスでログインできるので便利かも。

不満なところ

  1. スマホアプリの NFC スマホに電子証明書を搭載しているのに、毎回 NFC を要求される。NFC を有効にしておかなければアプリが開かないのは不便なので、改善を期待したい。

  2. マイナンバーが記載されている マイナンバーカードにマイナンバーを記載することで、 紛失したときのリスクがある。とはいっても悪用は考えづらいが。クレジットカードのようにナンバーレスにしてほしい。

  3. 写真がモノクロ マイナンバーカードに内蔵されている写真はモノクロ。 なぜカラーにしなかった。

  4. 更新が面倒 電子証明書のセキュリティの関係で更新が 5 年だとか。 しかし、有効期間は 10 年間。 おいおい。 改善されるとかされないとからしいが。

  5. カードが使えない病院 国から補助金がいくらか出ているそうなので、対応してほしい。

  6. 暗証番号の種類が多い 暗証番号の種類が 4 種類もある。1 種類にしてほしいが、 セキュリティ的に難しいのだろうか。わからん。

  7. 券面がダサい 無線従事者の免状を見習ってほしい。

多分、勘違いされていること

マイナカードの的外れな批判が多いのでまとめていく。 批判する前に、仕組みを理解してほしい。

  1. マイナカードから紐づけされた個人情報が抜かれる これは、一部正しい。 マイナカードそのものには住所、氏名、性別、生年月日などの基本的な個人情報しか存在しない。運転免許証よりも情報は少ないだろう。 マイナカードと紐づけされた情報を見るには、その紐づけされたサイトを開き、マイナカードから認証する必要がある。 紐づけされた情報はマイナカードと暗証番号がないとみられないわけだ。もちろん、カードに暗証番号を書いて、そのカードをなくしたりしたら、様々な個人情報が抜かれる可能性はある。この点はキャッシュカードと似てる。

  2. 暗証番号が 4 桁しかなく、セキュリティが甘い セキュリティが甘いのは誤り。 パソコンで SNS へのログインを考えてみると、ID とパスワードでログインできる。 SNS では ID は簡単にわかるので、パスワードがあればログインができる。いくらパスワードが複雑だろうと、一要素認証なわけだ。 一方マイナンバーカードは、カードの所持+暗証番号の知識という二要素認証となっている。 Windows などで、PIN コードでログインできるようになっているのも、複雑なパスワードを用いた一要素認証よりも、所持+記憶の二要素認証のほうがセキュリティが高いと言われているからだ。

  3. 保険証の紐づけの誤り これは、保険組合の紐づけミス、ヒューマンエラーである。 マイナカードはあくまでも個人認証する仕組みしかなく、マイナカードの問題ではない。 しかし、保険組合で紐づけるミスをどうにかしろというのはある。 保険証情報はマイナポータルで確認できるので、一度確認したほうが望ましい。

  4. マイナカードなしで窓口 10 割負担なんてとんでもない 従来と同様、保険組合で手続きすることで返金を受けられる。 とはいっても資格証明書という本末転倒な仕組みを導入するそうだが。

Firefox のビルドをインストール

· 約1分
ひかり
Main bloger

Ubuntu 22.04 は snap 版の Firefox がインストールされているらしく、 環境によって起動ができなかったので、ビルド済み Firefox のインストールの方法をメモ。

apt / snap 版の Firefox のアンインストール

sudo apt purge firefox
sudo snap remove firefox

Firefox のビルドをインストール

# ダウンロード
wget "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=ja" --trust-server-names

# 展開
tar xvf firefox-*.tar.bz2

# 配置
sudo cp -r firefox /usr/lib

# 実行ファイルのシンボリックリンクを作成
sudo ln -s /usr/lib/firefox/firefox /usr/bin/firefox

# デスクトップファイルをダウンロードし配置
sudo mkdir -p /usr/share/applications
sudo wget https://bit.ly/3Mwigwx -O /usr/share/applications/firefox.desktop

アイコン (.ico) の作り方

· 約1分
ひかり
Main bloger
  1. アイコンを作成します。

    icon の作り方

  2. 1624324864128256 の7種類の大きさの PNG 画像を用意します。 icon の作り方

  3. convert アイコンでアイコンを作成します。 icon の作り方

convert *.png favicon.ico