Changelog¶
全ての重要な変更はこのファイルに記録されます。
書き方はKeep a Changelogに基づきます。
バージョンはSemantic Versioningに従います。
0.6.0 - 2026-06-28¶
Features¶
- DB / KVS の provisioning を deploy から分離できるようにしました。
[neon]/[tidb]/[upstash]にprovisioning = "command"を指定すると、deploy は当該リソースに一切触れません (管理 API call ゼロ / credential 不要)。provisioning は新コマンドpocket resource <neon|tidb|upstash> store-url --stage <stage>に分離し、 branch/cluster/role/db (Upstash は database) を ensure して接続 URL を stored user secret ([awscontainer.secrets.user]のtype)の正準名へ保存します。これにより「provisioning は 管理 API key を持つ host / 特権 CI」「deploy は credential なし」という custody 分離が 素直に成立します(既定は従来どおりprovisioning = "deploy")。 - user secret の
typeにupstash_redis_urlを追加しました(neon_database_url/tidb_database_urlと同様の stored mode)。 store-urlは既存 secret があると no-op で、--forceで上書きします。複数候補があるときは--keyで対象を指定します。- TiDB の注意: TiDB Serverless は password の reveal API が無いため、
tidb store-urlは 実行のたびに root password をローテーションします(Neon / Upstash は冪等)。実行後は consumer の再デプロイが前提です。
Changed / Deprecated¶
- DB / KVS 接続 URL の computed mode(
[awscontainer.secrets.managed]に{ type = "neon_database_url" / "tidb_database_url" / "upstash_redis_url" })を deprecated にしました。deploy 時に warning を出します。[<db>] provisioning+ stored user secret([awscontainer.secrets.user]のtype)へ移行してください。computed とprovisioning = "deploy"は「deploy が ensure し URL を供給する」点で挙動が同じで、差分は 保存先のみ(computed = managed pocket_store、stored = user secret 名)です。
Removed¶
[neon]/[tidb]/[upstash]のskip_check_existingを削除しました (provisioning = "command"へ置換)。残っていると deploy 前に fail-fast で移行を案内します。- 実行時フラグ
--skip-check-existingを削除しました(pocket deploy/pocket promote/pocket django deploy/pocket django promote)。credential-less deploy は[<db>] provisioning = "command"に一本化されました。 - 移行手順:
[<db>] skip_check_existing = trueを[<db>] provisioning = "command"に置換し、 接続 URL を[awscontainer.secrets.user]のtypeで宣言、deploy 前にpocket resource <db> store-url --stage <stage>を一度実行してください。
0.5.0 - 2026-06-28¶
Features¶
[neon]で使用するブランチを選択できるようにしました。これまで Neon のbranch_nameは stage 名にハードコードされていましたが、branch_nameを省略すると project の default ブランチ (通常main) を使うようになり、stage = ブランチ名の 暗黙の結合を解消しました。[<stage>.neon]で per-stage に上書きでき、{stage}/{project}/{namespace}を展開できるので、環境ごとに別ブランチを払い出す 使い方もできます。あわせてparent_branch_nameを追加し、ブランチを新規作成する際の 親ブランチを指定できます (省略時は Neon の default ブランチから分岐する従来挙動)。 既存の stage 名ブランチ運用はbranch_name = "<stage>"を明示すれば維持できます。
0.4.0 - 2026-06-22¶
Features¶
- DB 接続 URL の stored mode を追加しました。
[awscontainer.secrets.user]にDATABASE_URL = { type = "tidb_database_url" }/{ type = "neon_database_url" }と 書くと、deploy 時に provider の管理 API を叩いて URL を計算する computed mode (secrets.managed) の代わりに、事前 provision して secret store に保存済みの接続 URL を 参照するだけになります。deploy 環境に cluster を作成・削除できる管理 API key を持ち込まず に済み (least privilege)、deploy が外部 API に依存しません。type指定時は pocket が secret 名を自動導出し、未 provision のまま deploy すると正準名を示して deploy 時にエラーで 止めます (runtime まで遅延しません)。nameとtypeは排他です。RDS は元々管理 API key 非依存かつパスワードローテーション追従のため対象外です。
0.3.0 - 2026-06-16¶
Features¶
[cloudfront.<name>].enable_origin_verifyを追加しました。CloudFront 配下の origin (lambda / API Gateway) に対し、(1) origin 直叩き防止の secret custom header (X-Pocket-Origin-Verify) を CloudFront → origin に付与しつつ同値を Lambda runtime env に注入、(2) 詐称耐性のある client IP (CloudFront が TCP から取得するevent.viewer.ip) をX-Pocket-Viewer-Ipheader で origin に転送、(3) 検証 +REMOTE_ADDR正規化を行う Django middleware (pocket.django.origin_verify.OriginVerifyMiddleware) の同梱、を一括で有効化します。 secret は managed secret (type = "origin_verify_secret") として自動生成・管理され、 利用者は flag を立てて middleware を最前段に置くだけで済みます。 viewer IP 転送自体は flag 非依存で lambda route に常時入ります (キャッシュ無影響・ 純加算のため。origin request policy はAllViewerExceptHostHeaderのまま据え置き、 CloudFront Function 経由で付与するので API GW の Host 整合性も壊しません)。
0.2.2 - 2026-06-15¶
Bug Fixes¶
versioning = "deploy_hash"構成で 2 回目以降の deploy 時に Lambda の環境変数DEPLOY_HASHが旧値に固着し、Django が古い hash の static URL を生成して CloudFront 側 (毎 deploy 追従) と乖離 → 静的アセットが全滅 (403) する不具合を 修正しました。pocketの Lambda 更新はupdate_function_code(コードのみ) で Environment を更新せず、env は CFnstack.update()経由でしか書き換わらないため、 stack 更新がyaml_synced/wait_statustimeout 等でスキップされると env が 古いまま残るのが原因でした。deploy フロー末尾の post-deploy hook (AwsContainer.ensure_post_deploy_state) で、CloudFront の KVS 書き込みと同じ philosophy により Lambda env のDEPLOY_HASHを side-channel で冪等に同期する ようにしています (既存 env / secret は保持)。
Security¶
- Rust crate (
magic-pocket-rs) の依存ツリーから legacy TLS スタック (rustls 0.21 / hyper 0.14 系) を除去しました。aws-sdk-*の default featurerustlsを無効化し、既定の HTTP client (rustls 0.23 + aws-lc) のみを使用します。 動作は変わりません。git 依存で利用している場合はcargo update magic-pocket-rsで取り込めます。
0.2.1 - 2026-06-10¶
Bug Fixes¶
pocket versionが古いバージョン (0.1.1) を表示する問題を修正しました。__version__を手書き定数からパッケージメタデータ由来に変更し、 pyproject.toml との二重管理を廃止しています (同期の回帰テスト付き)。
0.2.0 - 2026-06-10¶
0.1.1 以降の全面的な機能拡張リリースです。runtime ライブラリ (magic-pocket) と
deploy CLI (magic-pocket-cli) の 2 パッケージ構成になりました。
Breaking Changes¶
- パッケージを 2 分割しました。 deploy CLI (
pocketコマンド) は新パッケージmagic-pocket-cliに移動し、magic-pocketは Lambda runtime ライブラリのみに なりました。デプロイ環境にはmagic-pocket-cliを、Lambda image には従来どおりmagic-pocketをインストールしてください。 - AWS リソース系コマンドを
resourcegroup 配下へ再配置しました。 旧トップレベル コマンドpocket awscontainer/neon/tidb/dsql/rds/s3/vpc/cloudfront等は廃止され、pocket resource awscontainer ...のようにresourceを 挟む新 path になりました(旧 path には alias を残していないためNo such commandで失敗します)。CLI を呼び出すスクリプト・上位ツールは新 path への追従が必要です。 例:pocket awscontainer reload-env→pocket resource awscontainer reload-env。 pocket.django.lambda_handlers.shell_handlerをdangerous_shell_handlerに リネームしました。 任意文字列をshell=Trueで実行する危険な handler である ことを名前で明示する目的です(capability 自体は維持)。pocket.tomlの handler に旧名を指定している場合は新名への追従が必要です。SQS 駆動でコマンドを安全に 完走させる用途には新設のBaseCommandHandlerを利用してください。- deploy 時の stage 指定環境変数を
POCKET_DEPLOY_STAGEに分離しました。POCKET_STAGEは Lambda runtime 専用になり、ローカルで runtime helper と deploy CLI の stage 指定が干渉しなくなりました。 - Route の
type = "api"をtype = "lambda"にリネームしました(旧値は起動時に 分かりやすいエラーで失敗します)。 is_versionedを廃止しversioningに統一しました("content_hash"= 旧is_versioned = true相当 /"deploy_hash"= git hash を URL prefix に付与する 方式を新設)。- VPC 設定をトップレベル
[vpc]セクションへ移動しました。 外部 VPC 参照 (manage = false) と VPC 共有 (sharable = true+ consumer タグ管理) も サポートします。 - Route に
origin_pathを導入し、storage の location を自動計算するように しました(旧spa.origin_path_formatの設定体系は廃止)。 - CloudFront 専用 S3 バケットを廃止し、プロジェクトの S3 バケットに統合しました。
- Neon の
project_nameを pocket.toml で必須指定に変更しました。 - secrets セクションを再編しました:
[awscontainer.secretsmanager.pocket_secrets]→[awscontainer.secrets.managed]、[awscontainer.secretsmanager.secrets]→[awscontainer.secrets.user]。 保存先 store として Secrets Manager に加え SSM Parameter Store (store = "ssm") を選択可能になりました。
Features¶
- データベース / キャッシュの選択肢を拡張: Neon に加えて TiDB Serverless
(
[tidb]) / RDS Aurora Serverless v2 ([rds]、既存クラスター参照可・static パスワード管理対応) / Aurora DSQL ([dsql]、IAM 認証・VPC 不要) / Upstash Redis ([upstash]) をサポート。 - Rust (Loco) 対応:
magic-pocket-rscrate を追加し、Django 以外に Loco app を 同じ pocket.toml 体系でデプロイできるようになりました。 - CloudFront 統合を全面拡張:
[cloudfront.<name>]で複数ディストリビューション、 routes (S3 / lambda)、SPA ルーティング、署名付き URL (signing_key)、SPA トークン 認証 (require_token+ CloudFront Function + KeyValueStore)、WAF IP allowlist (waf)、ステージ別アセット配信 (managed_assets)、deploy_hashversioning に よるキャッシュバスティングをサポート。 - :material-console: build once + commit hash 昇格をサポート。
pocket django buildで 作業ツリーを一度ビルドして git commit hash(full)タグで ECR へ push し、pocket promote/pocket django promote --commit-hash <sha>で同一イメージを 再ビルドなしで各ステージへ昇格できます(:<stage>タグの付け替え + Lambda 更新)。[awscontainer].ecr_nameで ECR リポジトリ名を上書きでき、同一アカウント内の ステージ間でリポジトリを共有可能(明示指定したリポジトリはpocket destroyで 削除されません)。通常のpocket django deployの挙動は不変です。 - SQS 駆動の安全な command worker 基盤
pocket.command_handler.BaseCommandHandlerを追加。SQS イベントを別 Lambda invocation の本体として受け、build_argvで固定 した実行ファイルをshell=Falseの list argv で完走させ、出力 / ステータスを sink hook(on_start/on_output/on_finish/on_crash)に委譲します。long-running job を wsgi tier から worker tier に逃がす定石を共通化し、Lambda の freeze による 「ステータスが running 固着」を構造的に防ぎます。crash 時はtry/finallyでon_crashを呼んでから例外を re-raise(握りつぶさない)。dangerous_shell_handlerの安全な後継です。 - EventBridge Scheduler サポート (
[scheduler]): cron / rate での定期実行を CloudFormation 管理で構成。Django management command を呼ぶショートカット entry (pocket.django.management_lambda_scheduler) もあります。 - VPC + EFS サポート: NAT / Internet Gateway 構成、EFS マウント、Django
キャッシュの EFS 利用 (
store = "efs")。 - デプロイ権限の可視化:
pocket permissions listCLI と Python API (pocket.permissions.compute_actions()/action_groups()) で、pocket.toml の 構成に必要な IAM Action 一覧を機械可読に提供。デプロイ用 IAM Role の最小権限 プロビジョニングに使えます。 - ビルドバックエンドの選択:
[awscontainer.build]で codebuild(既定)/ docker / depot を選択可能。ローカル Docker なしでデプロイできます。 - IAM Permissions Boundary 対応 (
[awscontainer].permissions_boundary)。 Lambda 実行ロールと CodeBuild ロールに適用されます。 pocket runtime-config: ビルド専用設定を除外したpocket.runtime.tomlを 生成し、Lambda image に焼き込む仕組みを導入。- SES メール送信 (
[ses]): Django email backend の自動構成つき。 pocket waf ipCLI: WAF IPSet の side-channel 即時更新(add / remove / list)。pocket resource awscontainer reload-env/status-env: SSM / Secrets Manager の最新値で Lambda 環境変数を即時更新(CFn を介さない)/ 宣言値との drift 表示。- :material-console:
pocket django deployでインフラデプロイ + ローカル collectstatic + Lambda 上での migrate を対話形式で一括実行。 - :material-console:
pocket django resetdbでデータベースの public スキーマをリセット(DROP SCHEMA public CASCADE) - S3 バケット名のカスタマイズ (
[s3].bucket_name_format) とステージ別[<stage>.general]上書き(region 等)。
Bug Fixes¶
pocket permissions list/compute_actions()に deploy が実際に必要とする Action の宣言漏れが 5 件あったのを修正。権限を絞ったデプロイ用ロールで 該当構成を deploy するとAccessDeniedになっていた:dsql:*([dsql]構成の cluster 操作)/scheduler:*([scheduler]構成の CFnAWS::Scheduler::Schedule作成)/tag:TagResources・tag:UntagResources(外部 VPC 参照時の consumer タグ付け外し)/iam:ListRolePolicies(CodeBuild ロール削除時の inline policy 列挙)/ssm:GetParameter・ssm:PutParameter・ssm:DeleteParameter([rds]の static master password 管理。secrets.storeとは独立に必要)。action_groups()にdsql/scheduler/tagグループを追加(キー追加のみの非破壊変更)。POCKET_HOSTS環境変数が複数ホストをセパレータなしで連結していたのを カンマ区切りに修正(Python / Rust 両ランタイム)。apigateway 付き handler を 2 つ以上定義すると、Django のALLOWED_HOSTSに壊れたホスト名が入り 2 つ目以降のホストがDisallowedHostになっていました(消費側のadd_or_append_envは元々カンマ結合を前提としており、handler 1 つの構成では 影響ありません)。pocket resource awscontainer reload-env/status-envが Lambda 関数名から namespace(既定pocket)を取りこぼし、default namespace のデプロイで常に 「Lambda function が見つかりません」で失敗していたのを修正(deploy 側と同じ 正準function_nameを参照)。あわせてstatus-envの drift 警告が案内する コマンドが旧 path のままだったのを新 path に修正。
Improvements¶
- deploy コードと
compute_actions()の同期検証テストを追加 (tests/test_permissions_sync.py)。boto3 呼び出しの AST 静的解析と CloudFormation テンプレートのリソース型解析の 2 系統で、deploy が必要とする Action の宣言漏れを CI で検知する(過去に 3 回再発した「権限を絞った deploy ロールが本番で AccessDenied」の構造的な再発防止。未知の CFn リソース型の 追加時はテストが fail し権限の検討を強制する)。同期方針はdocs/permissions/aws.mdに記載。 - S3バケットのCORS設定を
pocket.tomlで宣言可能に(CloudFrontドメイン自動解決) pocket destroyがデフォルトでシークレットも削除するように変更(--without-secretsで残す)pocket destroyでCloudFrontスタック削除の完了を待機するように修正pocket deploy時にSSM/SMの不要なシークレットを自動クリーンアップ
0.1.1 - 2024-10-16¶
Full Changelog: https://github.com/worgue/magic-pocket/compare/0.1.0...0.1.1
Bug Fixes¶
- spa用のリソース作成時にリダイレクトするためのリソースが作られないバグを修正
0.1.0 - 2024-10-11¶
Dependencies¶
- click>=8.1.7
- tomli>=1.1.0 ; python_version < '3.11'
- mergedeep>=1.3.4
- pydantic>=2.5.3
- pydantic-settings>=2.1.0
- boto3>=1.34.28
- rich>=13.7.0
- deepdiff>=6.7.1
- pyyaml>=6.0.1
- python-on-whales>=0.68.0
- jinja2>=3.1.3
- awslambdaric>=2.0.10
- apig_wsgi>=2.18.0
- django-storages>=1.14.2,!=1.14.3
Features¶
- :material-console:
pocket statusで環境の作成状況を確認 - :material-console:
pocket deployでデプロイ- :material-database: NeonへのDB作成
- :simple-awssecretsmanager: SecretsManagerへのNeon DBの接続情報登録
- :simple-amazons3: ストレージ用にS3を作成し権限を設定
- :simple-docker: コンテナイメージを作成しECRへアップロード
- :material-language-javascript: フロントエンドSPAのビルドデータをアップロードするS3を作成
- CF: Lambdaに関わるCloudFormationを登録・更新
- LambdaのIAM Role, SecurityGroup, Function
- API Gateway の LogGroup, Api, ApiGatewayManagedOverrides, Route, Integration, lambda Permission, Certificate, DomainName, RecordSet, ApiMapping
- API Gatewayのhost名のoutput
- CF: SPAに関わるCloudFormationを登録・更新
- CloudFrontのOriginAccessControl, Certificate, CloudFrontFunction, Distribution, RecordSet
- :material-language-python:
settings.pyでの情報取得- :simple-awssecretsmanager: AWS SecretsManagerから情報を取得(1)
- :simple-toml:
pocket.tomlからdjangoのSTORAGES,CACHESを取得 - CF: CloudFormationのoutputからdjangoの
ALLOWED_HOSTSを取得
- :simple-toml: デプロイ環境ごとのdjango settings登録
- :material-console:
pocket django manage COMMAND ARGSで管理コマンドを実行 - :material-console:
pocket django storage upload STORAGEでローカルのFileSystemStorageから対象ステージのS3Boto3Storageへデータをsync - :material-console:
pocket resource awscontainer statusでLambdaの作成状況を確認 - :material-console:
pocket resource awscontainer secretsmanager listでSecretsManagerの値を確認 - :material-console:
pocket resource awscontainer yamlでCloudFormation用のyaml ファイルを確認 - :material-console:
pocket resource awscontainer yaml-diffでCloudFormation用のyamlファイルの差分を確認 - :material-console:
pocket resource neon statusでNeonの作成状況を確認 - :material-console:
pocket resource s3 statusでS3バケットの作成状況を確認 - :material-console:
pocket resource spa statusでspaアップロード先S3バケットの作成状況を確認