<p><meta data="style_prompt"/>{“project_title”: “Azure AI Foundry/M365高度連携ソリューション”, “expertise_level”: “Senior Cloud Architect”, “keywords”: [“Azure AI Studio”, “Hosted Agent”, “Microsoft Graph”, “Entra ID”, “AI Workflow Orchestration”], “date”: “2024-07-26”, “version”: “1.0”}
<!-- style_prompt.txtの指示により、絶対先頭にメタデータを出力しました。 -->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">Azure AI Foundry Hosted Agentを活用した高度AIワークフローとM365データ連携</h1>
<h2 class="wp-block-heading">【導入】</h2>
<p>複雑な意思決定、外部データ検索、およびM365の実行アクションを統合した、堅牢で監査可能な生成AIワークフローの構築課題を解決します。</p>
<h2 class="wp-block-heading">【アーキテクチャ設計】</h2>
<p>本ソリューションは、Azure AI Studioのオーケストレーション能力を核とし、Hosted Agentを通じてMicrosoft 365の実行可能なアクション(例:Teams通知、SharePointデータ検索・更新)をセキュアに統合します。Azure FunctionsをGraph APIのプロキシとして機能させることで、AIエージェントとM365間のセキュリティ境界を明確にします。</p>
<h3 class="wp-block-heading">コンポーネント間の関係性解説</h3>
<ol class="wp-block-list">
<li><p><strong>Azure AI Studio Flow (Orchestrator)</strong>:ユーザーからの要求を受け取り、タスクの分解と次のステップを決定します。</p></li>
<li><p><strong>Hosted Agent (Tooling/RAG)</strong>:フローによって呼び出され、特定のタスク(例:データ検索、M365アクション)を実行します。このエージェントは、Azure Functionsを外部ツールとして定義します。</p></li>
<li><p><strong>Azure Functions (M365 Proxy)</strong>:Entra IDのマネージドIDを使用して認証されたスコープでのみMicrosoft Graph APIを呼び出します。これにより、AIワークフローから直接M365リソースへのアクセスを避け、最小権限の原則を適用します。</p></li>
<li><p><strong>Entra ID & Managed Identity</strong>:システム間の認証と認可の基盤を提供します。</p></li>
</ol>
<h3 class="wp-block-heading">Mermaid図解</h3>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["User/External Trigger"] -->|API Call| B("Azure AI Studio Flow Orchestrator")
B -->|Tool Call (Request)| C["Hosted Agent (RAG/Tooling)"]
C --> D{"Azure OpenAI Service (GPT-4o)"}
C --> E["Azure Functions(\"M365 Proxy\")"]
E --> F("(Microsoft Graph API"))
F --> G["M365 (Teams/SharePoint)"]
D -->|LLM Response| C
E -->|Action Status| C
C -->|Final Result| B
B -->|Output| A
subgraph Security & Identity
H["Entra ID"]
I["Managed Identity"]
H --- B
I --- E
I --- F
end
style D fill:#f9f,stroke:#333
style G fill:#ccf,stroke:#333
classDef cloud resource_group:
#e6e6e6 , stroke:
#000 ;
</pre></div>
<h2 class="wp-block-heading">【実装・デプロイ手順】</h2>
<p>この手順では、Azure AI Hub、Azure Functions (Python), および必要な権限設定を行います。</p>
<h3 class="wp-block-heading">1. Azure AI Hubと関連リソースのデプロイ (Bicep)</h3>
<p>AIワークスペース、Azure OpenAI、Key Vaultを含むリソースグループを作成します。</p>
<pre data-enlighter-language="generic">param location string = resourceGroup().location
param resourcePrefix string = 'aiwf'
resource aiHub 'Microsoft.MachineLearningServices/workspaces@2024-04-01' = {
name: '${resourcePrefix}-aihub'
location: location
kind: 'Hub'
identity: {
type: 'SystemAssigned'
}
properties: {
// 適切な設定を追記 (VNet統合など)
}
}
resource aoai 'Microsoft.CognitiveServices/accounts@2023-10-01' = {
name: '${resourcePrefix}-aoai'
location: location
sku: {
name: 'S0'
}
kind: 'OpenAI'
properties: {
customSubDomainName: '${resourcePrefix}-aoai'
}
}
output aiHubName string = aiHub.name
output aoaiName string = aoai.name
</pre>
<h3 class="wp-block-heading">2. Azure FunctionsのデプロイとManaged Identityの有効化 (Azure CLI)</h3>
<p>M365連携を担うFunction Appを作成し、システム割り当てマネージドIDを有効にします。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># 変数の設定
RG_NAME="rg-ai-workflow-prod"
LOCATION="eastus"
FN_APP_NAME="fn-m365proxy-prod"
STORAGE_NAME="sa${FN_APP_NAME}01"
# Function App用のストレージアカウントを作成
az storage account create --name $STORAGE_NAME --location $LOCATION --resource-group $RG_NAME --sku Standard_LRS
# Function Appを作成(Python 3.11, Consumption Plan)
az functionapp create \
--resource-group $RG_NAME \
--consumption-plan-location $LOCATION \
--name $FN_APP_NAME \
--storage-account $STORAGE_NAME \
--runtime python \
--runtime-version 3.11 \
--os-type Windows
# システム割り当てマネージドIDを有効化
PRINCIPAL_ID=$(az functionapp identity assign --name $FN_APP_NAME --resource-group $RG_NAME --query principalId -o tsv)
echo "Function App Managed Identity Principal ID: $PRINCIPAL_ID"
</pre>
</div>
<h3 class="wp-block-heading">3. Microsoft Graph API権限の付与 (Microsoft Graph PowerShell)</h3>
<p>Function AppのマネージドIDに対し、M365テナント内で必要なGraph権限を付与します。この例では、Teamsメッセージ送信とSharePointの読み取り権限を設定します。(テナント管理者による同意が必要)</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># Graph PowerShell SDKを使用
# Function AppのPrincipal IDを$PrincipalIdに設定
$PrincipalId = "<上記CLIで取得したPRINCIPAL_ID>"
$AppName = "<Function Appの表示名>" # Entra IDで識別しやすい名称
# アプリケーション(Function AppのManaged Identity)を検索
$ServicePrincipal = Get-MgServicePrincipal -Filter "AppId eq '$PrincipalId'"
# 必要な権限スコープ (例: Teams.Send, Sites.Read.All)
$RequiredScopes = @(
"Teams.Send"
"Sites.Read.All"
)
# ... (テナントレベルでの同意付与プロセスを実行)
# 注:Managed Identityに対するGraph権限付与は、セキュリティ上の理由から複雑であり、
# 通常はEntra IDで対応するアプリケーション登録を作成し、そのSPNに同意を付与します。
# Function Appの設定では、Key Vault経由でクライアントシークレットを安全に管理し、
# アプリケーションとしてOAuth2.0 Client Credentialsフローを使用することが推奨されます。
</pre>
</div>
<h2 class="wp-block-heading">【アイデンティティとセキュリティ】</h2>
<h3 class="wp-block-heading">1. 権限(RBAC)と最小権限の原則</h3>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">サービス</th>
<th style="text-align:left;">主体</th>
<th style="text-align:left;">ロール/スコープ</th>
<th style="text-align:left;">目的</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;">Azure AI Hub</td>
<td style="text-align:left;">開発者/AIエンジニア</td>
<td style="text-align:left;">Cognitive Services Contributor, Azure AI Developer</td>
<td style="text-align:left;">モデルデプロイ、フロー開発</td>
</tr>
<tr>
<td style="text-align:left;">Azure Functions</td>
<td style="text-align:left;">System Assigned Managed Identity</td>
<td style="text-align:left;">Key Vault Secrets Reader</td>
<td style="text-align:left;">M365 API認証情報(クライアントシークレット)取得</td>
</tr>
<tr>
<td style="text-align:left;">Entra ID (M365 Proxy SPN)</td>
<td style="text-align:left;">Azure Functions (SPN)</td>
<td style="text-align:left;"><code>Teams.Send</code> (Application), <code>Sites.Read.All</code> (Application)</td>
<td style="text-align:left;">Graph API経由でのM365アクション実行</td>
</tr>
<tr>
<td style="text-align:left;">Azure OpenAI</td>
<td style="text-align:left;">Azure AI Hub Managed Identity</td>
<td style="text-align:left;">Cognitive Services User</td>
<td style="text-align:left;">LLMへのアクセス</td>
</tr>
</tbody>
</table></figure>
<h3 class="wp-block-heading">2. M365連携のセキュリティ境界</h3>
<ul class="wp-block-list">
<li><p><strong>Hosted Agent</strong>は、M365 Graph APIに直接アクセスせず、中間層であるAzure Functionsを呼び出す<strong>ツール定義</strong>として機能します。</p></li>
<li><p>Azure Functionsは、Graph APIアクセスに<strong>アプリケーションとしてのManaged Identity</strong>を使用し、ユーザー認証(委任された権限)を避け、セキュリティリスクを低減します。</p></li>
</ul>
<h3 class="wp-block-heading">3. 条件付きアクセスとDefender連携</h3>
<ul class="wp-block-list">
<li><p><strong>AI Studioアクセス</strong>: 開発者のAI Studioポータルへのアクセスには、Entra ID条件付きアクセスを利用し、MFA必須化や信頼できるネットワークからのアクセスを強制します。</p></li>
<li><p><strong>Defender for Cloud</strong>: AI Hub、Azure Functions、Azure Key Vaultに対してDefender for Cloudを有効化し、異常なAPI呼び出しパターンや構成の脆弱性を継続的に監視します。</p></li>
<li><p><strong>データ保護</strong>: RAGに使用されるデータソース(Azure Storage/Cosmos DB)は、VNet統合されたAI StudioとFunctionsからのみアクセス可能とし、パブリックエンドポイントを無効化します。</p></li>
</ul>
<h2 class="wp-block-heading">【運用・コスト最適化】</h2>
<h3 class="wp-block-heading">1. 可観測性の確保</h3>
<ul class="wp-block-list">
<li><p><strong>統合ロギング</strong>: Azure AI Studioのフロー実行ログ、Azure Functionsの実行ログ、およびAzure OpenAIの利用ログをすべて<strong>Azure Monitor Log Analytics Workspace</strong>に集約します。</p></li>
<li><p><strong>分散トレーシング</strong>: Application InsightsをFunctionsとAI StudioのカスタムPythonコードに組み込み、Hosted AgentからM365アクション完了までのレイテンシと失敗箇所を詳細に追跡できるようにします。</p></li>
<li><p><strong>コストトラッキング</strong>: AI Studio内のモデル呼び出しは、タグ付けによりプロジェクトごとにコストを明確化します。</p></li>
</ul>
<h3 class="wp-block-heading">2. コスト最適化の戦略</h3>
<ul class="wp-block-list">
<li><p><strong>Azure Functions SKU</strong>: M365連携Function Appは、頻繁に呼び出されるがバースト性の高いワークロードであるため、従量課金プラン(Consumption Plan)を選択し、アイドル時のコストをゼロに抑えます。</p></li>
<li><p><strong>Azure OpenAI デプロイ</strong>: 利用頻度が高いモデル(例: GPT-4o)については、コスト削減のため予約済みキャパシティ(Provisioned Throughput Units: PTU)の利用を検討します。開発・テスト環境ではPay-as-you-goの標準デプロイを使用します。</p></li>
<li><p><strong>ストレージ最適化</strong>: RAGに使用されるEmbeddingデータ(Azure AI Search)やデータソースは、アクセス頻度に応じて適切なストレージ層(例: 開発環境はStandard、本番はPremium)を選択します。</p></li>
</ul>
<h2 class="wp-block-heading">【まとめ】</h2>
<p>Azure AI Foundry Hosted AgentとM365連携を統合する際の成功のための要点は以下の3点です。</p>
<ol class="wp-block-list">
<li><p><strong>Hosted Agentの役割の限定</strong>: Hosted Agentは、M365の実行ロジックを直接保持せず、セキュリティとスケーラビリティを確保するため、常にAzure Functionsなどの外部サービスをツールとして呼び出す設計を徹底します。</p></li>
<li><p><strong>Entra IDによる認証分離</strong>: AIワークフロー、M365プロキシ(Functions)、およびM365 Graph API間の認証は、すべてManaged Identityと最小権限スコープを用いたアプリケーション認証に分離し、APIキーやユーザー資格情報の利用を回避します。</p></li>
<li><p><strong>非同期ワークフローの設計</strong>: M365アクション(特にTeams通知や大規模なSharePoint検索)はレイテンシが高くなる可能性があるため、AI Studio Flowの設計時に非同期コールバックやロングランニング・オペレーションの管理機構(PollingまたはLogic Appsへのハンドオフ)を組み込むことが落とし穴を避ける鍵となります。</p></li>
</ol>
{“project_title”: “Azure AI Foundry/M365高度連携ソリューション”, “expertise_level”: “Senior Cloud Architect”, “keywords”: [“Azure AI Studio”, “Hosted Agent”, “Microsoft Graph”, “Entra ID”, “AI Workflow Orchestration”], “date”: “2024-07-26”, “version”: “1.0”}
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証) です。
Azure AI Foundry Hosted Agentを活用した高度AIワークフローとM365データ連携
【導入】
複雑な意思決定、外部データ検索、およびM365の実行アクションを統合した、堅牢で監査可能な生成AIワークフローの構築課題を解決します。
【アーキテクチャ設計】
本ソリューションは、Azure AI Studioのオーケストレーション能力を核とし、Hosted Agentを通じてMicrosoft 365の実行可能なアクション(例:Teams通知、SharePointデータ検索・更新)をセキュアに統合します。Azure FunctionsをGraph APIのプロキシとして機能させることで、AIエージェントとM365間のセキュリティ境界を明確にします。
コンポーネント間の関係性解説
Azure AI Studio Flow (Orchestrator) :ユーザーからの要求を受け取り、タスクの分解と次のステップを決定します。
Hosted Agent (Tooling/RAG) :フローによって呼び出され、特定のタスク(例:データ検索、M365アクション)を実行します。このエージェントは、Azure Functionsを外部ツールとして定義します。
Azure Functions (M365 Proxy) :Entra IDのマネージドIDを使用して認証されたスコープでのみMicrosoft Graph APIを呼び出します。これにより、AIワークフローから直接M365リソースへのアクセスを避け、最小権限の原則を適用します。
Entra ID & Managed Identity :システム間の認証と認可の基盤を提供します。
Mermaid図解
graph TD
A["User/External Trigger"] -->|API Call| B("Azure AI Studio Flow Orchestrator")
B -->|Tool Call (Request)| C["Hosted Agent (RAG/Tooling)"]
C --> D{"Azure OpenAI Service (GPT-4o)"}
C --> E["Azure Functions(\"M365 Proxy\")"]
E --> F("(Microsoft Graph API"))
F --> G["M365 (Teams/SharePoint)"]
D -->|LLM Response| C
E -->|Action Status| C
C -->|Final Result| B
B -->|Output| A
subgraph Security & Identity
H["Entra ID"]
I["Managed Identity"]
H --- B
I --- E
I --- F
end
style D fill:#f9f,stroke:#333
style G fill:#ccf,stroke:#333
classDef cloud resource_group: #e6e6e6, stroke: #000;
【実装・デプロイ手順】
この手順では、Azure AI Hub、Azure Functions (Python), および必要な権限設定を行います。
1. Azure AI Hubと関連リソースのデプロイ (Bicep)
AIワークスペース、Azure OpenAI、Key Vaultを含むリソースグループを作成します。
param location string = resourceGroup().location
param resourcePrefix string = 'aiwf'
resource aiHub 'Microsoft.MachineLearningServices/workspaces@2024-04-01' = {
name: '${resourcePrefix}-aihub'
location: location
kind: 'Hub'
identity: {
type: 'SystemAssigned'
}
properties: {
// 適切な設定を追記 (VNet統合など)
}
}
resource aoai 'Microsoft.CognitiveServices/accounts@2023-10-01' = {
name: '${resourcePrefix}-aoai'
location: location
sku: {
name: 'S0'
}
kind: 'OpenAI'
properties: {
customSubDomainName: '${resourcePrefix}-aoai'
}
}
output aiHubName string = aiHub.name
output aoaiName string = aoai.name
2. Azure FunctionsのデプロイとManaged Identityの有効化 (Azure CLI)
M365連携を担うFunction Appを作成し、システム割り当てマネージドIDを有効にします。
# 変数の設定
RG_NAME="rg-ai-workflow-prod"
LOCATION="eastus"
FN_APP_NAME="fn-m365proxy-prod"
STORAGE_NAME="sa${FN_APP_NAME}01"
# Function App用のストレージアカウントを作成
az storage account create --name $STORAGE_NAME --location $LOCATION --resource-group $RG_NAME --sku Standard_LRS
# Function Appを作成(Python 3.11, Consumption Plan)
az functionapp create \
--resource-group $RG_NAME \
--consumption-plan-location $LOCATION \
--name $FN_APP_NAME \
--storage-account $STORAGE_NAME \
--runtime python \
--runtime-version 3.11 \
--os-type Windows
# システム割り当てマネージドIDを有効化
PRINCIPAL_ID=$(az functionapp identity assign --name $FN_APP_NAME --resource-group $RG_NAME --query principalId -o tsv)
echo "Function App Managed Identity Principal ID: $PRINCIPAL_ID"
3. Microsoft Graph API権限の付与 (Microsoft Graph PowerShell)
Function AppのマネージドIDに対し、M365テナント内で必要なGraph権限を付与します。この例では、Teamsメッセージ送信とSharePointの読み取り権限を設定します。(テナント管理者による同意が必要)
# Graph PowerShell SDKを使用
# Function AppのPrincipal IDを$PrincipalIdに設定
$PrincipalId = "<上記CLIで取得したPRINCIPAL_ID>"
$AppName = "<Function Appの表示名>" # Entra IDで識別しやすい名称
# アプリケーション(Function AppのManaged Identity)を検索
$ServicePrincipal = Get-MgServicePrincipal -Filter "AppId eq '$PrincipalId'"
# 必要な権限スコープ (例: Teams.Send, Sites.Read.All)
$RequiredScopes = @(
"Teams.Send"
"Sites.Read.All"
)
# ... (テナントレベルでの同意付与プロセスを実行)
# 注:Managed Identityに対するGraph権限付与は、セキュリティ上の理由から複雑であり、
# 通常はEntra IDで対応するアプリケーション登録を作成し、そのSPNに同意を付与します。
# Function Appの設定では、Key Vault経由でクライアントシークレットを安全に管理し、
# アプリケーションとしてOAuth2.0 Client Credentialsフローを使用することが推奨されます。
【アイデンティティとセキュリティ】
1. 権限(RBAC)と最小権限の原則
サービス
主体
ロール/スコープ
目的
Azure AI Hub
開発者/AIエンジニア
Cognitive Services Contributor, Azure AI Developer
モデルデプロイ、フロー開発
Azure Functions
System Assigned Managed Identity
Key Vault Secrets Reader
M365 API認証情報(クライアントシークレット)取得
Entra ID (M365 Proxy SPN)
Azure Functions (SPN)
Teams.Send (Application), Sites.Read.All (Application)
Graph API経由でのM365アクション実行
Azure OpenAI
Azure AI Hub Managed Identity
Cognitive Services User
LLMへのアクセス
2. M365連携のセキュリティ境界
3. 条件付きアクセスとDefender連携
AI Studioアクセス : 開発者のAI Studioポータルへのアクセスには、Entra ID条件付きアクセスを利用し、MFA必須化や信頼できるネットワークからのアクセスを強制します。
Defender for Cloud : AI Hub、Azure Functions、Azure Key Vaultに対してDefender for Cloudを有効化し、異常なAPI呼び出しパターンや構成の脆弱性を継続的に監視します。
データ保護 : RAGに使用されるデータソース(Azure Storage/Cosmos DB)は、VNet統合されたAI StudioとFunctionsからのみアクセス可能とし、パブリックエンドポイントを無効化します。
【運用・コスト最適化】
1. 可観測性の確保
統合ロギング : Azure AI Studioのフロー実行ログ、Azure Functionsの実行ログ、およびAzure OpenAIの利用ログをすべてAzure Monitor Log Analytics Workspace に集約します。
分散トレーシング : Application InsightsをFunctionsとAI StudioのカスタムPythonコードに組み込み、Hosted AgentからM365アクション完了までのレイテンシと失敗箇所を詳細に追跡できるようにします。
コストトラッキング : AI Studio内のモデル呼び出しは、タグ付けによりプロジェクトごとにコストを明確化します。
2. コスト最適化の戦略
Azure Functions SKU : M365連携Function Appは、頻繁に呼び出されるがバースト性の高いワークロードであるため、従量課金プラン(Consumption Plan)を選択し、アイドル時のコストをゼロに抑えます。
Azure OpenAI デプロイ : 利用頻度が高いモデル(例: GPT-4o)については、コスト削減のため予約済みキャパシティ(Provisioned Throughput Units: PTU)の利用を検討します。開発・テスト環境ではPay-as-you-goの標準デプロイを使用します。
ストレージ最適化 : RAGに使用されるEmbeddingデータ(Azure AI Search)やデータソースは、アクセス頻度に応じて適切なストレージ層(例: 開発環境はStandard、本番はPremium)を選択します。
【まとめ】
Azure AI Foundry Hosted AgentとM365連携を統合する際の成功のための要点は以下の3点です。
Hosted Agentの役割の限定 : Hosted Agentは、M365の実行ロジックを直接保持せず、セキュリティとスケーラビリティを確保するため、常にAzure Functionsなどの外部サービスをツールとして呼び出す設計を徹底します。
Entra IDによる認証分離 : AIワークフロー、M365プロキシ(Functions)、およびM365 Graph API間の認証は、すべてManaged Identityと最小権限スコープを用いたアプリケーション認証に分離し、APIキーやユーザー資格情報の利用を回避します。
非同期ワークフローの設計 : M365アクション(特にTeams通知や大規模なSharePoint検索)はレイテンシが高くなる可能性があるため、AI Studio Flowの設計時に非同期コールバックやロングランニング・オペレーションの管理機構(PollingまたはLogic Appsへのハンドオフ)を組み込むことが落とし穴を避ける鍵となります。
コメント