【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①):本番設定の最小セット(DEBUG/ALLOWED_HOSTS/静的ファイル/migrate 等)
第4回(Heroku②):Heroku Scheduler + pg_dump + S3 の日次化
第5回(運用):復旧手順・鍵ローテ・よくある事故対応
※連載回数や内容を変更することがございます。予めご了承ください。
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)では
次回に!
過去の記事
