title: Azure AI Foundry と Dify のアーキテクチャ再構成
date: '2026-07-24'
created: '2026-07-24T01:53:19.058246Z'
updated: '2026-07-24T06:03:55.762616Z'
account: 権藤祥太郎 (shotaro.gondo@gmail.com)
conversation_id: a48070f5-47c6-4fdf-8330-f4de1e37bd3a
source: claude-chat-export
tags:


Azure AI Foundry と Dify のアーキテクチャ再構成

🧑 User

2026-07-24T01:53:20.137713Z

https://note.glidelow.com/claude/chats/2026-06-11-azure-ai-foundry-dify-agentic-ai-5b9b2611/

ここで提案されている Azure AI Foundry, Dify, GitHub のスタックを、以下の条件にあうように再構成してください。なお、Dify とその他の基盤コンポーネントとの接続性の技術的フィージビリティの考慮も含めて構成を作成してください。


🤖 Claude

2026-07-24T01:56:58.859898Z

元記事の構成は「GitHub Issues と ServiceNow を本番オペレーションの動線に組み込む」設計になっていましたが、ご提示の条件では開発基盤と本番統制の動線を完全に切り離す必要があります。その前提で再構成しました。


1. 再構成の基本方針 — 4プレーン分離

プレーン 構成要素 責務 本番タスクの起票/発行
開発プレーン Chainlit/Gradio、Azure AI Foundry、Dify(開発WS)、GitHub 自動化ワークフローの開発・テスト・資産管理 しない
統制プレーン ServiceNow(+ スコープ外の発注ポータル) 本番運用/デプロイタスクの唯一の起点・承認・状態管理・監査 起点
実行プレーン Azure Functions / AKS、Dify Runtime ワークフローの実行 統制プレーンからのみ起動
作用プレーン Ansible Tower/AWX → 各対象環境 Playbook 実行 prod/test を Org 単位で分離

元記事との最大の差分は、GitHub Actions を本番実行のトリガー経路から完全に外す点です。GitHub は「開発資産の SoT(Source of Truth)」に純化し、本番の SoT は ServiceNow チケットになります。


2. 全体構成

開発プレーン(本番動線から隔離)

  開発者
    │ 操作(開発・デバッグ・テスト実行のみ)
    ▼
┌─────────────────────────────────────────────────────────┐
│ Chainlit / Gradio  … 開発者専用の補助UI                   │
│   ※ エンドユーザー/ビジネスユーザーは使用しない            │
└──────┬──────────────────────────┬───────────────────────┘
       ▼                          ▼
┌──────────────────┐      ┌──────────────────┐
│ Azure AI Foundry │      │ Dify (開発WS)     │
│ Agent / PromptFlow│      │ Workflow 開発     │
└──────┬───────────┘      └──────┬───────────┘
       │ コード/エージェント定義      │ DSL(YAML) export
       ▼                          ▼
┌─────────────────────────────────────────────────────────┐
│ GitHub                                                  │
│  Repo    : 開発資産のバージョン管理                        │
│  Issues  : 開発作業のみの Epic/Story/Task 進捗管理         │
│  Actions : 開発CI/CD(lint / test / eval / 各環境へ配備)  │
└─────────────────────────────────────────────────────────┘
       │ 配備(Actions = CD の終点はここまで)
       ▼
  実行エンジン(Functions/AKS)・Dify 実行WS へアーティファクト反映

統制・実行プレーン(本番動線)

【スコープ外】サービスオーダー用ポータル
        │ 起票
        ▼
╔═══════════════════════════════════════════════════════════╗
║ ServiceNow  … 本番運用/デプロイタスクの唯一の起点            ║
║   承認 → 実行命令 → 状態遷移 → クローズ / 監査証跡          ║
╚══╤═══════════════════╤══════════════════════╤═════════════╝
   │ ①直接実行          │ ②実行命令(双方向)    │ ③実行命令(FS次第・双方向)
   │                   │   ▲ 結果/進捗          │   ▲ 結果/進捗
   ▼                   ▼   │                   ▼   │
   │      ┌────────────────────────┐   ┌────────────────────┐
   │      │ Azure Functions / AKS   │   │ Dify Runtime        │
   │      │ Foundry製ワークフロー     │   │ Dify製ワークフロー   │
   │      │ の実行エンジン(Python)    │   │ (Dify基盤上で実行)  │
   │      └───────────┬────────────┘   └─────────┬──────────┘
   │                  │ ⑤                        │ ④(FS次第)
   ▼                  ▼                          ▼
┌──────────────────────────────────────────────────────────┐
│ Ansible Tower / AWX   ── Organization: ops-prod           │
└─────────────────────────┬────────────────────────────────┘
                          ▼
            本番環境(Azure / オンプレ / 他クラウド)

テスト実行経路(開発プレーンから許可される唯一の実行)

Chainlit / Gradio
   └→ Azure AI Foundry / Dify(開発WS)
        └→ 実行エンジン(dev/test インスタンス) / Dify(test)
             └→ AWX Organization: ops-test  →  テスト環境のみ
   ※ ServiceNow を経由しない。ops-prod へは到達不能(NW+RBAC で遮断)

3. トリガー経路の定義

# 起点 経路 対象 実現方式
ServiceNow → AWX 本番 IntegrationHub Ansible Spoke / REST(MID Server)
ServiceNow ⇄ Functions/AKS 双方向 本番 SN→: Flow Designer REST step + APIM
→SN: Table API / Scripted REST(work notes・state 更新)
ServiceNow ⇄ Dify 双方向 本番 SN→: Dify Service API POST /v1/workflows/run
→SN: Dify HTTP Request ノード(後述の制約あり)
Dify → AWX 単方向 本番/テスト HTTP Request ノード → /api/v2/job_templates/{id}/launch/
Functions/AKS → AWX 単方向 本番/テスト awxkit / requests(Durable Functions 推奨)
Chainlit/Gradio → Foundry/Dify 単方向 テストのみ 実行コンテキストに env=test を強制
GitHub Actions → Functions/AKS/Dify 単方向 配備のみ OIDC + Workload Identity Federation

4. Dify の接続性 — 技術的フィージビリティ評価

ご要望の「フィージビリティ次第」の部分を個別に評価します。結論として、Dify は self-hosted(AKS または Container Apps、AWX/ServiceNow と同一 VNet)を前提にしてください。 Dify Cloud では閉域到達性が確保できず、④③のいずれも成立しません。

④ Dify → Ansible Tower/AWX : ◎ 実現可能

③-a ServiceNow → Dify : ○ 実現可能(シム推奨)

③-b Dify → ServiceNow : ○ 実現可能(用途を限定)

⑦ GitHub → Dify のCD : △ 部分的(半自動を許容)

まとめ

接続 判定 主な前提
Dify → AWX self-hosted Dify、非同期前提、Survey でパラメータ制約
ServiceNow → Dify APIM/Functions シム、非同期応答
Dify → ServiceNow 結果書き戻し用途に限定、トークン管理を工夫
GitHub → Dify (CD) DSL は SoT 化可、反映は半自動を許容
Dify の汎用 Webhook 受信 存在しない。必ずシムを挟む

5. 「本番/テスト」を構造的に強制するガードレール

条件の中で最も破られやすいのが「開発プレーンから本番タスクを発行しない」です。ポリシー文書ではなく構造で不能にすることを推奨します。

  1. AWX の Organization 完全分離
    ops-prod / ops-test で Inventory・Credential・Job Template・Team を分離。Chainlit/Foundry(dev)/Dify(dev) に払い出すトークンは ops-test のみに紐づく。
  2. ticket-bound execution token
    実行エンジン(Functions/AKS)と Dify ワークフローの入力契約に envservicenow_ticket_sys_id を必須化。env=prod の場合、実行前に ServiceNow へ逆引きし、チケットが実在し承認済み state であることを検証してから AWX を起動する。この検証を通らない限り prod Job Template は叩けない。
  3. ネットワーク分離
    ops-prod の AWX エンドポイントは開発 VNet / 開発用 Dify から到達不能にする。
  4. 相関ID
    全実行に ServiceNow チケット番号(テスト時は run id)を correlation ID として貫通させ、AWX の extra_vars と job description に必ず埋め込む。

6. GitHub の位置づけ

repo/
  foundry/            Agent 定義 / Prompt Flow / 評価データセット
  engine/             Azure Functions / AKS 用 Python 実行エンジン
  dify/               Dify アプリの DSL(YAML)、プロンプト、テストケース
  contracts/          実行要求スキーマ(JSON Schema)、ServiceNow ペイロード契約
  ansible/            Playbook / Role(別リポジトリ分離も可)
  .github/workflows/  CI: lint/unit test/プロンプト評価
                      CD: Functions・AKS への配備、Dify DSL 反映

7. 実装上の注意点


再構成の要点は、「GitHub Actions を本番トリガーから外し、その役割を ServiceNow に集約したこと」「Dify を self-hosted 前提にして、インバウンドは APIM/Functions のシム越し、アウトバウンドは非同期 fire-and-forget に統一したこと」 の2点です。どちらかについて、シーケンス図レベルまで具体化することもできます。


🧑 User

2026-07-24T01:58:35.687584Z

Dify は社内サービスとして提供されているもので、社内ネットワーク閉域内に構築されたものか Dify Cloud を活用したものかの確認ができていません。閉域内に構築されたものだとすると、上記のフィージビリティは変わりますか?


🤖 Claude

2026-07-24T02:00:44.008982Z

はい、変わります。ただし「閉域だから内部リソースに届く」という単純な改善方向ではなく、判定軸そのものが移ります。


1. 結論

Dify Cloud の場合 閉域内に構築されている場合
Dify → AWX(④) ほぼ不可 到達性は改善するが、Dify の SSRF 対策で既定ブロックの可能性あり
ServiceNow → Dify(③-a) 容易 MID Server 経由が必須級に
Dify → ServiceNow(③-b)※SN が SaaS の場合 容易 プロキシ許可が必要。閉域完全遮断なら不可
GitHub → Dify の CD(⑦) 困難 さらに困難(self-hosted runner 必須+権限)

そして最も重要なのは、「閉域か否か」より「社内共有サービスであること(=自チームに管理権限がないこと)」の方が制約として大きいという点です。判定軸は以下の3つに移ります。

  1. ネットワーク到達性(閉域なら改善)
  2. Dify 基盤側の設定変更権限(共有サービスなら自チームにはない)
  3. テナント分離の粒度(dev / test / 本番実行を分けられるか)

2. 閉域構築で新たに効いてくる技術的な落とし穴

⑴ Dify の SSRF 対策が内部 IP を既定でブロックする ← 最重要

Dify の公式仕様として、HTTP ノードや画像ダウンロードを含む Dify からの外向き HTTP リクエストはすべてプロキシ経由でルーティングされ、SSRF 攻撃を防ぐためにプライベート IP レンジ宛のリクエストがブロックされます。

つまり Dify が閉域内にあっても、HTTP Request ノードから AWX(プライベート IP)を叩けるとは限りません。 既定構成では逆に弾かれます。回避には基盤側で以下のいずれかが必要です。

いずれも基盤運用者側の作業であり、テナントである開発チームでは変更できません。これは前回の回答で「self-hosted なら到達可能」と書いた部分の重要な補正です。

⑵ ssrf_proxy のタイムアウト

HTTP Request ノードの通信は既定で内部の ssrf_proxy コンテナを経由し、そのタイムアウトは 120 秒程度と短く、調整用のパラメータも用意されていないという報告があります。回避策は前項同様 NO_PROXY 除外です。

前回「推奨」とした fire-and-forget(Playbook 完了を Dify で待たない)設計は、閉域共有 Dify では事実上「必須」になります。

⑶ プラグイン/Marketplace が使えない

閉域では marketplace.dify.ai に到達できないため、プラグインの追加インストールは(基盤側でプロキシ設定がされていない限り)不可です。結果として、外部連携手段は組み込みの HTTP Request ノードのみになります。前回提案した「HTTP ノード中心の構成」はこの点でも妥当ですが、選択肢が無いことを前提に置いてください。

⑷ ServiceNow が SaaS なら、方向が逆転する


3. 「社内共有サービス」であることの制約(技術以前の問題)

閉域構築か Cloud かに関わらず、他部門が運用する共有 Dify である場合、以下が構成の成否を分けます。

論点 影響
ワークスペース/テナントを dev・test・本番実行用に分けられるか 分けられない場合、前回設計の「Dify(開発WS)」と「Dify Runtime(本番)」の分離が成立しない。→ 本番実行を Dify から Functions/AKS へ寄せる判断が必要
Service API(App API Key)の払い出しが許可されているか 不可なら ServiceNow → Dify は成立せず
NO_PROXY / ssrf_proxy ACL の個別許可申請ができるか 不可なら Dify → AWX は成立せず
バージョンアップのタイミングと事前通知 SLA 運用者都合の upgrade で DSL 互換性が壊れるリスク
実行ログ・監査ログをテナントが取得できるか 本番運用タスクの監査証跡要件を満たせるか
可用性 SLA 共有 PoC 基盤レベルなら、本番運用タスクの実行基盤に据えるのは危険
シークレット管理 ワークスペースの環境変数に平文で置く形になり、Key Vault 連携が無い。Dify に渡す権限は最小化必須

CI/CD についての補足

DSL のインポートは現状フロントエンド UI からのみ可能で、ヘッドレス/自動化用途のための公式なインポート API の追加は機能要望として起票されている段階です。実質的には Console API(/console/api/login でアクセストークンを取得して /console/api/apps を叩く)を使うしかなく、共有サービスでこの認証情報を得られる可能性は低いと考えるべきです。

また エクスポートされる DSL には、Tool ノードに設定済みのサードパーティ API キーなどの認証情報は含まれません。これは GitHub にシークレットが混入しない点で好都合ですが、環境ごとの認証情報は別管理が必須であることを意味します。

現実解:dify/*.yaml を GitHub の SoT にして PR レビューは必須化。実環境への反映は UI からの手動インポート(承認記録付き)を許容する。 バージョン管理の要件(条件④)はこれで満たせます。


4. サービス提供元に確認すべき事項

構成を確定する前に、以下を Dify 基盤の運用部門に確認してください。上から重要度順です。

  1. デプロイ形態:閉域 self-hosted か、Dify Cloud か、VPC 版か。バージョンは何か
  2. ワークスペース分離:用途別(開発/テスト/本番実行)に独立したワークスペースを払い出せるか
  3. Service API:App API Key の払い出しは許可されているか。エンドポイントは何か
  4. アウトバウンド許可:HTTP Request ノードから社内プライベート IP(AWX)へ到達できるか。NO_PROXY / ssrf_proxy ACL の個別申請フローはあるか
  5. インターネット egress:SaaS(ServiceNow)への外向き通信は許可されるか。プロキシ設定は入っているか
  6. タイムアウト:ワークフロー実行時間上限、HTTP ノードのタイムアウト値
  7. アップグレード方針:頻度、事前通知、DSL 互換性の扱い
  8. 可用性 SLA と監査ログ:本番オペレーションの実行基盤として耐えるか
  9. ServiceNow 側:MID Server の有無と、Dify セグメントへの到達可否

5. 確認が取れるまでの推奨方針(no-regret な設計)

どちらの形態でも手戻りが出ない打ち手として、以下を先に固めておくことを勧めます。

  1. 本番運用/デプロイタスクの実行主体は Azure Functions / AKS を第一候補にする。
    Dify を本番実行エンジンとして前提に置かない。Dify は「開発・PoC・テスト環境向けタスク・人手承認を挟む低クリティカリティの処理」に役割を寄せる。これは条件を満たしたまま、Dify 側の制約に構成全体が引きずられるのを防ぎます。

  2. ServiceNow ⇄ Dify は必ず中継(APIM / Azure Functions)を挟む前提で設計する。
    直結できる形態であっても、冪等性・署名検証・リトライ・監査を Dify に持たせられない以上、中継は無駄になりません。閉域構成なら MID Server → 中継 → Dify の経路になります。

  3. Dify に渡す権限を最小化する。
    具体的には AWX の ops-test Organization のみに紐づくトークン、または ServiceNow の work notes 追記のみのスコープ。閉域でもシークレットは環境変数に平文で載るため、ここは形態に関わらず効きます。

  4. contracts/(実行要求スキーマ)を先に確定する。
    Dify で実装するか Functions で実装するかが後から入れ替わっても、インターフェースが固定されていれば ServiceNow 側の Flow 実装は作り直しになりません。これが最大の保険です。


確認結果が判明した段階で、該当ケースに合わせて構成図とシーケンスを具体化できます。特に「ワークスペース分離が可能かどうか」で本番実行基盤の置き場所の判断が変わるため、そこを優先して確認されるとよいかと思います。


🧑 User

2026-07-24T02:07:20.347186Z

「5. 確認が取れるまでの推奨方針(no-regret な設計)」で、現段階版の構成図とシーケンスを具体化してください。Dify は比較的簡易な業務フローユースケースについて補助的に活用して開発工数を節約する趣旨であり、主に Azure AI Foundry 上で開発される状況を想定しています。


🤖 Claude

2026-07-24T02:10:14.056329Z

Dify を「補助・簡易ユースケース限定」、Azure AI Foundry を主開発基盤とする前提で、現段階(Dify 基盤の仕様が未確認)でも手戻りが出ない構成に具体化します。


1. 現段階版の設計原則

# 原則 狙い
P1 ServiceNow は「実行したいこと(task_code)」だけを知る。実装がどこにあるかは知らない Dify ↔ Foundry の実装移設で ServiceNow 側を改修不要にする
P2 統合中継層(Integration Gateway)を単一の統制点にする 認証・冪等性・本番ガード・監査を Dify の外に置く
P3 Dify は「判断・変換」を担い、「作用(AWX 起動)」はさせない ssrf_proxy 制約・タイムアウト・監査欠落を回避。将来 Foundry へ移設しやすい
P4 AWX の起動口を Gateway に一本化する 実行主体が誰であれ監査証跡が1箇所に集まる
P5 長時間処理は必ず非同期(202 + コールバック) Dify のタイムアウト制約に全体を引きずられない

P3 が現段階版の要です。前回整理した「Dify → AWX 直結(④)」は技術的には成立し得ますが、フィージビリティ確認が取れるまでは採用せず、Dify は構造化された実行指示を Gateway に返すだけにします。確認が取れた後に直結へ切り替える場合も、変更箇所は Gateway のタスクカタログ設定のみで済みます。


2. 構成図(現段階版)

開発プレーン

  開発者
    │
    ▼
┌──────────────────────────────────────────────────────────┐
│ Chainlit / Gradio(開発者専用UI・テスト実行のみ)             │
└───────┬──────────────────────────────┬───────────────────┘
        ▼                              ▼
┌────────────────────────┐   ┌────────────────────────┐
│ Azure AI Foundry【主】  │   │ Dify【従・簡易ケース】    │
│ Agent / Prompt Flow    │   │ Workflow(判断・変換)    │
│ 評価・プロンプト管理     │   │ ※簡易フローの工数削減用   │
└──────────┬─────────────┘   └──────────┬─────────────┘
           │ コード/定義                    │ DSL(YAML) 手動 export
           ▼                              ▼
┌──────────────────────────────────────────────────────────┐
│ GitHub                                                   │
│  Repo : foundry/ engine/ gateway/ dify/ contracts/       │
│  Issues : 開発作業のみ(ServiceNow とは連携しない)          │
│  Actions: CI(lint/test/eval/schema検証)                  │
│           CD(Functions・AKS へ配備/Dify は差分レビューのみ)│
└──────────────────────────────────────────────────────────┘

統制・実行プレーン

【スコープ外】サービスオーダー用ポータル
        │ 起票
        ▼
╔═════════════════════════════════════════════════════════╗
║ ServiceNow  … 本番タスクの唯一の起点/状態の SoT           ║
║   知っているのは task_code とパラメータのみ                 ║
╚═════╤═══════════════════════════════════▲════════════════╝
      │ ①実行命令 POST /v1/executions      │ 進捗・結果の書き戻し
      │ (OAuth2 CC、必要なら MID Server)   │ (work notes / state)
      ▼                                    │
┌──────────────────────────────────────────┴────────────────┐
│ 統合中継層 Integration Gateway                             │
│  Azure API Management + Durable Functions               │
│  ・認証/認可  ・スキーマ検証  ・冪等性(request_id)         │
│  ・本番ガード(チケット逆引き検証)                          │
│  ・タスクカタログによるルーティング                          │
│  ・実行状態管理  ・コールバック集約  ・監査ログ               │
└───┬────────────────────┬──────────────────────┬──────────┘
    │ impl=foundry        │ impl=dify             │ impl=awx-direct
    ▼                     ▼                        │
┌────────────────────┐  ┌──────────────────────┐   │
│ 実行エンジン         │  │ Dify Runtime          │   │
│ Azure Functions/AKS│  │ Service API 経由で起動  │   │
│ (Foundry製・主)    │  │ 判断/変換のみ・作用なし │   │
│  └→ Foundry の推論   │  │  └→ 実行指示(JSON)を   │   │
│     エンドポイント参照 │  │     Gateway へ返却 ───┼───┤
└─────────┬──────────┘  └──────────────────────┘   │
          │                                         │
          ▼                                         ▼
┌───────────────────────────────────────────────────────────┐
│ Ansible Tower / AWX                                       │
│   Organization: ops-prod / ops-test(完全分離)             │
└───────────────────────┬───────────────────────────────────┘
                        ▼            ▲ 完了 Notification Webhook
             本番環境/テスト環境       └→ Gateway が受信し ServiceNow へ

テスト実行経路

Chainlit / Gradio
  └→ Foundry / Dify(開発WS)
       └→ Gateway  POST /v1/executions  { env: "test" }
            └→ 実行エンジン(test) → AWX ops-test → テスト環境
  ※ env="test" の資格情報では ops-prod のジョブテンプレートに到達不能

3. 中核となる2つの契約(これを先に固定する)

⑴ 実行要求スキーマ contracts/execution-request.schema.json

{
  "type": "object",
  "required": ["request_id", "task_code", "env", "source", "parameters"],
  "properties": {
    "request_id":   { "type": "string", "format": "uuid" },
    "task_code":    { "type": "string", "pattern": "^[A-Z]+-[A-Z0-9-]+$" },
    "task_version": { "type": "string" },
    "env":          { "enum": ["prod", "test"] },
    "source": {
      "type": "object",
      "required": ["channel"],
      "properties": {
        "channel":        { "enum": ["servicenow", "devui"] },
        "ticket_number":  { "type": "string" },
        "ticket_sys_id":  { "type": "string" },
        "ticket_table":   { "type": "string" },
        "requested_by":   { "type": "string" }
      }
    },
    "parameters":     { "type": "object" },
    "correlation_id": { "type": "string" }
  },
  "allOf": [{
    "if":   { "properties": { "env": { "const": "prod" } } },
    "then": { "properties": { "source": {
                "required": ["ticket_sys_id", "ticket_table"],
                "properties": { "channel": { "const": "servicenow" } } } } }
  }]
}

最後の allOf が**「本番タスクは ServiceNow 起点でしか受け付けない」をスキーマレベルで強制する部分**です。Chainlit/Gradio からの要求は channel: devui になるため、env: prod を指定した時点でスキーマ検証で落ちます。

応答は常に非同期です。

HTTP 202 Accepted
{ "execution_id": "exec-01J...", "status": "accepted",
  "status_url": "/v1/executions/exec-01J..." }

⑵ タスクカタログ contracts/task-catalog.yaml

tasks:
  - task_code: OPS-VM-RESTART            # 標準ケース:Foundry製
    version: "1.2.0"
    impl: foundry
    executor: { function: exec-ops-vm-restart }
    awx: { organization: "ops-{env}", job_template: "vm-restart" }
    allowed_env: [prod, test]
    approval_state_required: ["Scheduled", "Implement"]
    timeout_min: 30

  - task_code: OPS-REQ-TRIAGE            # 簡易ケース:Dify製(判断のみ)
    version: "1.0.1"
    impl: dify
    dify:
      app_id: "xxxxxxxx"
      api_key_ref: "kv://dify-app-req-triage"
      response_mode: streaming
      max_wait_sec: 60                   # ssrf_proxy 制約への安全マージン
    post_action:                         # 作用は Gateway 側が実施
      type: awx_launch
      awx: { organization: "ops-{env}", job_template: "{result.job_template}" }
    allowed_env: [prod, test]
    timeout_min: 5

  - task_code: OPS-PATCH-APPLY           # 素通し:ServiceNow→AWX 直
    impl: awx-direct
    awx: { organization: "ops-{env}", job_template: "patch-apply" }
    allowed_env: [prod, test]
    timeout_min: 120

impl の値を書き換えるだけで Dify → Foundry の移設が完了する構造にしておくことが、no-regret の実体です。ServiceNow 側は task_code しか知らないため無改修で済みます。


4. シーケンス

シーケンス A:本番運用/デプロイタスク(Foundry製・標準ケース)

① Portal → ServiceNow        チケット起票(スコープ外)
② ServiceNow                 承認 → state 遷移 → Flow Designer 発火
③ ServiceNow → Gateway       POST /v1/executions
                             { request_id, task_code:"OPS-VM-RESTART",
                               env:"prod", source:{channel:"servicenow",
                               ticket_sys_id, ticket_table}, parameters }
                             認証: OAuth2 client credentials(閉域なら MID Server 経由)

④ Gateway                    スキーマ検証 → 失敗なら 400 即返却
⑤ Gateway                    冪等チェック(request_id が既存なら既存 execution_id を返す)
⑥ Gateway → ServiceNow       GET /api/now/table/{table}/{sys_id}      ★本番ガード
                             ・チケットが実在するか
                             ・state が approval_state_required に含まれるか
                             ・task_code とチケットのカタログ項目が一致するか
                             → 不一致なら 403 + work notes に拒否理由を記録して終了
⑦ Gateway → ServiceNow       202 { execution_id }/work notes に受付を記録
⑧ Gateway                    Durable Orchestrator 起動(correlation_id = チケット番号)

⑨ Orchestrator → Executor    Foundry製ワークフローの実行エンジンを起動
⑩ Executor → Foundry         必要に応じて推論エンドポイントを呼び、パラメータを確定
⑪ Executor → Gateway         確定した AWX 実行指示を返却(作用はここでは行わない)
⑫ Gateway → AWX              POST /api/v2/job_templates/{id}/launch/
                             extra_vars に correlation_id / execution_id を必ず埋め込む
                             → 201 job_id を記録
⑬ Orchestrator               WaitForExternalEvent("awx-completed")  ← ポーリングしない

⑭ AWX → 本番環境              Playbook 実行
⑮ AWX → Gateway              Notification Template(Webhook)で完了通知
⑯ Gateway                    job_id → execution_id を突合(照合できない通知は破棄)
⑰ Gateway → ServiceNow       PATCH /api/now/table/{table}/{sys_id}
                             ・work notes に結果サマリ(job_id / 所要時間 / 対象ホスト数)
                             ・state を Review / Closed へ遷移
⑱ Gateway                    監査ログ確定(correlation_id で全ホップを追跡可能)

⑬ が長時間 Playbook に耐える鍵です。Durable Functions の外部イベント待機を使い、Gateway 側もポーリングしません。⑫で extra_vars に ID を埋めているため、⑯の突合が成立します。

シーケンス B:本番運用タスク(Dify製・簡易ケース)

①〜⑧  シーケンス A と完全に同一(ServiceNow から見て違いは無い)

⑨  Orchestrator → Dify   POST {DIFY}/v1/workflows/run
                         Authorization: Bearer <App API Key>(Key Vault から取得)
                         response_mode: "streaming"
                         inputs: { correlation_id, parameters }
⑩  Dify                  ワークフロー実行(LLM による分類・パラメータ抽出・
                         定型文生成など。外部システムへの作用は行わない)
⑪  Dify → Orchestrator   構造化された実行指示 JSON を返却
                         例: { job_template:"vm-restart", hosts:[...], reason:"..." }
⑫  Orchestrator          返却 JSON を出力スキーマで検証        ★重要
                         → 検証失敗/max_wait_sec 超過なら中断し
                            ServiceNow へ「要人手対応」で書き戻して終了
⑬  Gateway → AWX         post_action に従い job_template を起動(=作用は Gateway)

⑭〜⑱  シーケンス A と同一

Dify の役割が ⑩〜⑪の「判断・変換」だけに閉じています。この形なら以下がすべて回避できます。

そして条件「Dify で開発されたワークフローは Dify 基盤上で実行される」は満たしたままです。

シーケンス C:テスト実行(Chainlit / Gradio 起点)

① 開発者 → Chainlit/Gradio   自然言語または フォームで指示
② UI → Foundry / Dify        開発WS のワークフローを起動
③ Foundry/Dify → Gateway     POST /v1/executions
                             { env:"test", source:{ channel:"devui",
                               requested_by:"<Entra ID の oid>" } }
                             認証: 開発者の Entra ID トークン(オンビハーフ)
④ Gateway                    スキーマ検証
                             → env:"prod" は allOf 制約で 400(構造的に不能)
⑤ Gateway                    task_code の allowed_env に "test" が含まれるか確認
⑥ Gateway → AWX(ops-test)    テスト用 Organization のジョブテンプレートのみ起動可能
                             ※ Gateway の test 用マネージド ID には
                                ops-prod への権限を一切付与しない(二重防御)
⑦ AWX → テスト環境            Playbook 実行
⑧ AWX → Gateway → UI         結果を開発者へ返却(ServiceNow への書き戻しは行わない)

④のスキーマ制約と⑥の RBAC の二重で本番到達を封じます。 ④だけだと Gateway の実装バグで破れるため、権限側でも切っておく点が重要です。

シーケンス D:開発CI/CD(GitHub)

【Foundry 系・完全自動】
① 開発者          feature ブランチで engine/ gateway/ foundry/ を変更 → PR
② GitHub Actions  CI: lint / unit test / contracts のスキーマ検証
                      / タスクカタログの整合チェック(impl と executor の存在確認)
                      / Foundry の評価データセットによるプロンプト回帰テスト
③ レビュー承認 → main マージ
④ GitHub Actions  CD: OIDC (Workload Identity Federation) で Azure 認証
                      → test 環境の Function App / AKS へ配備
⑤ 受け入れテスト(シーケンス C)
⑥ GitHub Actions  CD: environments の承認ゲート付きで prod スロットへ配備
                      → スロットスワップ

【Dify 系・半自動】
① 開発者          Dify UI でワークフローを編集 → DSL(YAML) を export
② 開発者          dify/<app>.yaml を差し替えて PR
③ GitHub Actions  CI: YAML 構文 / 出力スキーマ定義との整合チェック
                      / シークレット混入検査(DSL には認証情報が含まれない前提の検証)
④ レビュー承認 → main マージ(★ここでバージョン管理の要件を満たす)
⑤ 手動            実行用ワークスペースへ UI からインポート
                  → 実施記録を PR にコメントで残す(承認証跡)

Dify のインポート API が公開されていない現状では⑤が手動になりますが、「GitHub の YAML が正、Dify 上の実体は写像」というルールを CI で担保しておけば、後日 API が利用可能になった時点で⑤を Actions に置き換えるだけで済みます。


5. 異常系の扱い

事象 Gateway の挙動 ServiceNow への反映
スキーマ検証エラー 400 即返却、実行しない Flow 側でエラー記録、state 変更なし
チケット状態が不正(未承認等) 403、実行しない work notes に拒否理由
同一 request_id の再送 既存 execution_id を 202 で返す(再実行しない) 変更なし
Dify が max_wait_sec 超過 実行中断、impl を切り替えず人手対応へ work notes に「Dify 応答なし・要人手」+ state: On Hold
Dify の返却 JSON がスキーマ不適合 AWX を起動しない 同上(作用前に落ちるので副作用なし
AWX ジョブ失敗 完了 Webhook を受信し失敗として確定 work notes に失敗ログ抜粋 + state: Review
AWX 完了 Webhook が届かない timeout_min 経過で Orchestrator がタイムアウト判定 「実行状態不明・要確認」で人手エスカレーション
ServiceNow への書き戻し失敗 指数バックオフでリトライ、超過で DLQ 運用チームへアラート(実行自体は完了済み)

「Dify の失敗が本番環境への副作用に繋がらない」ことが、この配置の最大の利点です。


6. 確認結果に応じた変更箇所

前回挙げた確認事項が判明した際に、どこを変えれば済むかを対応付けておきます。

確認結果 変更箇所 影響範囲
Dify → AWX が到達可能(NO_PROXY 許可が取れた) タスクカタログの post_action を Dify 内実行に変更 Gateway 設定のみ。ServiceNow・Foundry は無改修
Dify のワークスペース分離が不可 該当タスクの implfoundry に変更 Gateway 設定+ engine/ の実装追加。ServiceNow 無改修
Dify の Service API 払い出し不可 同上(Dify を開発時のプロトタイピング専用に降格) 同上
ServiceNow → Gateway に MID Server が必要 ServiceNow の Flow 設定のみ Gateway 以降は無改修
Dify の SLA が本番要件に満たない impl: dify のタスクを test 環境限定に(allowed_env: [test] タスクカタログのみ
Dify のインポート API が使用可能に シーケンス D ⑤を Actions 化 CI/CD のみ

いずれのケースでも ServiceNow 側の実装(Flow Designer / カタログ項目)は改修不要です。ここが確定しているので、Dify の確認を待たずに ServiceNow 連携と Gateway の実装を先行着手できます。


7. 着手順の推奨

  1. contracts/(実行要求スキーマ・タスクカタログの定義)を確定 ← 最優先。他の全作業の前提
  2. Gateway(APIM + Durable Functions)の骨格と本番ガードを実装
  3. ServiceNow の Flow Designer 実装 + 1タスクでの疎通(impl: awx-direct の素通しが最短)
  4. Foundry 製ワークフロー1件を impl: foundry で実装し、シーケンス A を通す
  5. Chainlit/Gradio からのテスト経路(シーケンス C)を整備
  6. Dify の確認結果が出た段階で、簡易ユースケース1件を impl: dify で追加

3 で AWX 素通しを先に通しておくと、Gateway・ServiceNow・AWX の3者間の認証とコールバック経路の検証が Foundry の実装完了を待たずに済みます。


Gateway の Durable Functions のオーケストレーターコードや、ServiceNow 側の Flow Designer の具体的なステップ構成まで落とし込むこともできます。どちらを先に詰めますか。


🧑 User

2026-07-24T05:44:01.893015Z

上記のアスキーアートによる構成図はズレて適切に閲覧ができません。https://note.glidelow.com/claude/chats/2026-06-11-azure-ai-foundry-dify-agentic-ai-5b9b2611/ この記事中の図のように正しく表示できる形式で出力してください。


🤖 Claude

2026-07-24T05:50:10.398849Z

ASCII の図を SVG に描き直します。内容は前回と同一で、表現のみ変更します。

まず開発プレーンです。

🖼️ Diagram: development_plane_foundry_primary_dify_secondary

開発プレーンの構成Chainlit/Gradio から Azure AI Foundry と Dify を操作し、開発資産を GitHub で管理する構成


開発プレーン


Chainlit / Gradio
開発者専用UI





Azure AI Foundry
主開発基盤



Dify
簡易ユースケース補助





GitHub
開発資産の SoT・開発Issue・開発CI/CD

Foundry が主、Dify は簡易ユースケース補助という比重で、両者の成果物はいずれも GitHub に集約されます。GitHub のスコープは開発作業のみで、本番の動線には一切登場しません。

次が中核となる統制・実行プレーンです。

🖼️ Diagram: control_and_execution_plane_gateway_centric

統制プレーンと実行プレーンの構成ServiceNow を起点に統合中継層 Gateway が実行エンジンと Dify Runtime を呼び分け、AWX の起動を Gateway に一本化する構成



サービスオーダーポータル
スコープ外


起票


ServiceNow
本番タスクの唯一の起点


実行命令 / 結果


統合中継層 Integration Gateway
認証・冪等性・本番ガード・監査





実行エンジン
Azure Functions / AKS



Dify Runtime
判断・変換のみ


起動

完了通知


Ansible Tower / AWX
ops-prod / ops-test 分離




対象環境
Azure / オンプレ / 他クラウド

この図で注目していただきたいのは、実行エンジンからも Dify Runtime からも AWX へ直接の線が引かれていないことです。両者は Gateway と双方向にやり取りするだけで、AWX を起動するのは Gateway のみ(図の左側を回り込む線)。これが原則 P3 と P4 の実体で、次の3つを同時に満たします。

AWX の完了通知(右側を回り込む線)も Gateway が受けるため、ServiceNow への書き戻しは常に Gateway が担います。

次に、本番タスクが流れる際のシーケンスです。

🖼️ Diagram: production_execution_sequence_with_impl_branch

本番運用タスクの実行シーケンスServiceNow の実行命令から Gateway の検証と本番ガードを経て、Foundry 実行エンジンまたは Dify Runtime に分岐し、Gateway が AWX を起動して ServiceNow へ書き戻すまでの流れ



ServiceNow
承認後に実行命令を発行




Gateway 受付
スキーマ検証・冪等性チェック




Gateway 本番ガード
チケット逆引きで状態を検証





実行エンジン
Foundry 製ワークフロー



Dify Runtime
判断・変換のみ・作用なし





Gateway が AWX 起動
extra_vars に相関IDを埋込




AWX が対象環境へ実行
完了は Webhook で Gateway へ




Gateway が ServiceNow へ書き戻し
work notes・state 更新

分岐している中段が、シーケンス A(Foundry 製)と B(Dify 製)の唯一の違いです。ServiceNow から見ればどちらも同じ POST /v1/executions であり、task_codeimpl 値によって Gateway が呼び分けます。

段階 シーケンス A(Foundry 製) シーケンス B(Dify 製)
呼び出し先 Function App / AKS の実行エンジン Dify Service API POST /v1/workflows/run
待機方式 Durable Functions の外部イベント待機 streamingmax_wait_sec 以内に完結
返却物 AWX 実行指示(パラメータ確定済み) 構造化 JSON(判断結果・生成テキスト)
検証 契約スキーマで検証 出力スキーマで検証。不適合なら AWX を起動せず中断
失敗時の副作用 なし(起動前に停止) なし(起動前に停止)

Dify の失敗が対象環境に届く前に必ず Gateway で止まる点が、Dify を本番動線に載せるうえでの安全余裕になっています。

最後にテスト実行経路です。

🖼️ Diagram: test_only_execution_path_with_prod_blocked

テスト実行経路Chainlit/Gradio から Foundry または Dify を経由し Gateway が env=test のみ受理して AWX の ops-test に到達する経路。ops-prod へはスキーマと RBAC で遮断される



Chainlit / Gradio
開発者専用UI




Foundry / Dify
開発ワークスペース




Integration Gateway
env: test のみ受理


遮断


AWX ops-prod
到達不能




AWX ops-test
テスト用 Organization




テスト環境
ServiceNow への書き戻しなし

右側の遮断は二重で担保します。実行要求スキーマの allOf 制約により channel: devui では env: prod が構造的に指定できず、加えて test 用マネージド ID に ops-prod の権限を一切付与しないため、Gateway の実装バグがあっても本番には到達しません。

なお前回提示した contracts/execution-request.schema.jsoncontracts/task-catalog.yaml、異常系の扱い、確認結果に応じた変更箇所の対応表は、いずれもコードブロックと表なので表示上の問題はないはずです。そのまま有効な内容としてご参照ください。

次に詰めるとすれば、Gateway の Durable Functions オーケストレーターのコードか、ServiceNow の Flow Designer のステップ構成のいずれかになります。


🤖 Claude

2026-07-24T05:52:18.348391Z

先ほどのアスキーアートを、図として描画し直します。構成図3点とシーケンス図1点に分けて出力します。

まず開発プレーンです。Azure AI Foundry を主開発基盤、Dify を簡易ユースケース限定の補助として配置し、両者の成果物を GitHub に集約します。

🖼️ Diagram: dev_plane_foundry_dify_github

開発プレーンの構成Chainlit と Gradio から Azure AI Foundry と Dify を操作し、開発資産を GitHub で管理する構成図Chainlit / Gradio開発者専用UIAzure AI Foundry主開発基盤Dify従・簡易ユースケースGitHub開発資産の SoT

Visualizer が応答しないため、同等の SVG 図をファイルとして出力します。

4点の図を SVG で描画しました。等幅フォント依存のアスキーアートと違い、環境によらず崩れずに表示されます。

各図の要点は以下の通りです。

図1(開発プレーン) — Chainlit/Gradio は Foundry と Dify の両方を操作しますが、この層から本番タスクは出ません。成果物は Foundry がコード、Dify が DSL(YAML) という形で GitHub に集約されます。

図2(統制・実行プレーン) — 左側の「直接起動」が impl: awx-direct、右側の「完了通知」が AWX の Notification Webhook です。Dify Runtime だけが AWX に線を持たず、Gateway との双方向矢印で終わっている点が P3(Dify に作用させない)の表現です。

図3(本番実行シーケンス) — 琥珀色の手順3が唯一の本番ガードです。ここを通らない限り AWX には到達しません。手順4で Dify を経由する場合も、返却 JSON の検証に失敗すれば手順5に進まないため、副作用が出る前に止まります。

図4(テスト実行経路) — 赤の破線が「Gateway のスキーマ制約と RBAC で遮断される経路」です。図2と図4で AWX が別の Organization として描かれているのが分離の実体になります。

ファイルはブラウザで開くほか、各 SVG を切り出して設計書に貼り込むこともできます。図の粒度や表記(日本語/英語、ボックスの分割単位など)を調整したい場合はお知らせください。


🧑 User

2026-07-24T06:02:34.950410Z

Architecture diagrams をこのチャットで回答として表示してください。


🤖 Claude

2026-07-24T06:03:55.762616Z

🖼️ Diagram: dev_plane_foundry_dify_github

開発プレーンの構成Chainlit と Gradio から Azure AI Foundry と Dify を操作し、開発資産を GitHub で管理する構成Chainlit / Gradio開発者専用UIAzure AI Foundry主開発基盤Dify従・簡易ユースケースGitHub開発資産の SoT

図1は開発プレーンです。この層から本番タスクは出ず、成果物は Foundry がコード、Dify が DSL(YAML) という形で GitHub に集約されます。

次が統制・実行プレーンです。ServiceNow が唯一の起点となり、AWX への起動口は Gateway に一本化されています。

🖼️ Diagram: control_execution_plane_servicenow_gateway_awx

統制・実行プレーンの構成ポータルから ServiceNow を経由し、Integration Gateway が実行エンジンと Dify Runtime を制御して AWX を起動する構成サービスオーダー用ポータル本スコープ外ServiceNow本番タスクの唯一の起点Integration GatewayAPIM + Durable Functions実行エンジンFunctions / AKSDify Runtime判断・変換のみ直接起動完了通知Ansible Tower / AWXops-prod / ops-test を分離本番環境

左端の「直接起動」が impl: awx-direct、右端の「完了通知」が AWX の Notification Webhook です。Dify Runtime だけが AWX に線を持たず Gateway との双方向で終わっている点が、原則 P3(Dify に作用させない)の表現になっています。紫が Foundry 系の主経路、青緑が Dify、朱色が統制、灰色が共通・外部です。

続いて、その本番動線を時系列に展開したシーケンスです。

🖼️ Diagram: prod_execution_sequence_servicenow_to_awx

本番運用タスクの実行シーケンスServiceNow からの実行命令を Gateway が検証し、AWX で実行して結果を書き戻すまでの7手順ServiceNow → Gateway実行命令 POST /v1/executionsGatewayスキーマ検証・冪等チェックGateway → ServiceNow(本番ガード)チケットを逆引き検証し不一致は 403Gateway → 実行エンジン / Difyワークフロー実行・パラメータ確定Gateway → AWXジョブ起動(作用は Gateway が実施)AWX → Gateway完了 Webhook を外部イベントで受信Gateway → ServiceNowwork notes 記録・state 遷移

琥珀色の手順3が唯一の本番ガードです。ここを通らない限り AWX には到達しません。手順4で Dify を経由する場合も、返却 JSON の検証に失敗すれば手順5に進まないため、副作用が出る前に止まります。

最後がテスト実行経路です。

🖼️ Diagram: test_execution_path_ops_test_isolation

テスト実行経路と本番ガードChainlit と Gradio からの実行はテスト用 Organization にのみ到達し、本番用 Organization は遮断される構成Chainlit / Gradioenv=test 固定Foundry / Dify 開発WSテスト用ワークフローIntegration Gateway二重の本番ガード遮断AWX ops-testテスト用 OrganizationAWX ops-prod到達不能テスト環境

赤い破線が、Gateway のスキーマ制約と RBAC の二重で遮断される経路です。図2と図4で AWX が別の Organization として描かれているのが、本番とテストの分離の実体になります。

図の粒度や表記(ボックスの分割単位、日本語/英語の混在具合など)を調整したい場合はお知らせください。