見出し画像

【IT】個人開発DjangoをHerokuで本番運用へ(序章:設計思想・全体像・前提・命名・運用ポリシー)

皆さま、こんにちは

今回から、DjangoアプリケーションをHerokuで本番運用に向けて設定を行なっていきます。



0. はじめに(この連載で“できるようになること”)

本連載は、Heroku で稼働中の Django アプリを、最小コスト×最小権限×シンプル運用で本番化し、
毎日、自動でDBバックアップがS3へ保存され、いつでも復旧できる状態をつくるガイドです。

  • やらないこと:過剰な監視・複雑なワークフロー・常時稼働の専用バッチ群

  • やること

    • S3 バケットの正しい初期設計(暗号化・公開ブロック・ライフサイクル)

    • Put専用の 最小権限 IAM を用意して Heroku→S3 の疎通を確実化

    • Heroku Scheduler で `pg_dump` → S3 を日次化(UTC/JSTの落とし穴回避)

    • 復旧手順を手順書化し、鍵ローテよくある事故対応まで運用面を固める

目的は “低ストレス運用”。毎日のバックアップが当たり前に通り、
何かあっても 1~2時間で戻せる(RTO)/前日分まで戻れば許容(RPO=24h) を実現します。


1. 想定読者

  • Heroku で Django を動かしており、安定運用とバックアップを今すぐ整えたい方

  • AWS は基本操作OK(S3/IAM程度)だが、最小権限や運用設計は迷いやすい方

  • 高度なIaCやKMSは後回しでよく、とにかく今日動く現実解が欲しい方


2. 全体構成(本連載のロードマップ)

※連載回数や内容を変更することがございます。予めご了承ください。


3. 設計思想(最小コスト × シンプル運用 × 事故に強い)

  • 最小コスト:Heroku(本体+Scheduler)+AWS(S3+IAM、必要ならLambdaのみ)

  • シンプル:毎日1本のジョブで`pg_dump→S3`。複雑な依存を作らない

  • 事故に強い:RPO/RTOを明文化。日次バックアップの「復元リハーサル」を定例化

  • 最小権限:Heroku 側は s3:PutObject のみ(取得・削除は不可)

  • 段階導入:削除系はまず DRY_RUN でログ確認 → 本番エイリアス切替


4. 前提・用語・命名(本連載で固定するもの)

リージョン:`ap-northeast-1`(東京)
S3バケットの例:`her-db-backup-appsession-1942`(世界で一意)
プレフィックス:`heroku/appsession/`(内部的“フォルダ”)
暗号化:既定の SSE-S3(AES256)。KMS は必要になってから
Heroku Config Vars(例)

APP_ENV=prod
DEBUG=false
ALLOWED_HOSTS=<your-domain>
AWS_DEFAULT_REGION=ap-northeast-1
S3_BUCKET=her-db-backup-appsession-1942
S3_PREFIX=heroku/appsession/
S3_SSE=AES256        # 既定暗号化を明示する場合(なくてもOK)
# S3_KMS_KEY_ID=...  # KMS使う時だけ設定(今回は使わない想定)
AWS_ACCESS_KEY_ID=...            # Put専用ユーザ
AWS_SECRET_ACCESS_KEY=...

注意:`S3_KMS_KEY_ID` を設定しているのに KMS の権限が無いと アップロード失敗します。
KMS を使わないなら 未設定のままでOK(SSE-S3で暗号化されます)。


5. バックアップ運用ポリシー(例)

  • RPO:24時間(=日次)/ RTO:1~2時間

  • 保持:`daily` は 7日、`monthly` は 12ヶ月(必要なら追加)

  • ライフサイクル:S3 で自動削除。端数は Lambda “落穂拾い”で週1整理(DRY_RUN→本番)


6. コストとタイムゾーンの注意

  • Heroku Scheduler・Dyno 実行時間は料金に影響し得ます(※最新の料金体系を都度確認)。

  • UTC/JST:Heroku・AWS内部は 基本UTCファイル名にUTCを入れて混乱を避けます。


7. 完成像(テキスト図)

Heroku(Django)
  ├─ Heroku Postgres
  └─ Heroku Scheduler (daily, UTC)
       └─ pg_dump → /tmp/*.dump → S3 s3://<bucket>/heroku/<app>/
                       ├─ daily-YYYYMMDD-HHMMSS.dump
                       └─ adhoc/healthcheck-*.txt

AWS
  ├─ S3: バージョニング任意/公開ブロックON/SSE-S3
  ├─ IAM: Heroku用 Put専用ユーザ(Prefix限定)
  └─ (任意)Lambda: 古い不要オブジェクト削除(DRY_RUN→prod)

では
次回に!


過去の記事


いいなと思ったら応援しよう!