はじめに¶
このページでは、Djangoプロジェクトをmagic-pocketでAWS Lambda上にデプロイする手順を説明します。 Admin画面がLambda上で動くところまでを目標にします。
事前準備¶
以下の3つが必要です。
Python パッケージマネージャー¶
magic-pocketはPyPIおよびGitHubからインストール可能です。 以下の例では uv を使います。他のツールを使う場合は、コマンドを適宜読み替えてください。
AWS アカウント¶
AWSアカウント が必要です。
credentialsは ~/.aws/credentials への設定を想定しています。
boto3のドキュメント を参考に設定してください。
データベース¶
以下のいずれかを選択してください。
- Neon: サーバーレス PostgreSQL。APIキーは環境変数
NEON_API_KEYで設定します。 - TiDB Serverless: MySQL 互換のサーバーレス DB。APIキーは環境変数
TIDB_PUBLIC_KEY/TIDB_PRIVATE_KEYで設定します。 - RDS Aurora PostgreSQL Serverless v2: AWS マネージド。外部アカウント不要で、
[rds]セクションと VPC 設定のみで利用できます。 - Aurora DSQL: AWS マネージドのサーバーレス PostgreSQL 互換 DB。VPC 不要、IAM 認証。Django ORM / Loco との互換性が低いため、直接 SQL 実行向けです。
このガイドでは Neon を使った手順を説明します。TiDB を使う場合は「設定ファイル - tidb」、RDS を使う場合は「設定ファイル - rds」、DSQL を使う場合は「設定ファイル - dsql」を参照してください。
1. Djangoプロジェクトの作成¶
プロジェクト名の注意
pocketをプロジェクト名に含めないでください。リソースのprefixと混同します。- 他のmagic-pocketプロジェクトと名前が被らないようにしてください。S3バケット名がコンフリクトします。
# Djangoプロジェクトを作成
uv init --python 3.12 your-project-name
cd your-project-name
uv add django
uv run django-admin startproject your_project_name .
uv run python manage.py runserver
localhost:8000 でDjangoが動くことを確認してください。
2. 依存パッケージの追加¶
# runtime ライブラリ (Lambda image にも入る)
uv add django-environ psycopg magic-pocket
# deploy CLI (`pocket` コマンド)。デプロイ時のみ必要なので dev グループ推奨
uv add --dev magic-pocket-cli
パッケージ構成
magic-pocket は Lambda runtime ライブラリ、magic-pocket-cli は
pocket コマンドを提供する deploy CLI です。CLI は Lambda image には不要です。
psycopgについて
macで開発している場合、uv add "psycopg[binary]" が必要になることがあります。
3. 初期設定の生成¶
pocket django init を実行すると、以下のファイルが自動生成されます。
pocket.toml— デプロイ設定pocket.Dockerfile— Lambda用Dockerfilesettings.py— 環境変数対応に書き換え(django-environが必要).env— ローカル開発用の環境変数
事前にgit commitしておくと安心
settings.py が上書きされるので、差分を確認しやすくなります。
.gitignore には次のエントリも追加しておきましょう (deploy のたびに
再生成される副産物の誤コミットを防ぐため。詳細は
設定ファイル - pocket runtime-config):
生成される pocket.toml¶
[general]
region = "ap-southeast-1" # (1)!
stages = ["dev", "prod"] # (2)!
[s3] # (3)!
[neon] # (4)!
project_name = "dev-your-project-name"
[awscontainer] # (5)!
dockerfile_path = "pocket.Dockerfile"
[awscontainer.handlers.wsgi] # (6)!
command = "pocket.django.lambda_handlers.wsgi_handler"
[awscontainer.handlers.management] # (7)!
command = "pocket.django.lambda_handlers.management_command_handler"
timeout = 600
[dev.awscontainer.handlers.wsgi] # (8)!
apigateway = {}
[prod.awscontainer.handlers.wsgi]
apigateway = {}
[awscontainer.secrets.managed] # (9)!
SECRET_KEY = { type = "password", options = { length = 50 } }
DJANGO_SUPERUSER_PASSWORD = { type = "password", options = { length = 16 } }
DATABASE_URL = { type = "neon_database_url" }
[awscontainer.django.storages] # (10)!
default = { store = "s3", location = "media" }
staticfiles = { store = "s3", location = "static", static = true, manifest = true }
- AWSリージョンを指定してください。Neon プロジェクトも同じリージョン(または近いリージョン)で作成してください。
- devとprodの2ステージ構成です。
- S3バケットを作成。バケット名はプロジェクト名+ステージ名から自動生成。
- 既存の Neon プロジェクトにブランチ・DB を作成。プロジェクトは事前に Neon Console で作成してください。
- Lambdaコンテナの設定。
- WSGIハンドラーのLambda関数を作成。
- マネジメントコマンド実行用のLambda関数(timeout 600秒)。
- dev/prod各環境にAPI Gatewayを設定。URLはAWSが自動生成。独自ドメインの場合は
apigateway = { domain = "example.com" }と指定。 - SECRET_KEY、スーパーユーザーパスワード、DB接続URLを自動生成しシークレットストアに保存。
- S3上の
mediaとstaticディレクトリをDjangoのSTORAGESとして利用。
生成される .env¶
settings.py への変更¶
以下のコードが追加され、環境変数とpocket.tomlから設定を読み込むようになります。
from pocket.django.runtime import set_envs
from pocket.django.utils import get_caches, get_storages
STORAGES = get_storages()
CACHES = get_caches()
environ.Env.read_env(BASE_DIR / ".env")
env = environ.Env(
SECRET_KEY=str,
DEBUG=(bool, False),
ALLOWED_HOSTS=(list, []),
)
set_envs()
SECRET_KEY = env.str("SECRET_KEY")
DEBUG = env.bool("DEBUG")
DATABASES = {"default": env.db()}
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")
4. NEON_API_KEY の設定¶
.env に NEON_API_KEY を追加します。
NEON_API_KEY はローカルのデプロイ時のみ必要
Lambda環境では不要です。デプロイ時にNeonのDB情報を取得し、Secrets Managerに保存するため、Lambda側はSecrets Manager経由で接続します。
5. デプロイ¶
dev環境¶
# デプロイ(インフラ構築 + コンテナイメージの作成・アップロード)
uv run pocket deploy --stage=dev
# Djangoの初期設定
uv run pocket django manage migrate --stage=dev
uv run pocket django manage collectstatic --noinput --stage=dev
uv run pocket django manage createsuperuser --username=admin --email=admin@example.com --noinput --stage=dev
自動生成されたシークレット(superuserのパスワード等)は以下で確認できます。
prod環境¶
同じコマンドで --stage=prod に変えるだけです。環境・シークレットは全て別になります。
uv run pocket deploy --stage=prod
uv run pocket django manage migrate --stage=prod
uv run pocket django manage collectstatic --noinput --stage=prod
uv run pocket django manage createsuperuser --username=admin --email=admin@example.com --noinput --stage=prod
デプロイ完了
API GatewayのURLにアクセスして、Django Admin画面が表示されれば成功です。
URLは pocket deploy の出力に表示されます。