🔢

AWS WAFで学んだ、orderを連番にしないというアイデア ─ 飛ばし飛ばしで採番すると嬉しいこと

に公開

はじめに

AWS WAFではルールの評価順を Priority という整数で制御する。AWS WAFのルール設定の公式docには連番で Priority が設定されていない。

Rule1 — 優先度 0
RuleGroupA – 優先度 100
    RuleA1 – 優先度 10,000
    RuleA2 – 優先度 20,000
Rule2 — 優先度 200
RuleGroupB – 優先度 300
    RuleB1 – 優先度 0
    RuleB2 – 優先度 1

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-processing-order.html

Priorityを連番(1, 2, 3, ...)で振ってしまうと、既存ルールの間に新しいルールを差し込みたくなったとき、それ以降のルール全てのPriorityを振り直す必要があり、変更範囲が多くなる。

飛び番(10, 20, 30, ...)にしておけば、既存の設定に触れずに新しいルールを間に差し込める。

連番で困る場面

たとえばFAQページの表示順を次のように設計したとする。

title display_order
アカウント登録について 0
お支払い方法について 1
配送について 2
返品について 3

ここで「お支払い方法について」と「配送について」の間に新しい項目を差し込みたくなった場合、display_order = 2 以降のレコードを全て +1 するUPDATEが必要になる。

UPDATE faqs SET display_order = display_order + 1 WHERE display_order >= 2;
INSERT INTO faqs (title, display_order, ...) VALUES ('ポイントの使い方', 2, ...);

レコード数が少なければ大した問題ではないが、変更対象が増えるほどrakeタスクやmigrationの差分が大きくなる。

飛び番にしておく

同じテーブルを5刻みで設計するとこうなる。

title display_order
アカウント登録について 0
お支払い方法について 5
配送について 10
返品について 15

間に差し込みたいときは、空いている番号(たとえば 78)を使うだけで済む。

INSERT INTO faqs (title, display_order, ...) VALUES ('ポイントの使い方', 7, ...);

既存レコードのUPDATEは不要。差し込み対象の1行だけで完了する。

まとめ

  • order値を連番にすると、間への差し込み時に既存レコードの更新が必要になる
  • 5刻みや10刻みで設定しておくと、差し込みが1行のINSERTで済む
  • AWS WAFのPriority設計で公式に発表されているプラクティスでもある

「あとから差し込みたくなるかもしれない」順序値には、最初から余白を持たせておくと運用が楽になることもあるだろう、という小噺でした。

GitHubで編集を提案
GMOペパボ株式会社

Discussion