サンドボックスとテスト環境
TL;DRについて
堅牢なサンドボックス=完全な分離、合成/非人格的データ、外部システムの現実的なシミュレータ、予測可能な側面とタイムトラベル、組み込みのidempotencyとwebhook、透明な限界とメトリクス。食べ物-手の届かない、キー-掘削、プロモーション-のみチェックリストに。
1)環境マップとその役割
ルール:サンドボックス≠ prod。任意の接続-実際の手段/ゲーム/個人データにアクセスすることなく、片道シミュレータを介して。
2)データ: 合成、匿名化、座っていること
デフォルトの合成。パスポート/カードデータジェネレータ、有効ですが、非金融PAN (テストBIN)、レートと残高のライブパターン。
ステージの匿名化:識別子のトークン化、集計の差分プライバシー、まれな組み合わせの削除。
Sidsとdeterminism: 1つのチーム-1つの状態。
bash make db-reset && make db-seed ENV=sandbox SEED=2025_11_03
タイムトラベル:期限/有効期限テストの環境のグローバル「時間」。
3)シミュレーターおよびプラグ(スタブ)
支払い/銀行/PSP
Auth/Capture/Refund/Payout сценариями: 'approved'、 'decred_insufficient'、 '3ds_required'、 'timeout'、 'duplicate'。
PSP webhooks: HMAC署名、レトライ、遅延と「汚いインターネット」。
KYC/AML/制裁
補足:'clear'、 'pep_match'、 'anction_hit'、 'doc_mismatch'、 'manual_review'。
prodのようにidempotencyとrate limitsをサポートします。
ゲームプロバイダ/カタログ
ロビー、機能、RTP/ラウンド-疑似ランダム生成、UXケースの「支払い/失敗」を制御します。
オプション:シミュレータ「severity」スイッチ(happy-path vs chaos)。
4)サンドボックスのWebhooks
HMAC署名(v1)、ヘッダ'X-Event-Id'、 'X-Timestamp'、ウィンドウ≤ 5分。
指数関数的なバックオフ、DLQ、リプレイでリトレイします。
コンソール「再送」と試行ログ。
pseudo
POST /psp/webhooks
Headers: X-Signature, X-Timestamp, X-Event-Id
Body: { event_id, type, data, attempt }
5) Idempotenceおよびdeterminism
すべての変異は'Idempotency-Key'を受け入れる。
シミュレータは、結果をキーで保存します(TTL 24-72 h)。
「シード決定論」:同じ入力で-同じ結果(繰り返し可能なテストの場合)。
6)セキュリティとアクセス
ネットワーク分離/VPC、個々の秘密とドメイン('sandbox。例を示します。com')。
RBAC/ABAC:「パートナー」、「qa」、 「dev」、トークンのospreysの役割は最小限です。
レート制限とクォータ:テナント/キーごとのフェアシェア、わかりやすい'429'/'再試行'。
KMS/Vaultでのみ秘密;規則的な回転。
コード/設定レベル(フィーチャーフラグのハードブロック)での実際の支払いの禁止。
7)サンドボックスのAPIゲートウェイと観測可能性
同じポリシー:OAuth2/OIDC/JWT、 CORS、 WAF、 DDoSプロファイル。
メトリクス:p50/p95/p99、 4xx/5xx、ヒットレート制限、レイテンシーWebフック、idempotentヒット。
ログ/トレイル: PIIなし;相関'trace_id'
ダッシュボード「Sandbox Health」:アップタイム、Webhookキュー、シミュレータエラー。
8)特徴の旗、版および両立性
sandbox→stage→prodに機能を含める。
APIのためのSemVer;Swagger/Redocサンドボックスの廃止/日没バナー。
GraphQLストアフロントの持続クエリ(もしあれば)。
9) CI/CDプロモーション
1.ビルド/ユニット→
2.コントラクト/モックテスト(OpenAPI/Protobuf/GraphQL SDL)→
3.統合とシミュレータの比較→
4.ステージ回帰(anon。スナップショット)→
5.キャナリー・プロッド。
ゲートチェックリストプロモーション:第12条の下にあります。
10)パートナー向けUATスクリプト(サンドボックス化)
支払い:WebhookおよびPSPエラーによる認証/キャプチャ/払い戻し/支払い。
KYC/AML:すべてのステータス+手動エスカレーション。
Idempotency:繰り返し'Idempotency-Key'→同じ結果。
Rate-limit: '429'の正しい処理。
時間ウィンドウ:トークンの有効期限、'Retry-After'、タイムトラベルの場合。
Webhook: 署名/リトレイ/DLQ、手動リプレイとデッドアップ。
11)データポリシーとプライバシー
サンドボックス/ステージに本物のPAN/KYCドックを保管しないでください。
匿名化:マスキング、直接識別子の除去、合成相関。
ログとWebhook本体のTTLストレージ≤ルーチンです。
12)チェックリスト
12.1新しいサンドボックスを立ち上げる
- 隔離されたネットワーク/ベース/キャッシュ/オブジェクトストレージ
- KMS/Vaultで作成された秘密、役割によるアクセス
- PSP/KYC/ゲームシミュレータのスペルアウトとバージョン管理
- Swagger/Redoc+Postmanコレクション(サンドボックスエンドポイント)
- Webhooks: HMAC、リトライ、DLQ、リプレイコンソール
- レート/クォータプロファイル、減価償却/日没バナー(もしあれば)
- ダッシュボードとアラート(レイテンシー、5xx、 429、 DLQ)
12.2プロモーションリリース(ステージ→prod)
- 契約差分チェック(破損なし)
- ステージでp95/p99を正常にロードする
- WebhookはUAT、 idempotency okを受けました
- フィーチャーフラグが用意されており、ロールバックプランがあります
- Changelog、移行ガイド、パートナーへのメール送信
13) Antipatterns
「密かに」プロッドサービス/データベースに触れるサンドボックス。
ステージ/サンドボックス内の実際のカード/パスポートデータ。
Webhook/Retreatsのないシミュレータは「幸せな道」のみです。
idempotence→duplicateの支払/賭け無し。
すべてのパートナーに共通のHMAC秘密が1つあります。
制限や透明な429/Retry-Afterはありません。
14)ミニスニペット
。env。sandbox(例)
dotenv
API_BASE=https://sandbox.api.example.com
OAUTH_ISS=https://sandbox.idp.example.com
PSP_SIM_URL=https://sandbox.psp-sim.example.com
KYC_SIM_URL=https://sandbox.kyc-sim.example.com
WEBHOOK_SECRET_ROTATION_DAYS=90
FEATURE_FORCE_SANDBOX_PAYMENTS=1
OpenAPIフラグメント(サンドボックスサーバー)
yaml servers:
- url: https://sandbox.api.example.com/v1 description: Public Sandbox
Idempotency擬似コード
pseudo if store.exists(idem_key): return store.get(idem_key)
res = do_business()
store.set(idem_key, res, ttl=72h)
return res
PSPシミュレータトリガー
json
{ "scenario": "payout", "case": "declined_insufficient", "payout_id": "p_123" }
15)サンドボックスの観察可能性およびSLO
アップタイムサンドボックスAPI ≥ 99。5%(統合のショーケースは落ちるべきではない)。
通常の負荷でWebhooks p95 ≤ 3 sから2xxに。
ゲートウェイのエラー予算5xx ≤ 0。1%.
ドッキングポータルが利用可能で、契約と同期しています。
16)ガバナンス
環境所有者(SRE/Platform)とスチュワードAPI (contract)。
変更を破るためのRFCプロセス、廃止/日没カレンダー。
制限/クォータと公衆サンドボックスの「公正使用」価格を分離します。
履歴書のサマリー
サンドボックスは開発者向けの製品であり、ベースの「コピー」ではありません。"Give:厳格な分離、合成データ、Webhookとレトラを備えた本格的なシミュレータ、側面と時間移動による決定論、特徴フラグと透明限界。すべてを契約、オブザビリティ、ガバナンスと結びつけることで、統合は迅速、安全、予測可能になり、痛みのないリリースになります。