0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Copilot Studio + カスタムコネクタで Azure SRE Agent を Teams から動かしてみた

0
Last updated at Posted at 2026-07-02

はじめに

Azure SRE Agent は、Azure のインフラ運用を自然言語で支援してくれる AI エージェントです。標準では Azure Portal 上のチャット UI から利用しますが、実は Data Plane REST API が公開されており、外部システムから呼び出すことができます。
SRE Agent にも Teams コネクタで Teams チャネルにアラートをポストする機能はありますが、SRE Agent → Teams の片方向の使い方になるため、双方向でやり取りする方法として検証してみました。

本記事では、この API を Copilot Studio のカスタムコネクタ 経由で呼び出し、Microsoft Teams から SRE Agent と会話できるエージェント を構築する手順をまとめます。

構成イメージはこんな感じです。

image.png

「Portal を開かずに Teams のチャットからサクッと Azure の状態を確認したい」「承認フローを含めた運用アシスタントを作りたい」といったユースケースに使えます。

対象読者

  • Azure SRE Agent を触ってみたい / 触っているが Portal 以外から使いたい方
  • Teams 上に業務エージェントを乗せたい方

事前準備

以下が揃っていることを前提とします。

  • Azure SRE Agent リソースが作成済み
  • Power Platform の環境 (ライセンス含む)
  • Azure Portal への管理者アクセス権(アプリ登録・API 権限同意が必要)

SRE Agent のエンドポイントを確認

まずカスタムコネクタで使う agentEndpoint を控えておきます。

az rest -m GET \
  --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.App/agents/{agentName}?api-version=2025-05-01-preview" \
  --query properties.agentEndpoint -o tsv

{agentName}.{hash}.{region}.azuresre.ai のような FQDN が返ってきます。

Step 1: Azure AD アプリ登録

カスタムコネクタから OAuth で SRE Agent API を叩くために、Entra ID (Azure AD) アプリを 1 つ作成します。

1-1. アプリを新規登録

  1. Azure PortalMicrosoft Entra IDアプリの登録新規登録
  2. 設定:
    • 名前: copilot-studio-sre-agent(任意)
    • サポートされるアカウント: シングルテナント
  3. 登録 をクリック

1-2. クライアントシークレットを作成

  1. 左メニュー → 証明書とシークレット新しいクライアントシークレット
  2. 説明と有効期限を設定し 追加
  3. 生成された 「値」 をコピーして保存

:warning: シークレットの「値」はこのタイミングでしか表示されません。必ずコピーしてください。

1-3. API のアクセス許可を追加

  1. 左メニュー → API のアクセス許可アクセス許可の追加
  2. 自分の組織が使用する API タブ → Azure SRE を検索
  3. 委任されたアクセス許可Threads.ReadWrite.All を選択 → アクセス許可の追加
  4. 「<テナント名> に管理者の同意を与えます」 を必ずクリック ✅

同意を忘れるとカスタムコネクタの接続作成時に権限エラーになります。

1-4. リダイレクト URI は後で追加

カスタムコネクタを作成すると Power Platform 側のリダイレクト URL が確定するため、Step 2-4 で戻ってきて登録します。

Step 2: カスタムコネクタの作成

2-1. Power Apps でカスタムコネクタを作成

  1. make.powerapps.comデータカスタムコネクタ新規作成OpenAPI ファイルのインポート
  2. 次項の Swagger を保存してインポート

2-2. Swagger (OpenAPI 2.0) 定義

host の部分は Step 0 で控えた SRE Agent エンドポイントに置き換えてください。

swagger: '2.0'
info:
  title: Azure SRE Agent
  description: Azure SRE Agent data plane API for Copilot Studio
  version: '1.0'
host: {agentName}.{hash}.{region}.azuresre.ai   # 実際のエンドポイントに変更
basePath: /api/
schemes:
  - https
consumes:
  - application/json
produces:
  - application/json
paths:
  /v1/threads:
    post:
      summary: Create thread
      description: Create a new conversation thread with an initial message
      operationId: CreateThread
      parameters:
        - in: body
          name: body
          required: true
          schema:
            type: object
            required:
              - StartMessage
            properties:
              StartMessage:
                type: object
                required:
                  - Text
                properties:
                  Text:
                    type: string
                    description: 最初のメッセージ内容
      responses:
        '200':
          description: OK
          schema:
            type: object
            properties:
              id:
                type: string
                description: threadId
              title:
                type: string
              lastMessage:
                type: object
                properties:
                  text:
                    type: string
                  author:
                    type: object
                    properties:
                      role:
                        type: string
                      displayName:
                        type: string
    get:
      summary: List threads
      description: List all conversation threads
      operationId: ListThreads
      responses:
        '200':
          description: OK
          schema:
            type: object
  /v1/threads/{threadId}:
    get:
      summary: Get thread
      description: Get a thread including the latest message from SRE Agent
      operationId: GetThread
      parameters:
        - in: path
          name: threadId
          required: true
          type: string
      responses:
        '200':
          description: OK
          schema:
            type: object
            properties:
              id:
                type: string
              lastMessage:
                type: object
                properties:
                  text:
                    type: string
                  author:
                    type: object
                    properties:
                      role:
                        type: string
                      displayName:
                        type: string
                  azCliExecution:
                    type: object
                    properties:
                      id:
                        type: string
                      command:
                        type: string
                      status:
                        type: string
  /v1/azCliExecution/{threadId}/{executionId}/action:
    post:
      summary: Approve execution
      description: Approve or reject a pending CLI execution
      operationId: ApproveExecution
      parameters:
        - in: path
          name: threadId
          required: true
          type: string
        - in: path
          name: executionId
          required: true
          type: string
        - in: body
          name: body
          required: true
          schema:
            type: object
            properties:
              action:
                type: string
                description: "run = 承認, reject = 却下"
                enum: [run, reject]
                default: run
                x-ms-visibility: internal
              user:
                type: string
                default: agent
                x-ms-visibility: internal
              ApproveForThread:
                type: boolean
                default: true
                x-ms-visibility: internal
      responses:
        '200':
          description: OK
security:
  - oauth2-auth:
      - https://azuresre.dev/.default
tags: []
securityDefinitions:
  oauth2-auth:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://login.microsoftonline.com/common/oauth2/authorize
    tokenUrl: https://login.windows.net/common/oauth2/authorize
    scopes:
      https://azuresre.dev/.default: https://azuresre.dev/.default

ポイントは 2 つ。

  • StartMessage は必ずネストしたオブジェクト として定義する。トップレベルに Text を置くと 400 StartMessage field is required になります。
  • ApproveExecution の body パラメータは x-ms-visibility: internal にしておくと、Copilot Studio 側で毎回入力を求められず、既定値でそのまま呼べます。

2-3. セキュリティタブの設定

項目
認証タイプ OAuth 2.0
ID プロバイダー Azure Active Directory
クライアント ID Step 1 で作成したアプリの アプリケーション (クライアント) ID
クライアント シークレット Step 1-2 で作成した シークレットの値
リソース URL https://azuresre.dev
スコープ (空欄)

「リソース URL」は SRE Agent の App ID URI です。ここを間違えるとトークンは取れても API 呼び出しで 401 になります。

2-4. リダイレクト URI を Azure AD に登録

  1. セキュリティタブの下部に表示された 「リダイレクト URL」 をコピー
    • 例: https://global.consent.azure-apim.net/redirect/azuresreconnector1-xxx
  2. Azure Portal → 対象のアプリ登録 → 認証プラットフォームを追加Web
  3. コピーした URL を貼り付けて 保存

2-5. コネクタを保存してテスト

  1. 「コネクタの作成」 をクリック
  2. テスト タブ → 新しい接続 → サインイン
  3. ListThreads を実行して 200 OK が返ることを確認

ここで 401 が返る場合は、Step 1-3 の管理者同意 or Step 2-3 のリソース URL を再確認します。

Step 3: Copilot Studio でエージェントを作成

3-1. 新規エージェント作成

  1. copilotstudio.microsoft.com
  2. 作成新しいエージェント
  3. 名前: SRE Agent アシスタント(任意)

3-2. Instructions(指示文)

エージェントの振る舞いをここで定義します。SRE Agent は非同期に応答するため、「作成 → 少し待って取得」 のポーリングを含めるのがポイントです。

## 役割
あなたは Azure SRE Agent のフロントエンドアシスタントです。
ユーザーから Azure インフラに関する質問を受け取り、SRE Agent API を通じて回答を取得して返します。

## 会話の流れ
1. ユーザーから質問を受け取る
2. CreateThread アクションを呼び出す
   - StartMessage.Text にユーザーの質問をそのまま渡す
   - レスポンスの id を threadId として保存する
3. 5秒待機後、GetThread アクションを呼び出す
   - threadId を渡す
4. GetThread のレスポンスを確認する:
   - lastMessage.azCliExecution.status が "Pending" の場合 → 承認フローへ
   - lastMessage.author.role が "SREAgent" の場合 → 回答をユーザーに返す
   - それ以外の場合 → さらに5秒待機して再度 GetThread を呼ぶ(最大3回)

## 承認が必要な場合の処理
GetThread で lastMessage.azCliExecution.status が "Pending" の場合:
1. 実行されるコマンド(lastMessage.azCliExecution.command)をユーザーに表示する
2. 「このアクションを承認しますか?(はい/いいえ)」と確認する
3. 「はい」の場合:
   - ApproveExecution を呼び出す
   - threadId: 現在の threadId
   - executionId: lastMessage.azCliExecution.id
4. 「いいえ」の場合:
   - action を "reject" にして ApproveExecution を呼び出す
5. 承認後、5秒待って GetThread で最終結果を取得してユーザーに返す

## 返答のルール
- SRE Agent の回答(lastMessage.text)をユーザーに返す
- 英語の回答は日本語に翻訳する
- 技術用語・コマンド・リソース名はそのまま使う
- 回答が取得できない場合は「SRE Agent が応答中です。しばらくしてからもう一度お試しください。」と伝える

3-3. ツールを追加

  1. ツールから Azure SRE Agent コネクタを選択
  2. 以下 3 つのアクションを追加:
    • CreateThread
    • GetThread
    • ApproveExecution

ツール追加後、指示文はテキストだけではなくちゃんとツールとの紐づけも行いましょう。
image.png

3-4. Teams に公開

  1. Copilot Studio → チャンネルMicrosoft Teams有効化
  2. 公開公開
  3. Teams アプリとして追加して動作確認

4. 動作確認

SRE Agent に話しかけてみるとちゃんと応答することを確認。

image.png

SRE Agent の方も見てみると同じような内容のチャットが作成されてました。
image.png

付録: HAR を GitHub Copilot に食わせて API 仕様を起こす

公式リファレンスは API reference for Azure SRE Agent - Microsoft Learn にまとまっているのでまずはそちらを参照するのがおすすめです。
ただし、SRE Agent のデータプレーン API は現時点で preview で、公式リファレンスに載っている経路のほかにも Portal UI が内部でだけ使っているエンドポイント がいくつか存在します(承認用の azCliExecution/.../action はまさにその一例です)。ドキュメントに載っていない挙動を再現したい・リクエストボディの正確な形が知りたい、というときに便利なのが ブラウザで実際に UI を操作した通信を HAR ファイルで記録し、それを GitHub Copilot に解析させる やり方です。

自分で jq を書かなくても、HAR を VS Code に開いて Copilot Chat に投げるだけで、エンドポイント一覧・リクエスト/レスポンススキーマ・Swagger 定義まで一通り出してくれます。

手順

  1. Portal で SRE Agent を開いた状態で DevTools を起動

    • Edge / Chrome で F12Network タブ
    • 「Preserve log」にチェック(ページ遷移で消えないように)
    • フィルタに azuresre.ai と入れて自エージェント宛の通信だけに絞る
  2. 調べたい操作を UI 上で実行

    • 例: 「新規スレッド作成」→「メッセージ送信」→「承認ボタンを押す」を一連で実施
  3. 通信を HAR で保存

    • Network タブを右クリック → Save all as HAR with content
  4. HAR から Bearer トークンを消しておく (推奨)

    • HAR には Authorization: Bearer ... が生で入るので、Copilot に渡す前・共有前に置換しておくと安心です。

      (Get-Content .\azuresre.har -Raw) `
        -replace '"Bearer [^"]+"', '"Bearer REDACTED"' |
        Set-Content .\azuresre.redacted.har
      
  5. VS Code で HAR を開いて Copilot Chat に投げる

    • #file:azuresre.redacted.har として添付するだけで OK

Copilot への聞き方(コピペで使えるプロンプト)

まずはエンドポイントを俯瞰したいとき:

#file:azuresre.redacted.har

この HAR に含まれる azuresre.ai 宛のリクエストだけを対象に、
- HTTP メソッド
- パス (クエリパラメータは除く)
- リクエストボディの JSON スキーマ (簡易でよい)
- レスポンスの主要フィールド

を、ユニークなエンドポイント単位でまとめた表を作ってください。
似た経路 (例えば threadId が違うだけのもの) は 1 行に集約し、
可変部分は `{threadId}` のようにプレースホルダ化してください。

特定の操作 (例: 承認ボタン) だけ深掘りしたいとき:

#file:azuresre.redacted.har

「承認ボタンを押した」ときに発生している一連の API 呼び出しを時系列で並べ、
それぞれ次の観点で説明してください:
- どの UI アクションに対応するか (推測でよい)
- リクエストボディの必須フィールド
- レスポンス status / body の見どころ
- Copilot Studio カスタムコネクタから呼ぶ場合の Swagger operation 定義

そのまま Swagger を生成させたいとき:

#file:azuresre.redacted.har

この HAR から抽出できるエンドポイントを元に、Copilot Studio カスタムコネクタに
インポートできる Swagger 2.0 (OpenAPI 2.0) 定義を生成してください。
制約:
- host は {agentName}.{hash}.{region}.azuresre.ai をプレースホルダで残す
- basePath は /api/
- securityDefinitions は OAuth2 (accessCode), resource = https://azuresre.dev
- パスパラメータ (threadId など) は path parameter として定義
- リクエストボディは HAR の実データから型を推論
- 各 operation に operationId と日本語 summary を付ける

生成された Swagger をそのまま Step 2-2 のインポートに使えば、コネクタが数分で出来上がります。実際、本記事の Swagger も UI 操作の HAR を Copilot に解析させて叩き台を作り、手で微修正したものです。

発展編: Webhook 経由で Teams チャネルに通知する

Copilot Studio 経由の「ユーザーが話しかけて回答をもらう」パターンとは別に、SRE Agent 側から自発的に Teams チャネルへ通知させたい ケースもあります。たとえば「夜間バッチで検知した異常を、SRE Agent に要約させて当番チャネルに投げる」ようなユースケースです。

これは Power Automate の以下のようなフローで実現できます。

image.png

構成はシンプルに 3 ステップです。

# アクション 役割
1 手動トリガー (HTTP 要求の受信時) Azure Monitor のアラートから Webhook で叩かれるエンドポイント
2 プロンプトを実行する (AI Builder) 受け取ったペイロードを GPT で要約・整形
3 チャットやチャネルにカードを投稿する (Teams) Adaptive Card として指定チャネルに投稿

1. トリガー: HTTP 要求の受信時

Power Automate で 「HTTP 要求の受信時」 トリガーを選び、JSON スキーマを次のように定義します。SRE Agent の GetThread レスポンスをそのまま流し込むイメージです。

{
  "type": "object",
  "properties": {
    "threadId":    { "type": "string" },
    "title":       { "type": "string" },
    "summary":     { "type": "string" },
    "severity":    { "type": "string" },
    "resourceId":  { "type": "string" }
  }
}

保存すると Webhook URL が生成されるので、それを叩けばフローが起動します。

curl -X POST "https://prod-xx.japaneast.logic.azure.com/workflows/.../triggers/manual/paths/invoke?..." \
  -H "Content-Type: application/json" \
  -d '{
    "threadId": "abc123",
    "title": "CPU 使用率が閾値超過",
    "summary": "vm-prod-01 の CPU が 95% を継続。過去1時間の傾向から...",
    "severity": "High",
    "resourceId": "/subscriptions/.../virtualMachines/vm-prod-01"
  }'

2. プロンプトを実行する(AI Builder)

生の SRE Agent 出力は英語だったり冗長だったりするので、Teams に流す前に整形します。AI Builder の 「プロンプトを実行する」 アクションで以下のようなプロンプトを組みます。

次のインシデント情報を、Teams に投稿するための日本語メッセージに要約してください。

# 入力
- タイトル: @{triggerBody()?['title']}
- 重要度: @{triggerBody()?['severity']}
- 概要: @{triggerBody()?['summary']}
- リソース: @{triggerBody()?['resourceId']}

# 出力ルール
- 冒頭に絵文字なしで【重要度】を付ける
- 3行以内で状況が分かる要約にする
- 最後に「担当者は Teams からエージェントに詳細を確認してください」と添える

出力を後続ステップで outputs('プロンプトを実行する')?['body/responseV2/predictionOutput/text'] として参照します。

3. チャットやチャネルにカードを投稿する

Teams コネクタの 「チャットやチャネルにカードを投稿する」 アクションを追加し、Adaptive Card として投稿します。

  • 投稿者: フロー ボット (ユーザーに紐付かない Bot として投稿)
  • 投稿先: Channel
  • Team / Channel: 通知したい Teams / チャネル
  • アダプティブ カード: 下記 JSON
{
  "type": "AdaptiveCard",
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.4",
  "body": [
    {
      "type": "TextBlock",
      "size": "Medium",
      "weight": "Bolder",
      "text": "@{triggerBody()?['title']}"
    },
    {
      "type": "TextBlock",
      "wrap": true,
      "text": "@{outputs('プロンプトを実行する')?['body/responseV2/predictionOutput/text']}"
    },
    {
      "type": "FactSet",
      "facts": [
        { "title": "Severity",  "value": "@{triggerBody()?['severity']}" },
        { "title": "Resource",  "value": "@{triggerBody()?['resourceId']}" },
        { "title": "ThreadId",  "value": "@{triggerBody()?['threadId']}" }
      ]
    }
  ],
  "actions": [
    {
      "type": "Action.OpenUrl",
      "title": "SRE Agent で続きを見る",
      "url": "https://portal.azure.com/#@/resource/.../agents/{agentName}"
    }
  ]
}

ThreadId を Card に載せておくと、Teams で通知を見た担当者が Copilot Studio エージェントに「threadId xxx の続きを見せて」と話しかけて、そのままインタラクティブな調査に移行できます。

動作イメージ

以下の形で Copilot Studio のエージェントがアラートを通知してくれるので、調査ボタンを押すと SRE Agent がその内容の調査を行ってくれます。

image.png

使い分けのイメージ

パターン 起点 UI 向いているユースケース
Copilot Studio エージェント ユーザー発話 Teams チャット (1:1) アドホックな調査・質問
Power Automate Webhook 外部イベント Teams チャネル (Adaptive Card) 自動検知結果のプッシュ通知

両方を組み合わせて、「Webhook でチャネルに一次通知 → 担当者が Copilot Studio エージェントで深掘り」 という運用にすると、ThreadId を軸に会話がつながって便利です。

ハマりどころ (トラブルシューティング)

自分が実際にハマったやつをまとめておきます。

エラー 原因 対処
AADSTS50011: redirect URI mismatch リダイレクト URI 未登録 Azure AD アプリの「認証」にコネクタの URL を追加
サインイン後に接続が表示されない クライアントシークレットの期限切れ 新しいシークレットを作成しコネクタを更新
400 StartMessage field is required リクエストボディの形式が違う {"StartMessage": {"Text": "..."}} のネスト構造を使う
400 request field is required ボディが正しくネストされていない StartMessage をトップレベルに置かない
405 Method Not Allowed パスパラメータが空 threadId / executionId 変数をセットし直す
カスタムコネクタのアクションが古い キャッシュ 接続を削除して再作成、または別名でコネクタを作り直す

まとめ

Azure SRE Agent の Data Plane API を Copilot Studio カスタムコネクタでラップすることで、Teams のチャット UI 上に SRE Agent の会話体験を持ち込む ことができました。さらに Power Automate + Webhook を組み合わせれば、外部イベントを起点に Teams チャネルへ Adaptive Card で通知する使い方もできます。
SRE Agent 単体でも十分使いやすいですが、UI を統一したいとか標準の UI 以外から使わせたいといった要件があった場合は利用できるユースケースになるかと思いました。

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?