AI搭載の要件管理WebアプリをPower AutomateでSharePointと連携してみた
🛠 技術スタック
| レイヤー | 技術 |
|---|---|
| フロントエンド / BFF | Next.js 16(App Router) |
| データベース | Supabase(PostgreSQL) |
| 認証 | NextAuth v5 + Microsoft Entra ID(Azure AD) |
| AI | Anthropic Claude API |
| ホスティング | Vercel |
| SharePoint連携 | Power Automate(HTTPトリガー) |
🏗 アーキテクチャ全体図
Server Components
Serverless Functions
PostgreSQL DB
schedules
Anthropic
HTTP Trigger
Excel自動生成
Azure AD(テナント固定)
1. 認証設計:2段階アクセス制御
他テナントは遮断
HttpOnly Cookieで管理
再入力不要
1-1. Azure ADによる組織限定ログイン
issuer にテナントIDを固定することで、自社以外のMicrosoftアカウントでは認証が通りません。/common エンドポイントは使用しません。
export const { handlers, auth, signIn, signOut } = NextAuth({ secret: process.env.AUTH_SECRET, providers: [ MicrosoftEntraID({ clientId: process.env.AZURE_AD_CLIENT_ID, clientSecret: process.env.AZURE_AD_CLIENT_SECRET, // テナントIDを固定 → 他組織のアカウントはログイン不可 issuer: `https://login.microsoftonline.com/${process.env.AZURE_AD_TENANT_ID}/v2.0`, }), ], pages: { signIn: '/', error: '/' }, })
1-2. アクセスコードによる二重ロック
Azure ADサインイン後でも、独自のアクセスコードを入力しないと案件一覧を見れません。状態は HttpOnly Cookie で管理するため、JavaScriptから読み取り不可です。
export async function POST(req: NextRequest) { const { password } = await req.json() // 環境変数で管理 → ソースコードに値が入らない if (!password || password !== process.env.SITE_PASSWORD) { return NextResponse.json({ error: 'Invalid' }, { status: 403 }) } const res = NextResponse.json({ ok: true }) res.cookies.set('site_unlocked', 'true', { httpOnly: true, // JSから読み取り不可 secure: true, // HTTPS限定 sameSite: 'lax', // CSRF対策 maxAge: 60 * 60 * 8, // 8時間有効 }) return res }
auth() と cookies() をミドルウェア(Edge Runtime)で組み合わせると動作が不安定になる問題がありました。解決策: 認証チェックをEdge Runtimeから外し、Node.jsランタイムで動く
layout.tsx(Server Component)に移しました。2. Claude APIによる機能一覧自動生成
2-1. APIキーはサーバーサイドのみ
Claude APIのシークレットキーは API Route内でのみ参照 します。クライアントコンポーネントから直接呼び出す設計は取っていません。
const client = new Anthropic({ // ANTHROPIC_API_KEY はサーバー環境変数 → ブラウザに一切露出しない apiKey: process.env.ANTHROPIC_API_KEY, }) const message = await client.messages.create({ model: 'claude-opus-4-5', max_tokens: 4096, system: SYSTEM_PROMPT, messages: [{ role: 'user', content: text }], })
2-2. システムプロンプト:推測・水増し禁止
AIが勝手に機能を追加しないよう、明示的に制約をかけています。
const SYSTEM_PROMPT = ` あなたはシステム要件を機能一覧に変換するアシスタントです。 【厳守ルール】 - 入力から明示的に読み取れる内容だけを根拠にする - 推測・補完・水増しは厳禁 - 入力に書かれていない機能を追加しない 【出力形式】JSON配列で返すこと - category, title, description - priority: 'Must' | 'Should' | 'Could' - impl_type: '標準機能'|'設定'|'カスタム'|'外部連携'|'対象外' `
2-3. DB制約違反への対処:正規化関数
SupabaseのCHECK制約に通らない値をAIが返すことがあるため、INSERT前にサーバーサイドで正規化します。
function normalizeImplType(val: string): string | null { const v = val?.trim() ?? '' if (v.includes('標準')) return '標準機能' if (v === '設定') return '設定' if (v.includes('外部') || v.includes('連携')) return '外部連携' if (v.includes('対象外')) return '対象外' if (v.includes('カスタム')) return 'カスタム' return null // DBエラーではなくバリデーションエラーとして処理 }
3. Power Automate連携:SharePoint Excel自動生成
3-1. 設計方針
SharePoint APIを直接呼ぶ場合、OAuthトークン取得・ファイル操作・テーブル書き込みを全て自前実装する必要があります。
Power AutomateのHTTPトリガーに委譲することで、SharePoint操作をノーコードで実現し、アプリ側のコードを最小化しました。
3-2. フロー構成
s_template.xlsx をコピーして日時名で新しいファイルを作成。concat('機能一覧_', convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'yyyyMMdd_HHmm'), '.xlsx')3-3. アプリ側のコード(export API Route)
export async function POST(req: NextRequest) { const { projectId, projectName } = await req.json() // Webhook URLは環境変数 → SASトークン付きURLがソースに入らない const url = process.env.POWER_AUTOMATE_URL if (!url) return NextResponse.json({ error: 'URL未設定' }, { status: 500 }) // Supabaseからデータ取得 const { data: features } = await supabase .from('features') .select('*') .eq('project_id', projectId) // Power AutomateにPOST(アプリはデータを渡すだけ) await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ projectId, projectName, features }), }) return NextResponse.json({ ok: true }) }
4. 環境変数の管理
全てのシークレットをVercelのEnvironment Variablesに登録しています。ソースコード・.env.local・GitHubには一切含みません。
| 変数名 | 用途 | 公開範囲 |
|---|---|---|
| AUTH_SECRET | NextAuthセッション署名 | サーバーのみ |
| AZURE_AD_CLIENT_ID | Azure ADアプリID | サーバーのみ |
| AZURE_AD_CLIENT_SECRET | Azure ADシークレット | サーバーのみ |
| AZURE_AD_TENANT_ID | 自社テナントID | サーバーのみ |
| NEXT_PUBLIC_SUPABASE_URL | SupabaseプロジェクトURL | 公開可(RLS制御) |
| NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase匿名キー | 公開可(RLS制御) |
| SUPABASE_SERVICE_ROLE_KEY | Supabase管理者キー | サーバーのみ |
| ANTHROPIC_API_KEY | Claude APIキー | サーバーのみ |
| SITE_PASSWORD | アプリ独自アクセスコード | サーバーのみ |
| POWER_AUTOMATE_URL | Webhook URL(SASトークン含む) | サーバーのみ |
NEXT_PUBLIC_ が付いた変数はビルド時にバンドルされブラウザに露出します。Supabaseの匿名キーは仕様上公開可能(RLSで制御)ですが、それ以外のシークレットには絶対に NEXT_PUBLIC_ をつけないようにしています。5. ハマったポイントと対処法
auth() と cookies() をミドルウェア(Edge Runtime)で組み合わせると、クッキーの読み取りが不安定になる問題がありました。
layout.tsx)に移しました。Apply_to_each ではなく それぞれに適用する_1 のような日本語名になり InvalidTemplate エラーが発生しました。
'カスタム開発' や 'JS実装' など、SupabaseのCHECK制約に含まれない値を返すことがありました。
6. セキュリティ設計まとめ
NEXT_PUBLIC_ なし。クライアントには一切露出しない。まとめ
Next.jsのApp RouterはServer ComponentsとAPI Routeの境界が明確なので、セキュリティを保ちながらAIやSaaSと連携する構成を作りやすいと感じています。
「コードで書くべきか、ノーコードツールに任せるか」の判断軸も今後の開発で意識していきたいと思います。
D365クエスト
アーキテクトクイズ①
クイズゲーム — 直前対策版
細かいところメモ
Microsoft公式の情報は頻繁にアップデートされているため、本記事は2026年4月時点の仕様に合わせて整理しています。昔の学習サイトや古い情報では Process Advisor や Per User Plan といった古い名称がまだ残っていますが、今はそれぞれ名称・構成が変わっている点も補足していきます。
- PART 1 ── 要件分析とソリューション構想
- PART 2 ── 実装・トラブルシュート・運用監視
- 振り返って気づいた3つの学び
① 要件分析とソリューション構想の勘所
PL-600の出題比率で最も大きいのが「ソリューションの構想と要件分析」で、45〜50%を占めています(2024年9月のスタディガイド改訂以降)。ここでは意思決定のフレームを5つに分けて整理します。
1-1. 標準機能で足りないときの判断軸 ── ISVとPoCの使いどころ
アーキテクトが最初にぶつかるのは「OOB(Out of the Box)で賄えるか、ISVを選ぶか、カスタム開発するか」の三叉路です。ここの判断軸がブレると、後工程のライセンス設計・運用コストすべてがズレていきます。
SMS送信は標準機能に存在しない
Power Platformの標準コネクタにはキャリアグレードのSMS送信機能は含まれていません。試験で「SMS通知を実装したい」と出てきたら、反射的にTwilio / Telesign などのISVソリューションまたはサードパーティコネクタを推奨する、と覚えておけば良いです。
電子サイン(eSignature)はAppSourceから導入する
契約書への電子署名を要件に含む場合、DocuSign / Adobe Sign といったISVソリューションをAppSourceから導入するのが正解です。「AppSourceからダウンロード」という言い方は正確ではなく、AppSourceは環境にインストールするプラットフォームなので、「導入する/構成する」という表現の方が実装イメージに近いです。
要件が曖昧な場合はPoCとトライアル環境
「顧客が何を欲しいか具体化できていない」状況でフル実装に突っ込むのはアーキテクトとして最悪の選択。まずPoC(概念実証)またはトライアル環境で要件を具体化するのが鉄則です。
ISV選定時はロードマップとライセンスコストの両輪で評価
ISVソリューションを採用するときは、機能の有無だけでなくロードマップ(製品が更新され続けるか)と独自のライセンスコストの2点を必ず評価します。ベンダー都合で更新が止まれば、数年後に全置換が必要になります。
1-2. ライセンスと権限モデルの境界線
コールセンターエージェントは Portalライセンス不要
Power Pages(旧Portal)のライセンスは外部ユーザー(B2Cの顧客や取引先など)向けに設計されたもの。社内のコールセンターエージェントは内部ユーザーなので、Dynamics 365 Customer Service などのD365ライセンスで足ります。
ポータルのIDプロバイダーは1つに絞るのが基本
Power Pagesで外部顧客のサインインを受ける際、IDプロバイダーは原則1つに絞るのが設計の標準解です。複数のIDプロバイダーを混在させることは技術的には可能ですが、運用複雑化・UX分断・アカウント重複のリスクが跳ね上がります。
1-3. データ戦略の全体像
製品情報の一次保存場所はDataverseテーブル
製品マスタのようなビジネスの中核データは、原則としてDataverseテーブルで管理します。SharePointリストやExcelに置くのはリスクが大きく、トランザクションの整合性・参照整合性・セキュリティロールによるアクセス制御を欠きます。
Dataverse → データレイク連携は2025年重要更新
ここは情報のアップデートが激しいエリアなので要注意です。「DataverseのデータをAzure Data Lakeへ」と聞くと昔は Export to Data Lake という機能名が出てきましたが、これは2024年11月1日で非推奨、2025年3月25日から段階的に廃止されています。
現在推奨されているのは以下の2択です。
| 選択肢 | 特徴 | 向いているシナリオ |
|---|---|---|
| Azure Synapse Link for Dataverse | 自社のストレージアカウントにDelta/Parquet形式で連続エクスポート。BYOD的な使い方。 | 既存のデータパイプライン資産がある。ストレージを自分で管理したい。 |
| Link to Microsoft Fabric | No-copy, No-ETL。Dataverseの境界内にデータを保持したまま、Fabric側から読み取り可能(read replica)。 | Fabric/Power BIで分析中心。データ移動のコスト・運用を減らしたい。 |
金額予測にCustomer Insightsはズレている
「売上金額を予測したい」という要件で Customer Insights を選ぶと減点対象です。Customer Insightsは顧客データ統合・セグメンテーション・CLTV分析を主眼にしたプラットフォームで、「売上金額の将来予測」は主戦場ではありません。
チャートの主戦場はD365ダッシュボード vs Power BI
| 用途 | 選ぶもの | 根拠 |
|---|---|---|
| シンプルな積み上げ・円・棒グラフで十分 | Dynamics 365 標準ダッシュボード | Dataverseと直結。構築・共有コスト低。 |
| クロスデータソース、複雑な計算、DAX、階層ドリルダウン | Power BI | DAX・リレーションシップ・RLSが強力。 |
Power PagesとD365ダッシュボードは「OOBで埋め込めない」
Power PagesにDynamics 365の標準ダッシュボードをOOBで埋め込む機能は用意されていません。これは試験に頻出する引っ掛けポイントです。
1-4. 非機能要件として整理すべきもの
試験では「これは機能要件か、非機能要件か?」を見分ける問題がよく出ます。「システムが何をするか」が機能要件、「どのように振る舞うべきか・品質特性」が非機能要件。
クレジットカード情報の非保存 → 非機能要件(セキュリティ)
役割ベースアクセス制御 → 非機能要件(セキュリティ)
「ユーザーが自分の役割に必要なデータと機能にのみアクセスできる」も非機能要件です。RBAC(Role-Based Access Control)はセキュリティという品質特性を定義するもの。
1-5. プロセス改善の選択肢2025年重要更新
ここも名称変更が激しいエリアです。「タスクマイニング」と「プロセスマイニング」の両方を含むソリューションで、昔は Process Advisor と呼ばれていましたが、現在はPower Automate Process Miningに統合されています。
| 古い名称(2023年以前) | 現在の名称(2025〜) | カバー範囲 |
|---|---|---|
| Process Advisor | Power Automate Process Mining | プロセスマイニング(システムログ起点)+タスクマイニング(画面録画起点)の両方を統合 |
② 実装・トラブルシュート・運用監視の勘所
要件を固めた後、実装フェーズとGo-live後のトラブルシュートで押さえるべき論点を、15項目に分けて整理します。ここは「現象 → 調査すべき場所 → 対処法」の型で覚えると効きます。
2-1. Power Pagesのコンポーネント設計
空き情報・在庫・予約可能レコードの一覧表示 → List
「ポータルに空き情報を並べたい」「予約可能な会議室を一覧表示したい」といった要件の答えは、ほぼ例外なくListコンポーネントです。
ポータルから外部APIを呼ぶ → コンポーネント+Web Template+Site Settings
Power Pagesから外部APIを呼びたいときは、以下の3点セットで実装します。
| 要素 | 役割 |
|---|---|
| コンポーネント(Web Component / React) | UI描画とユーザー操作の受付 |
| Web Template(Liquid) | サーバサイドで外部API呼び出しのラッパを作る |
| Site Settings | APIエンドポイントや認証トークンの設定値を外部化 |
429エラー(Too Many Requests)への対策最新パターン
ピーク時に429エラーが出る場合、以下の2方向で対策します。
| レイヤ | 対策 |
|---|---|
| クライアント側 | Retry-After ヘッダに従う指数バックオフ(exponential backoff) |
| サーバ側 | Custom API を作り、リトライ処理や操作のスロットリング制御を集約 |
Retry-After(または retry-after-ms)ヘッダが返るので、クライアントはこれに従って待機&再送するのが基本線。ただしポータルから直接Dataverse操作を連発する構成だとボトルネックが可視化しづらいので、操作をCustom API側にまとめてサーバサイドで制御する方がエンタープライズ運用では保守しやすいです。「操作の集約+リトライの一元化」がキーワード。メンテナンスモードはPower Platform管理センターから有効化
オムニチャネル強化や大型アップデートの前に、ダウンタイム中のメッセージを出したい場合は以下の手順です。
- Power Platform管理センター → Power Pagesサイト → 対象サイトを選択
- 「Site Actions」→「Enable maintenance mode」
- 「Custom page」を選び、独自のカスタムHTMLページのURLを指定
- そのページは公開アクセス可能であること
x-frame-options: SAMEORIGINヘッダを含めない(iframeで表示されるため)- 同じPower Pagesサイト上にホストしない(サイト自身がダウンしているとメンテページも落ちる)
2-2. Canvasアプリの実装パターン
CanvasにGoogleマップを出す → Launch + Image
Canvasアプリに地図機能を組み込むとき、Googleマップを使う場合は以下の組み合わせになります。
| やりたいこと | 関数・コントロール | しくみ |
|---|---|---|
| アプリ内に地図を画像として表示 | Image コントロール + Google Static Maps API URL |
緯度経度をURLパラメータに渡すと画像PNGが返ってくる |
| 別アプリ(Googleマップ)を起動 | Launch("https://maps.google.com/...") |
ブラウザまたはモバイルのマップアプリを外部で開く |
決済処理中のローディング表示 → Context変数+Visible
保険会社のCanvasアプリで「決済が完了するまでローディングアイコンを出したい」ような要件の実装は以下のパターン。
- 決済ボタンのOnSelectで
UpdateContext({isProcessing: true})を実行 - ローディングコントロールの
VisibleプロパティにisProcessingをバインド - 決済完了後、
UpdateContext({isProcessing: false})で非表示に戻す
起動が遅いときに調べる2つの数字
Canvasアプリの起動が遅い場合、確認するのは「データソース数」と「コントロール数」の2点です。
| 観点 | 目安 | 対策 |
|---|---|---|
| データソース数 | 30を超えると起動時間が顕著に増加 | 統合ビュー/集計ビューに置き換える、不要なものを削除 |
| コントロール数 | 500超で操作レスポンス悪化 | コンポーネント化、画面分割、仮想化 |
Canvasアプリの監視ツール3種の使い分け
| ツール | 見えるもの | 主な用途 |
|---|---|---|
| Application Insights | ユーザー操作ログ、エラー、カスタムテレメトリ | 画面単位の利用状況把握、エラーの原因調査 |
| Power Apps Analytics | アプリ・接続・サービスの稼働状況 | 「アプリやコネクタに障害がないか」の俯瞰 |
| Dataverse Analytics | API呼び出し回数、ストレージ消費 | API制限に近づいていないかの確認、ライセンス最適化 |
2-3. 複数アプリを使う場合のライセンス設計2024年以降の名称で整理
ライセンス計算は頻出トピックなので、2024年以降の名称で整理しておきます。
| シナリオ | 適切なライセンス | 金額目安 |
|---|---|---|
| Canvasアプリ1つだけを使う | Power Apps per app(1人1アプリ) | $5/user/app/月 |
| Canvas 2つ + モデル駆動型 3つ(合計5アプリ) | Power Apps Premium(旧 Per User Plan) | $20/user/月 |
2-4. 外部連携トラブル:調査の3点セット
同期がズレる・余計なビジネスロジックが走る
外部システムとDataverseを同期する構成で「データが合わない」「想定外のロジックが発火する」場合、確認する場所は以下の3点です。
| 確認先 | 見るもの |
|---|---|
| SDK(プラグインのトレース) | サーバサイドのカスタムロジックが何を実行したか |
| トレースログ | プラグイン・ワークフローの実行履歴と例外スタック |
| 監査(Audit) | レコード単位の変更履歴(誰が・いつ・何を) |
Go-live後にルックアップに値がない・重複・望ましくない更新
本番切り替え直後に起きがちな以下のような現象です。
- ルックアップ列の参照先が空になっている
- データが重複して入っている
- 意図しない上書き更新が走っている
このときの調査順は次の3点。
- SDK(プラグイン登録ツール)で、どのプラグインがどのイベントに登録されているか確認
- プロセス(ワークフロー)セッションで、実行履歴とエラーを確認
- 投入順序の確認 ── 参照元テーブル(マスタ)より先に参照先(トランザクション)を投入していないか
ポータル移行後「このメールアドレスは既に使用されています」
ポータル移行で旧システムから顧客データをDataverseに取り込んだ後、顧客がサインアップしようとすると「メールアドレスが既に使われています」とエラーになるケースがあります。
解決手順は次の2ステップ。
- 該当顧客にポータル招待を再送する(
adx_invitationの仕組み) - ポータル側のSite Settingsで、Dataverse連絡先テーブルとのマッピング設定を確認
Authentication/Registration/InvitationEnabled などが正しく有効化されている必要があります。2-5. ポータルにサインインできない
「ログインできない」症状への定番チェックは以下の2ステップ。
- ブラウザでサードパーティCookieとローカルデータを有効化
- ブラウザの履歴とキャッシュをクリア
2-6. Dataverseコネクタ経由の文書移行
旧システムからDynamics 365へ文書(Note、Attachment、File列)を移行する際、Dataverseコネクタを使う構成が基本形。Dataflows、Azure Data Factory、カスタムアプリなどで取り込み元を作り、Dataverseコネクタを介してD365側に書き込みます。
ソリューションの構想と要件分析
セクション1:ソリューションの構想と要件分析
Solution Envisioning & Requirement Analysis
- KPIは「ビジネス価値」として定義する
- 測定可能な指標(定量的)を優先
- ステークホルダーと合意形成が必須
- プロジェクト開始前に定義する(後付け不可)
- 例:応答時間削減率、手動作業削減時間、コスト削減額
- 技術的リスク(統合複雑性、データ品質)
- 組織リスク(変更管理、ユーザー採用)
- ライセンスリスク(コスト超過)
- スコープリスク(要件拡大)
- コンプライアンスリスク(データ居住地制限)
As-Is分析
非効率・ボトルネック
To-Be分析
何が足りないか
Impact × Effort
| ステークホルダー種別 | 主な関心事 | アーキテクトの対応 | 試験での頻出観点 |
|---|---|---|---|
| エグゼクティブ(CxO) | ROI、コスト、リスク | ビジネス価値を数値で提示 | KPIとROIの定義主体 |
| 業務部門マネージャー | 業務効率、使いやすさ | As-Is/To-Beプロセス整理 | 要件収集の主要対象者 |
| IT部門 | 技術整合性、保守性 | 既存システムとの統合検討 | エンタープライズアーキテクチャ評価 |
| エンドユーザー | 操作性、日常業務への影響 | ユーザー受け入れテスト設計 | 変更管理・採用戦略の対象 |
| 法務・コンプライアンス | データ保護、規制対応 | データ居住地・セキュリティ要件定義 | セキュリティレビュー要件 |
| 評価軸 | 確認内容 | Power Platform設計への影響 |
|---|---|---|
| 既存データソース | SQL Server、SAP、SharePoint等の存在と接続性 | コネクター選択、Dataverseへの移行 vs 仮想テーブル利用 |
| ID管理(Entra ID) | シングルテナント vs マルチテナント、ゲストユーザー | 環境設計、セキュリティグループ構成 |
| 既存のD365アプリ | Sales、CS、F&O等の導入状況 | Fit/Gap分析の基点。追加カスタマイズか別アプリか |
| ネットワーク・インフラ | オンプレミス資産、VPN、ファイアウォール | オンプレミスデータゲートウェイの要否判断 |
| データガバナンス要件 | GDPR、業界規制、データ保持ポリシー | 環境数・地理的分離・DLP設計 |
- 完全性:必須項目の充足率
- 正確性:実際の値との一致度
- 一意性:重複レコードの有無
- 適時性:データの鮮度・更新頻度
- 一貫性:複数ソース間の整合性
- ビジネスルール(業務ロジックでのアクセス制御)
- セキュリティロール(行・列レベルのアクセス)
- Entra ID要件(MFA、条件付きアクセス)
- セキュリティ境界(環境間・テナント間)
- データ損失防止(DLP)ポリシー
| 種別 | 定義 | 具体例 | Power Platformでの考慮先 |
|---|---|---|---|
| 機能要件 | システムが「何をするか」 | 案件の承認ワークフロー、顧客情報の表示 | アプリ設計、Automate フロー、D365設定 |
| 非機能要件 | システムが「どう動くか」 | 99.9%可用性、3秒以内の応答速度、1万ユーザー対応 | 環境設計、ライセンス、Azure統合判断 |
| 制約条件 | 設計の制限・前提 | 既存システムとの互換性、予算上限、期限 | コンポーネント選択の絞り込み条件 |
| 比較軸 | Canvas App | Model-Driven App | Power Pages |
|---|---|---|---|
| データ基盤 | 任意(SharePoint、SQL、Dataverse等) | Dataverse必須 | Dataverse必須 |
| UI設計 | ピクセル単位で自由設計 | データモデルから自動生成 | Webサイト標準デザイン |
| 主なユーザー | 現場・特定タスク向け | CRM/ERP業務担当者 | 外部ユーザー(匿名含む) |
| ビジネスロジック | 数式ベース(Power Fx) | サーバーサイド(プラグイン/ビジネスルール) | Liquid テンプレート+Power Automate |
| 向いているケース | 現場検査、スキャン入力、モバイル特化 | 複雑な業務プロセス、D365拡張 | 顧客ポータル、パートナーサイト |
| ライセンス | Premium(Dataverse接続時) | Premium | ページビュー課金 or ログインユーザー課金 |
| ALM(ソリューション管理) | ソリューション対応 | ソリューション対応(完全) | Webサイト単位でエクスポート |
| フロー種別 | トリガー | 実行環境 | 向いているケース | 注意点 |
|---|---|---|---|---|
| クラウドフロー (自動/インスタント/スケジュール) |
イベント・ボタン・スケジュール | クラウド | SaaS連携、通知、承認ワークフロー | 実行回数制限あり(ライセンス依存) |
| デスクトップフロー (RPA) |
クラウドフローから呼び出し or 手動 | ローカルPC・仮想マシン | レガシーシステム操作、画面操作の自動化 | Attended/Unattended の区別重要 |
| ビジネスプロセスフロー | レコード操作 | Dataverse上 | 段階的な業務プロセス誘導、ステージ管理 | Model-Driven App専用。Canvasでは使えない |
| Dataverse for Teams フロー | Teams内 | クラウド(Teams環境) | Teamsユーザー向け軽量プロセス | Teams環境のみ。Premiumコネクター不可 |
| Attended(有人) | Unattended(無人) | |
|---|---|---|
| ユーザーログイン | 必要(ユーザーPCで実行) | 不要(バックグラウンドで実行) |
| 実行タイミング | ユーザーが起動 | スケジュール・クラウドフローから起動 |
| ライセンス | Power Automate Premium | Power Automate Process(追加ライセンス必要) |
| 向いているケース | ユーザーが介在する半自動化 | 夜間バッチ、完全自動処理 |
| 判断軸 | 考慮すべき選択肢 | 選択理由 |
|---|---|---|
| データ接続方式 | Import vs DirectQuery vs Live Connection | Import:高速・定期更新。DirectQuery:リアルタイム必要時だがパフォーマンス注意。Live Connection:SSAS/Power BI Datasetへの接続 |
| 行レベルセキュリティ(RLS) | 静的RLS vs 動的RLS | 動的RLSはDAX式でUSERNAME()を使用。ユーザー数が多い場合に推奨 |
| 共有・配布方法 | ワークスペース共有 vs アプリ vs 埋め込み | 外部ユーザーへの配布にはPower BI Embeddedが必要(Azure SKU) |
| Microsoft Fabric連携 | Fabric Lakehouse / Warehouse | 大規模データ・エンタープライズ分析ではFabricが推奨。F64以上のSKUが必要 |
- 自然言語での問い合わせ対応(FAQ自動化)
- 24時間対応が必要なサポートチャネル
- Power Automate フローとの統合が必要
- Microsoft 365 / Teams チャネルへの展開
- コーディング不要でボット構築が必要
- 複雑なカスタムロジック(Azure Bot Serviceが適切)
- リアルタイム音声対応(Azure Cognitive Services)
- 高度なNLP・機械学習モデル統合
- 完全にコード制御が必要なシナリオ
OOB機能・設定で対応
業界特化・追加機能
フォーム・ビュー・ビジネスルール
Power Apps・Automate
プラグイン・PCF・API
| D365アプリ | 主な対象業務 | 向いている要件 | Gapが出やすい場面 |
|---|---|---|---|
| Sales | 営業管理・CRM | 商談管理、予測、AI提案 | 非標準の承認フロー、業界特化ロジック |
| Customer Service | サポート・ケース管理 | SLA管理、エスカレーション、ナレッジ | 高度な請求連携、現場サービス(FSが別) |
| Field Service | 現場保守・派遣 | スケジュール最適化、作業指示 | 製造固有の品質検査、特殊資材管理 |
| Finance & Operations | ERP(財務・SCM) | 財務諸表、在庫、調達 | Power Platform との直接Dataverse統合(Dual Write必要) |
| Customer Insights | CDP・マーケティング | 顧客統合プロファイル、セグメント | リアルタイムEvent処理(カスタムAPI必要) |
- 業界特化要件(医療・金融・製造)がある
- D365標準機能に明確なGapがある
- カスタム開発コストを抑えたい
- 既に市場で実績のあるソリューションがある
- 短期間での導入が求められる
- ISVのサポート継続性(倒産リスク)
- D365のメジャーアップデート時の互換性
- カスタマイズ可能範囲の制限
- 追加ライセンスコストの発生
- データプライバシー・セキュリティ審査
| 判断軸 | マイグレーション(移行) | 統合(インテグレーション) |
|---|---|---|
| 定義 | データをDataverseに完全移行し元システム廃止 | 元システムを残しリアルタイム/バッチ同期 |
| 向いているケース | レガシーシステムの廃止、単一SoR(信頼できる唯一のソース)化 | 基幹系は変えられない、複数システムの継続運用 |
| 主なツール | Dataverse import、Data Migration Tool、Azure Data Factory | Dataverseコネクター、Azure Logic Apps、API Management |
| 主なリスク | データ品質、変換ロジックの複雑さ、ロールバック困難 | データ不整合、同期遅延、障害時の対応 |
| 試験のポイント | 移行前のデータクレンジング・マッピングが必須 | SoR(Single Source of Record)を明確に定義すること |
| 比較軸 | Power Automate | Azure Logic Apps | Azure Functions |
|---|---|---|---|
| 主なユーザー | 業務ユーザー・市民開発者 | IT/開発者(エンタープライズ統合) | 開発者(コードベース) |
| 開発方法 | GUI(ローコード) | GUI+JSON定義(ローコード/プロコード) | コード(C#、JavaScript等) |
| コネクター数 | 1000以上(DLP対象) | 500以上(一部共通) | コードで任意のAPI呼び出し |
| 複雑な処理 | △(ループ・条件は可だが限界あり) | ○(複雑なワークフロー定義が可能) | ◎(制限なし) |
| ガバナンス | Power Platform管理センター・DLP | Azureリソースグループ・IAM | Azureリソースグループ・IAM |
| 長時間実行 | △(30日制限) | ○(Standard: 無制限、Consumption: 90秒) | △(Durable Functionsで対応) |
| 試験選択の判断軸 | 市民開発者が管理 / M365・D365との緊密な統合 | IT管理者が管理 / エンタープライズ統合 / B2B EDI | 複雑なカスタムロジック / 高パフォーマンス |
| 環境分離の理由 | 推奨構成 | なぜそうするか |
|---|---|---|
| 開発/テスト/本番の分離 | 最低3環境(Dev / Test / Prod) | ALMの基本。本番への直接変更は禁止(試験原則) |
| 地理的データ要件(GDPR等) | 地域別の環境を設ける | データ居住地(Data Residency)規制への対応 |
| 部門間のデータ分離 | ビジネスユニット or 別環境 | 過度な分離は管理コスト増。まずBU活用を検討 |
| 外部ユーザー向けポータル | 本番環境内でPower Pages | 別環境不要。Power Pagesは環境内で外部公開可能 |
| Microsoft Teams利用者向け軽量アプリ | Dataverse for Teams環境 | Premiumライセンス不要。Teamsユーザーは無料で利用可 |
| シナリオ | 適切なライセンス | 理由(なぜか) |
|---|---|---|
| 全社員がSharePointデータのみ使うシンプルなアプリ | Microsoft 365付属(追加不要) | Dataverse・Premiumコネクター不使用ならM365で足りる |
| Dataverseを使うモデル駆動型アプリのみ利用 | Power Apps Premium(旧:Per App / Per User) | Dataverse利用にはPremiumライセンスが必須 |
| 社員全員がRPAを使う(有人自動化) | Power Automate Premium(Per User with RPA) | デスクトップフロー実行にはRPA追加が必要 |
| 1台のPCでバックグラウンドRPA(無人) | Power Automate Process(旧:Unattended RPA Add-on) | Unattendedはマシン単位のライセンス。ユーザー課金と別 |
| 外部顧客向けPortalサイト(月10万PV) | Power Pages(ページビュー課金 or ログインユーザー) | 匿名ユーザーはPV課金。認証ユーザーはログインユーザー課金 |
| Power BI レポートをアプリに埋め込み(外部公開) | Power BI Embedded(A SKU / Azure課金) | 外部ユーザーへのPower BI埋め込みはPro/Premiumでは不可 |
- 外部データをDataverse内のテーブルとして見せる
- データはDataverseに保存されない
- リアルタイムで外部システムから取得
- OData 4.0準拠の外部サービスが必要
- Premiumコネクターは使えない
- 外部アプリからのAPIアクセス不可
- 環境あたりの容量上限:2GB
- 本番業務の重要データ保管には不適
- Microsoft 365ライセンスのみで利用可能
- Teams内でのチーム向け軽量アプリに最適
- 必要になればPower Apps環境にアップグレード可
- F&O(ERP)とDataverse間のリアルタイム双方向同期
- Customer Engagement(CE)アプリとの統合に使用
- マッピングテーブルの設定が必要
- 信頼性:回復力・フェイルオーバー設計
- セキュリティ:最小権限・ゼロトラスト
- 運用効率:ALM・監視・DevOps
- パフォーマンス効率:スケーラビリティ設計
- 経験優位性:UX・採用・変更管理
| シナリオのキーワード | 示唆する正解方向 | なぜか |
|---|---|---|
| 「外部のパートナー・顧客が使う」 | Power Pages | 外部ユーザーへのポータルはPower Pagesが専用製品 |
| 「業務担当者が自分でメンテナンスする」 | Power Automate / Canvas App(ローコード) | プロコード不要。市民開発者が維持できる仕組みが求められる |
| 「複雑なビジネスロジック・サーバー処理」 | Model-Driven App + プラグイン | プラグインはサーバーサイドで確実に実行される。Canvasでは不可 |
| 「レガシーシステムのGUI操作を自動化」 | Power Automate Desktop(RPA) | APIがない画面操作にはRPAが唯一の手段 |
| 「Microsoft Teamsユーザー向けの軽量ツール」 | Dataverse for Teams + Power Apps for Teams | 追加ライセンスなし。Teams内で完結する軽量ユースケース |
| 「大量データのリアルタイム分析・AI」 | Power BI + Microsoft Fabric | Fabricはエンタープライズデータ分析基盤。大規模はFabricが適切 |
| 「D365をすでに持っており機能を拡張したい」 | AppSource ISV → カスタム開発の順で検討 | 標準機能→AppSource→カスタムの優先順位が試験の基本原則 |
| 「オンプレミスのSQLに接続が必要」 | オンプレミスデータゲートウェイ | クラウドから社内SQLにアクセスするにはゲートウェイが必須 |
| 「複数テナントのデータを1つのアプリで扱う」 | マルチテナント Entra ID 設定 + ゲストアクセス | テナント間共有にはEntra IDのゲストユーザーまたはB2B設定が必要 |
| 誤った選択 | 正しい選択 | 誤答の原因と正しい理解 |
|---|---|---|
| 「UIが複雑 → Canvas App」 | 要件次第でModel-Driven | UIの自由度だけで選ばない。データモデルの複雑さ・ロジックの種類で選ぶ |
| 「全員に同じアプリを共有」 | セキュリティロールで制御 | アプリ共有はアクセス許可の一部。データアクセスはセキュリティロールで別途制御 |
| 「データ統合 → 全部Power Automate」 | 大量データはADF or Logic Apps | Power AutomateはAPIベースの統合向き。大量バッチはAzure Data Factoryが適切 |
| 「Dataverse for Teams → 本番利用OK」 | 重要業務には通常のDataverse環境 | 容量制限・Premiumコネクター不可・外部API不可。軽量用途のみ |