サマリ

プロジェクトhojokin-db (補助金検索データベース)
公開 URLhttps://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 ファイルもそのままレンダリング可能)。

ソース: /diagrams/hojokin-db/architecture.drawio (drawio で開けば編集可能)

A. 訪問者の閲覧フロー

  1. DNS ― Squarespace で管理する iigtn.com の DNS に hojokin の CNAME を仕込み、CloudFront へ向けています。
  2. CloudFront ― TLS 終端 + 静的キャッシュ。*.iigtn.com の ACM 証明書(us-east-1)を関連付け。
  3. S3 (private) ― 静的サイトと /data/*.json を配置。Public Access Block を全 true にして、Origin Access Control 経由でしか読めない構造に。

S3 への直アクセスは構造的にできないので、誤ってバケットに上がった機密データが漏れる心配がない、というのが採用理由です。

B. 毎日 02:00 JST — クローラ & AI 整形

  1. EventBridgecron(0 17 * * ? *)(UTC 17:00 = JST 02:00)で発火し、Lambda を起動します。
  2. Lambda (Python 3.13)sources.yaml に定義した一次ソース(J-Net21 / ミラサポplus / 自治体ページ)を巡回。
  3. 取得した HTML を Amazon Bedrock (Claude Sonnet 4.6) に渡し、補助金タイトル・対象業種・地域・締切などを構造化 JSON として抽出。
  4. 結果を DynamoDBsubsidies テーブル + GSI ×3)に put_item。重複は PK で吸収。

AI 整形を Bedrock + IAM だけで完結させているので、API キー文字列をどこにも置かない運用です(OpenAI 等の外部 API を使う場合に発生するキー管理コストがゼロ)。

C. 毎日 03:00 JST — サイト再ビルド

  1. EventBridgecron(0 18 * * ? *)(UTC 18:00 = JST 03:00)で CodeBuild を起動。
  2. CodeBuild が iigtn/hojokin-db リポジトリを git clone、依存をインストール、scripts/export-data.tsDynamoDB → JSON エクスポート。
  3. next build(App Router の output: "export")で 4,500 ページ予定の SSG を生成。
  4. 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.tfsubsidies(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 fetchLambda 不要、CloudFront キャッシュで完結
データDynamoDB On-Demand + GSI ×3サーバレス、低コスト、IAM 制御
クローラLambda Python + EventBridgeiigtn-platform の IaC 流用、運用ノータッチ
AI 整形BedrockAPI キー不要、IAM だけで認可、AWS 内完結
再ビルドCodeBuild + EventBridge毎日 03:00 で DDB→JSON→S3 sync
IaCTerraform 全部aws-prod アカウント、再現性確保

運用上の工夫

  • Lambda → Bedrock の retry/backoff ― 起動直後に呼ぶとモデル warm-up でタイムアウトすることがあるため、ジッタ付き指数バックオフで 3 回までリトライ。
  • クローラの dry-run モードsources.yaml 追加時に Lambda の環境変数で DRY_RUN=true を立て、DynamoDB に書き込まずログだけ確認。
  • CodeBuild の差分 syncaws 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 の使い分け)