この記事について
本番環境とテスト環境で同期動作を分けたい場合や、一時的に同期を停止したい場合があります。そのため、環境変数で同期のON/OFFを制御できる設計にしました。
なぜ同期制御が必要なのか
制御が必要になるシーン
| シーン | 必要な制御 | 理由 |
|---|---|---|
| 開発・テスト時 | 同期をOFF | 本番POSにテストデータを送りたくない |
| 段階的リリース | 一部だけON | まずShopifyのみ、後からPOS追加 |
| POS障害時 | POS同期をOFF | エラーを回避して登録は継続 |
| メンテナンス時 | 全同期をOFF | 計画的な停止 |
| 負荷テスト時 | CRM同期をOFF | テスト対象外のシステムへの影響回避 |
開発・テスト時
必要な制御同期をOFF
理由本番POSにテストデータを送りたくない
段階的リリース
必要な制御一部だけON
理由まずShopifyのみ、後からPOS追加
POS障害時
必要な制御POS同期をOFF
理由エラーを回避して登録は継続
メンテナンス時
必要な制御全同期をOFF
理由計画的な停止
負荷テスト時
必要な制御CRM同期をOFF
理由テスト対象外のシステムへの影響回避
制御がないと起きる問題
- テスト時に本番POSにゴミデータが登録される
- POS障害時に全ての登録が失敗する
- 部分的な機能リリースができない
環境変数による制御の設計
基本的な考え方
| 環境変数 | true | false |
|---|---|---|
| ENABLE_POS_SYNC | 登録時にPOSへ自動同期 | Shopifyのみに登録(POSは手動) |
| ENABLE_CRM_SYNC | HubSpotへ自動連携 | CRM連携なし |
| ENABLE_UPDATE_SYNC | 顧客情報更新時も同期 | 新規登録時のみ同期 |
ENABLE_POS_SYNC
true登録時にPOSへ自動同期
falseShopifyのみに登録(POSは手動)
ENABLE_CRM_SYNC
trueHubSpotへ自動連携
falseCRM連携なし
ENABLE_UPDATE_SYNC
true顧客情報更新時も同期
false新規登録時のみ同期
環境ごとの設定例
| 環境 | POS同期 | CRM同期 | 更新同期 | 備考 |
|---|---|---|---|---|
| 本番 | ON | ON | ON | フル機能で運用 |
| ステージング | ON | OFF | ON | POS連携のみテスト |
| 開発 | OFF | OFF | OFF | ローカル開発用 |
| E2Eテスト | OFF | OFF | OFF | 自動テスト用 |
本番
POS同期ON
CRM同期ON
更新同期ON
備考フル機能で運用
ステージング
POS同期ON
CRM同期OFF
更新同期ON
備考POS連携のみテスト
開発
POS同期OFF
CRM同期OFF
更新同期OFF
備考ローカル開発用
E2Eテスト
POS同期OFF
CRM同期OFF
更新同期OFF
備考自動テスト用
処理フローへの組み込み
条件分岐の考え方
同期処理の条件分岐
顧客登録リクエスト受付
フォームから送信されたデータを受け取る
Shopify登録(常に実行)
顧客マスターとして最優先で登録
ENABLE_POS_SYNC チェック
ON → POS同期を実行 / OFF → スキップ(ログ記録)
ENABLE_CRM_SYNC チェック
ON → CRM同期を実行 / OFF → スキップ(ログ記録)
登録完了
結果を顧客に返却
スキップ時のログ記録
同期をスキップした場合でも、後から追跡できるようにログを残します。
| フィールド | 値 | 説明 |
|---|---|---|
| timestamp | 2024-01-15T10:30:00Z | 処理日時 |
| event | customer_registration | イベント種別 |
| shopify_customer_id | 12345 | 顧客ID |
| sync_status.shopify | success | Shopify登録結果 |
| sync_status.pos | skipped (disabled) | POS同期結果(スキップ理由を記録) |
| sync_status.crm | success | CRM同期結果 |
timestamp
値2024-01-15T10:30:00Z
説明処理日時
event
値customer_registration
説明イベント種別
shopify_customer_id
値12345
説明顧客ID
sync_status.shopify
値success
説明Shopify登録結果
sync_status.pos
値skipped (disabled)
説明POS同期結果(スキップ理由を記録)
sync_status.crm
値success
説明CRM同期結果
後で「なぜPOSに同期されていないのか」を追跡可能です。
運用シナリオ
シナリオ1: 段階的なリリース
フェーズ1: Shopifyのみ
POS同期OFF、CRM同期OFFで本番リリース。まず基本機能を検証
フェーズ2: POS追加
POS同期ONに変更。Shopify登録済みの顧客を一括でPOSに同期
フェーズ3: CRM追加
CRM同期ONに変更。マーケティング連携を開始
シナリオ2: 障害時の切り離し
POS障害発生時の対応
通常時
POS同期: ON、CRM同期: ON、すべて正常に動作
障害対応中
POS同期: OFFに変更(即座に切り替え)、CRM同期: ON(影響なし)、顧客登録は継続可能
復旧後
POS同期: ONに戻す、障害中の登録を一括同期、通常運用に復帰
シナリオ3: テスト環境での制御
| 環境 | POS同期 | POS接続先 | 特徴 |
|---|---|---|---|
| 開発者ローカル | OFF | - | 本番システムに一切影響なし |
| ステージング | ON | staging-pos.example.com | ステージングPOSで検証可能 |
| 本番 | ON | pos.example.com | 本番POSと連携 |
開発者ローカル
POS同期OFF
POS接続先-
特徴本番システムに一切影響なし
ステージング
POS同期ON
POS接続先staging-pos.example.com
特徴ステージングPOSで検証可能
本番
POS同期ON
POS接続先pos.example.com
特徴本番POSと連携
設計上の注意点
フラグ確認のタイミング
デフォルト値の設計
| フラグ | 未設定時のデフォルト | 理由 |
|---|---|---|
| ENABLE_POS_SYNC | false | 意図しない同期を防止 |
| ENABLE_CRM_SYNC | false | 意図しない同期を防止 |
| ENABLE_UPDATE_SYNC | false | 新規登録のみを安全に動作 |
ENABLE_POS_SYNC
未設定時のデフォルトfalse
理由意図しない同期を防止
ENABLE_CRM_SYNC
未設定時のデフォルトfalse
理由意図しない同期を防止
ENABLE_UPDATE_SYNC
未設定時のデフォルトfalse
理由新規登録のみを安全に動作
この設計がもたらす効果
開発チームにとって
- テスト時に本番システムを汚さない
- 段階的なリリースが可能
- 障害時の影響を最小化できる
運用チームにとって
- 障害時に迅速な対応が可能
- メンテナンス時の制御が容易
- 設定変更がデプロイなしで可能
ビジネスにとって
- サービス停止時間の最小化
- リスクを抑えた機能追加
- 柔軟な運用体制の実現