hojokin-db — 補助金検索データベース
hojokin.iigtn.com がどう動いているかをモジュール単位で解説するページです。
AWS のフル解説ではなく、「個人で AWS サーバレス + IaC + 自動更新 + AI 整形まで運用している」事実が伝わる粒度に絞っています。
サマリ
| プロジェクト | hojokin-db (補助金検索データベース) |
|---|---|
| 公開 URL | https://hojokin.iigtn.com/ |
| 公開日 | 2026-04-26 (Live) |
| 用途 | 業種 × 地域 × 種別で絞り込める日本の補助金 / 助成金検索 (SEO ロングテール 4,500 ページ予定) |
| 運用コスト | 5,500 〜 10,500 円 / 月(補助金件数の伸びに応じて) |
| 構成 | Next.js 16 + S3 + CloudFront + DynamoDB + Lambda + Bedrock + CodeBuild + Terraform |
| 運用形態 | 毎日 02:00 にクローラ、03:00 に再ビルドの 2 段自動運転(ノータッチ) |
全体アーキテクチャ
構成図は drawio (AWS 公式アイコン) で作成しています。下に同等の図解を埋め込んでいます(GitHub 上の .drawio ファイルもそのままレンダリング可能)。
A. 訪問者の閲覧フロー
- DNS ― Squarespace で管理する
iigtn.comの DNS にhojokinの CNAME を仕込み、CloudFront へ向けています。 - CloudFront ― TLS 終端 + 静的キャッシュ。
*.iigtn.comの ACM 証明書(us-east-1)を関連付け。 - S3 (private) ― 静的サイトと
/data/*.jsonを配置。Public Access Block を全 true にして、Origin Access Control 経由でしか読めない構造に。
S3 への直アクセスは構造的にできないので、誤ってバケットに上がった機密データが漏れる心配がない、というのが採用理由です。
B. 毎日 02:00 JST — クローラ & AI 整形
- EventBridge が
cron(0 17 * * ? *)(UTC 17:00 = JST 02:00)で発火し、Lambda を起動します。 - Lambda (Python 3.13) が
sources.yamlに定義した一次ソース(J-Net21 / ミラサポplus / 自治体ページ)を巡回。 - 取得した HTML を Amazon Bedrock (Claude Sonnet 4.6) に渡し、補助金タイトル・対象業種・地域・締切などを構造化 JSON として抽出。
- 結果を DynamoDB(
subsidiesテーブル + GSI ×3)にput_item。重複は PK で吸収。
AI 整形を Bedrock + IAM だけで完結させているので、API キー文字列をどこにも置かない運用です(OpenAI 等の外部 API を使う場合に発生するキー管理コストがゼロ)。
C. 毎日 03:00 JST — サイト再ビルド
- EventBridge が
cron(0 18 * * ? *)(UTC 18:00 = JST 03:00)で CodeBuild を起動。 - CodeBuild が
iigtn/hojokin-dbリポジトリをgit clone、依存をインストール、scripts/export-data.tsで DynamoDB → JSON エクスポート。 next build(App Router のoutput: "export")で 4,500 ページ予定の SSG を生成。aws s3 syncで S3 に同期 → CloudFront を invalidate。
SSG(静的サイト生成)にしているため、訪問者リクエストごとに DB を引かない設計です。 CloudFront のキャッシュだけで応答が返るので、月数百円のコストで配信できます。
D. IaC — Terraform で 25 リソース全部
infra/ 配下に Terraform を集約し、aws-prod アカウント(XXXXXXXXXXXX)に 25 リソースを apply しています。
acm.tf— *.iigtn.com 用の ACM 証明書(us-east-1、検証 CNAME は Squarespace で手動投入)s3_cloudfront.tf— S3 + Public Access Block + Versioning + OAC + CloudFront Distribution + Function(末尾 / の URI 書換)dynamodb.tf—subsidies(GSI ×3)+seo-keywordsテーブルlambda_crawler.tf— Lambda 関数 + 専用 Role + EventBridge ルール(02:00 JST)codebuild.tf— CodeBuild プロジェクト + EventBridge ルール(03:00 JST)+ buildspec.yml
state は S3 backend + DynamoDB Lock で管理。terraform apply 1 発で全部立ち上がります。
採用判断のポイント
| 項目 | 採用 | 理由 |
|---|---|---|
| ホスティング | S3 + CloudFront 静的配信 | iigtn.com と同パターンで運用統一、月数百円、SEO 強い |
| フロント | Next.js 16 (static export) | 4,500 ロングテール SSG、ビルド時に DDB から JSON にして埋め込み |
| 検索 UI | クライアント JSON fetch | Lambda 不要、CloudFront キャッシュで完結 |
| データ | DynamoDB On-Demand + GSI ×3 | サーバレス、低コスト、IAM 制御 |
| クローラ | Lambda Python + EventBridge | iigtn-platform の IaC 流用、運用ノータッチ |
| AI 整形 | Bedrock | API キー不要、IAM だけで認可、AWS 内完結 |
| 再ビルド | CodeBuild + EventBridge | 毎日 03:00 で DDB→JSON→S3 sync |
| IaC | Terraform 全部 | aws-prod アカウント、再現性確保 |
運用上の工夫
- Lambda → Bedrock の retry/backoff ― 起動直後に呼ぶとモデル warm-up でタイムアウトすることがあるため、ジッタ付き指数バックオフで 3 回までリトライ。
- クローラの dry-run モード ―
sources.yaml追加時に Lambda の環境変数でDRY_RUN=trueを立て、DynamoDB に書き込まずログだけ確認。 - CodeBuild の差分 sync ―
aws s3 sync --deleteで 4,500 ページの差分のみアップロード、CloudFront/*invalidation は build 末尾で。 - コスト監視 ― AWS Budgets を
iigtn-platform側に集約し、月次予算超過で SNS Email 通知。
これからやる予定
- 補助金件数を 12 件 → 1,000 件に拡大(クローラ / sources.yaml の充実)
- 診断ツール(5 問→該当補助金)の追加
- sitemap.xml 生成 + Search Console 登録 + ロングテール記事化
- Bedrock のレート制限・コスト最適化(Sonnet → Haiku の使い分け)