1K Views
January 18, 25
スライド概要
Filter Array を使った SQL の Join 的な実装の紹介
コンテンツ 自己紹介 シナリオ(ちょっと複雑) 実装方法の検討 デモ まとめ
なりしょー/narisho NextRead セキュリティ 自動化 可視化 x.com/narisho qiita.com/narisho
シナリオ 前提:社員全員に「パスワードレス認証」を強制している 1.新しく入社した人は一定期間パスワードレス認証の強制を猶予したい (パスワードレス認証を登録するためにパスワードレス認証が求められる・・のを避けたい) 2.パスワードレス認証の登録が完了した人から猶予を解除したい (少しでも早く安全な認証を強制したい) 3.ステータス管理はしたくない (エラーが起きてもフローを実行しなおすだけでリカバリーできるようにしたい)
どうやって実装しますか? 条件付きアクセス ポリシー 許可:パスワードレス必須 対象:全ユーザー • 作成日時 • パスワードレス状態 • グループ メンバー状態 除外グループ 追加、削除
パターンの整理 パターン 最近作成した パスワードレス有効 除外グループ メンバー アクション A ○ ○ ○ 除外グループ削除 B ○ ○ C ○ D ○ ○ ○ F ○ H 何もしない 除外グループ追加 E G 何もしない ○ 除外グループ削除 何もしない ○ 除外グループ削除 何もしない
分岐による実装 ユーザー情報の配列 For each true true true グループ メンバー? A 除外グループ削除 パスワードレス 有効? false true B C 最近作成? false グループ メンバー? false true false true 除外グループ追加 D グループ メンバー? E 除外グループ削除 パスワードレス 有効? false true false グループ メンバー? F G 除外グループ削除 false H
分岐による実装 ユーザー情報の配列 For each true true パスワードレス 有効? 最近作成? false true false グループ メンバー? E 除外グループ削除 true グループ メンバー? A 除外グループ削除 false true B C グループ メンバー? false 除外グループ追加 D false F
分岐による実装 ユーザー情報の配列 For each 似たような処理を複数作成する必要があり、 false true 最近作成? 実装&メンテナンスが大変 true パスワードレス 有効? false true パスワードレス 有効? false 何も処理をする必要がないユーザーにも 最低 3 回の処理が発生し時間がかかる true グループ メンバー? false true false true false true 場合によっては For each のネストも・・・ A 除外グループ削除 B C グループ メンバー? 除外グループ追加 D グループ メンバー? E 除外グループ削除 グループ メンバー? F G 除外グループ削除 false H
SQL の Join 的な実装 最近作成した パスワードレス有効 除外グループ メンバー B D F A C E G H
SQL の Join 的な実装 AND NOT AND NOT 最近作成した パスワードレス有効 除外グループ メンバー AND NOT AND D AE G 除外グループ追加 除外グループ削除
SQL の Join 的な実装 AND NOT 最近作成した パスワードレス有効 除外グループ メンバー AND NOT 処理が必要なユーザーを 最初にフィルターすることで、 AND NOT AND D AE • 1処理1実装で済むため、メンテナンスが楽 G • 不要な処理がなく時間短縮できる 除外グループ追加 除外グループ削除
Power Automate で Join できるか? • 「join」関数は存在するが、SQL の Join ではなく、配列を特定の区切 り機能を使用して文字列として結合する (split と逆) ものなので NG • SQL の Inner Join は intersection 関数を使用して実現できるが、 それ以外は関数が用意されていない(はず)
Power Automate で Join できるか? • 「join」関数は存在するが、SQL の Join ではなく、配列を特定の区切 り機能を使用して文字列として結合する (split と逆) ものなので NG • SQL の Inner Join は intersection 関数を使用して実現できるが、 それ以外は関数が用意されていない(はず) 既定の関数が用意されていなくても、 Filter Array アクションを使用すれば実現できる!
最近作成された
パスワードレス有効
除外グループ メンバー
① 元になる配列を
準備する
[
{
“upn": “[email protected]",
"id": “12345"
},
{
“upn": “[email protected]",
"id": “23456"
},
{
“upn": “[email protected]",
"id": “34567"
},...
]
[
{
“upn": “[email protected]",
"id": “45678"
},
{
“upn": “[email protected]",
"id": “56789"
},
{
“upn": “[email protected]",
"id": “67890"
},...
]
[
{
“upn": “[email protected]",
"id": “78901"
},
{
“upn": “[email protected]",
"id": “89012"
},
{
“upn": “[email protected]",
"id": “90123"
},...
]
② キー要素だけの
配列を作成する
[
“12345“,
“23456“,
“34567“,
...
]
[
“45678“,
“56789“,
“67890“,
...
]
[
“78901“,
“89012“,
“90123“,
...
]
② 任意の条件で
フィルターする
From:
outputs('array_最近作成された')
Filter Query:
and(
not(contains(body('key_パスワードレス有効'), item()?['id'])),
not(contains(body('key_グループ_メンバー'), item()?['id']))
)
← パターン D の条件例
デモ
まとめ • A AND (B OR C) や、A AND NOT(B) のような複数の条件の 組み合わせで配列を処理する際に、条件分岐や Foreach のネストを すると実装もメンテナンスも大変だし、時間もコストもかかる • Filter Array アクションのフィルター クエリを使用して条件に該当する 要素を絞り込んだ後にアクションを実行する方がスマート • ステータス(整合性)管理をせずに、単独の処理で完結できる実装は 運用フェーズに入ったときにメリットが大きいのでお勧め
ありがとうございます narisho