Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【AWS Dogwood入門】イベントと演算子

【AWS Dogwood入門】イベントと演算子

Avatar for 赤神青空

赤神青空

August 22, 2026

More Decks by 赤神青空

Other Decks in Programming

Transcript

  1. ▪ポリシーが参照できる「過去」の正体 何がイベントになるか イベントは3種類。判定を求められるのは request だけ ::request 呼び出しが投げられた時点 判定あり ::response 呼び出しが成功して返った時点

    input.*, principal, resource input.* に加えて output.* 判定中のリクエスト⾃⾝も履歴に⼊る 「成功したもの」だけが⼊る ALLOW / DENY が返る 履歴のみ 判定は付かないが後続を変える ::error 呼び出しが失敗した時点 履歴のみ ゲートウェイ側∕ツール側のエラー ::response を参照する条件は error にはマッチしない アクションスキーマ = ポリシーが名前を呼べるツールの集合 MCP の tools/list マニフェストから、1ツール=1アクションで⽣成できる(dogwood schema mcp) ポリシーによる DENY は error ではない。DENY は request イベントに付く判定 失敗した呼び出しは error になり、response には残らない 今ココ Dogwoodとは 3/16
  2. ▪temporal条件は3系統ある だけが増えたわけではない 【1】現在のリクエストを見る/【2】過去のイベント列を見る Cedar temporal 素の点認可 履歴を条件にする when { }

    when temporal 【3】外から事実を持ち込む 情報提供 例 判定材料を外から供給 現在時刻もここ 小さな関数を呼ぶ Guardrails・分類器 context.system.now も、この3つ目の系統として供給される 今ココ Dogwoodとは 4/16
  3. ▪窓の中で一度でも起きたか formerly ── 有無を見る 後ろ向きの演算子です。within 1h が遡る幅を決めます。 dogwood permit (principal,

    action == AgentCore::Action::"SellShares", resource) when temporal { formerly within 1h AgentCore::Action::"ApproveSale"::response{ input.stock: context.input.stock, input.shares: context.input.shares, output.approved: true } }; 今ココ 演算子 5/16
  4. ▪承認は20分後に1回だけ下りている 同じ頼みが、後から落ちる 条件:直近1時間に、同じ銘柄‧同じ株数の承認があること 承認が下りた(20分後) ここで売却を頼む 窓の中に承認がある 30分後の売却が⾒る「直近1時間」 ALLOW 承認はもう、この窓に⼊らない リクエストの中⾝は、上とまったく同じ

    DENY 120分後の売却が⾒る「直近1時間」 (開始前) 0分 30分 60分 90分 120分 窓は「何時から何時まで」ではなく「いまから1時間前まで」。判定のたびに測り直される だから、同じ内容のリクエストでも、遅れて来ると落ちる 窓が動くので、リクエストが同じでも答えが変わる 今ココ 演算子 6/16
  5. ▪temporal素のCedarと混ぜる は式なので when の中に置ける 「小口であること」かつ「承認があること」の両方を要求します。 dogwood permit (principal, action ==

    AgentCore::Action::"SellShares", resource) when { context.input.shares <= 100 && temporal { formerly within 1h AgentCore::Action::"ApproveSale"::response{ input.stock: context.input.stock, output.approved: true } } }; 今ココ 演算子 7/16
  6. ▪レートリミットはこれで書く count_within ── 回数 _ はワイルドカードで、「金額は問わない」という意味になります。 dogwood forbid (principal, action

    == AgentCore::Action::"Transfer", resource) when temporal { count_within(1h, AgentCore::Action::"Transfer"::request{ input.amount: _ }) > 5 }; 今ココ 演算子 8/16
  7. ▪件数ではなく金額の総量に蓋をする sum_within ── 合計 「何回に分けようと、1時間で $5,000 まで」。a に各件の金額が束ねられます。 dogwood forbid

    (principal, action == AgentCore::Action::"Transfer", resource) when temporal { sum_within(a, 1h, AgentCore::Action::"Transfer"::request{ input.amount: a }) > 5000 }; 今ココ 演算子 10/16
  8. ▪固定値ではなく、集計そのものと比べる bind ── 集計に名前 「直近の実績を突然上回る1件」だけを拒む、いわゆるスパイク検知です。 dogwood forbid (principal, action ==

    AgentCore::Action::"Transfer", resource) when temporal { bind(prior, sum_within(a, 1h, AgentCore::Action::"Transfer"::response{ input.amount: a }), context.input.amount > prior) }; 今ココ 演算子 11/16
  9. ▪上3つが言語のプリミティブ、下4つが標準マクロ 演算子の早見表 有無 直前 継続 回数 種類 合計 変数 formerly

    previous since count_within count_distinct sum_within bind 今ココ 演算子 窓の中で一度でも起きたか ひとつ前の時点を見る ある事象からの継続を見る 窓の中のイベント数 束ねた値の異なり数(_within) 束ねた値の合計 集計に名前を付けて比較する 12/16
  10. ▪3つの修飾が、そのまま書き味になっている MFOTL を名前で割る Metric First-Order Temporal Logic。後ろから読むと構造が見えます。 Temporal ── 「いつ」を式に書ける

    formerly / previous / since がこれにあたる 未来を見る演算子は、まだ入っていない First-Order ── 値を変数で束ねられる sum_within の a や count_distinct_within の u 引数を条件に使えるのは、この性質のおかげ Metric ── 演算子に時間の幅が付く within 1h。窓の指定は省略できない 有界だから、有限の状態で監視を回せる 今ココ Dogwoodとは 13/16
  11. ▪認可の話であると同時に、形式手法の話でもある 実行時検証という文脈 土台は MFOTL(Metric First-Order Temporal Logic)です。 便利な演算子はプリミティブではない count /

    sum / bind は標準ライブラリのマクロ 素の MFOTL も直接書ける runtime verification という分野に由来する 動いている系を、仕様と突き合わせ続ける営み 認可を置き換えるのではなく一般化している 著者に Aurora DSQL を率いた Marc Brooker が入っている 今ココ Dogwoodとは 14/16
  12. ▪この回の持ち帰り まとめ 01 材料はイベント3種 判定を受けるのは request だけ。あとの2つは履歴に残ります。 02 プリミティブ3つとマクロ4つ formerly・previous・since

    が土台。count 等はその上。 03 素のCedarと混ぜられる temporal は式なので、ふつうの when の中に置けます。 今ココ おわりに 16/16