@ABC-AtomuOnishi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Q&A

Closed

Teams・Redmine 横断 依頼/課題管理 一元化に関する技術検討報告

作成日:2026年8月2日


1. 本報告の目的

  • 複数の Redmine および複数の Teams チャネルに分散している依頼・課題・障害連絡を、一元的に把握できる仕組みを検討する
  • 追加ライセンスの取得および管理者への設定変更依頼が困難な前提で、実現可能な構成を特定する
  • Microsoft 公式仕様に基づき、各サービスの適性と制約を明確化する

2. 現状と課題

2.1 現状

  • Redmine が複数インスタンス存在する
  • Teams も複数存在し、プロジェクトごとにチャネルが分かれている
  • Teams チャネル上で依頼・相談・障害連絡が発生している
  • Redmine 側にもチケットおよび更新通知が存在する

2.2 課題

  • プロジェクト横断で、未対応・期限切れ・担当者・状態を追跡できない
  • 依頼漏れ・対応漏れ・期限切れが発生している
  • 管理作業そのものに工数が発生している

3. 結論

3.1 推奨構成(追加費用・追加権限なしで実現可能)

  • 正本(データの唯一の置き場)
    • Microsoft Lists を 1 リストのみ作成し、これを正本とする
  • Redmine からの取り込み
    • Redmine の webhook を、Teams webhook トリガーで受信する
  • Teams からの取り込み
    • Teams の「チャネルに新しいメッセージが追加されたとき」トリガーを使用する
  • 期限切れの判定
    • Lists 側で判定する(Redmine には問い合わせない)
  • 常設の一覧・看板
    • Lists ボードビューおよび SharePoint ページを Teams タブに設置する
  • 個別の受付・完了操作
    • Adaptive Card を個人チャット宛に送信する
  • 問い合わせ応答
    • Teams のキーワードトリガーによる擬似 Bot を構築する
  • Redmine への書き戻し
    • Redmine コネクタの Create issue/Update issue を使用する

3.2 主要な判断

  • Copilot Studio は使用しない
    • DLP により Teams への公開が不可能なため
  • AI Builder は使用しない
    • クレジットの購入が必要なため
  • Redmine は当面存続させる
    • 正本の座のみ Microsoft Lists に移す
  • HTTP コネクタの利用可否を最優先で確認する
    • 利用可能であれば、Redmine 連携は大幅に簡素化される

4. 技術検証結果

4.1 Microsoft 各サービスの適性

  • Microsoft Lists
    • 役割:正本・集約台帳
    • 得意:状態/担当/期限の管理、多様なビュー、M365 に付属で追加費用なし
    • 制約:リストビューの 5,000 件しきい値、複雑なリレーションは不可
  • Power Automate
    • 役割:取り込み・通知・カード操作
    • 得意:Teams 投稿検知、メール取り込み、Lists 更新、Adaptive Card がすべて標準コネクタで実現可能
    • 制約:HTTP コネクタおよびカスタムコネクタは Premium
  • Power Apps
    • 役割:横断管理画面(任意)
    • 得意:SharePoint 接続のキャンバスアプリは M365 ライセンス内で利用可能
    • 制約:委任制限(既定 500 件・最大 2,000 件)、起動が遅い、属人化しやすい
  • Copilot Studio
    • 役割:本構成では使用しない
    • 制約:DLP によりチャネル公開が不可
  • AI Builder
    • 役割:本構成では使用しない
    • 制約:クレジットの購入が必須
  • M365 Copilot(Teams Copilot)
    • 役割:人が手動で使う要約・下書き
    • 制約:Power Automate や Power Apps のフローから呼び出せない

4.2 Copilot Studio が利用できない理由

  • Copilot Studio のエージェント公開チャネルは、DLP 上「コネクタ」として扱われる
    • 該当コネクタ名:Microsoft Teams + M365 Channel in Copilot Studio
    • 該当コネクタ名:Direct Line channels in Copilot Studio
  • 2019 年以降に導入されたこれらのコネクタは、既定で「Non-business」グループに分類される
    • 多くの組織では Non-business グループが自動的にブロックされている
  • データポリシーでブロックされたコネクタは、エージェントから呼び出される Cloud Flow 内でも使用できない
    • このため、Power Automate 単体では成功する SharePoint 取得が、Copilot Studio 経由では失敗する
  • 2025 年 3 月以降、Copilot Studio に対する DLP 強制が既定で有効化されている
    • 以前は動作していた構成が停止する事象は、この仕様変更に起因する
  • 結論
    • 技術的な問題ではなくガバナンス設定の問題であり、管理者による DLP 変更なしには回避できない

4.3 AI 機能のライセンス体系の違い

  • M365 Copilot(Teams Copilot)
    • 課金体系:ユーザー単位ライセンス
    • 本用途での可否:利用可。ただし人が手動で使う用途に限られる
  • AI Builder
    • 課金体系:容量課金(AI Builder クレジット)
    • 本用途での可否:不可(クレジット未保有)
  • Copilot Studio ナレッジ
    • 課金体系:容量課金(Copilot クレジット)
    • 本用途での可否:不可
  • Power Apps/Power Automate の Copilot
    • 課金体系:作成支援は無償
    • 本用途での可否:フロー内での AI 実行は AI Builder 扱いとなるため不可
  • 重要な整理
    • 「Teams Copilot が使える」ことは「Power Automate や Power Apps の中で AI 処理が使える」ことを意味しない
    • M365 Copilot ライセンスを保有していても、AI Builder クレジットは付与されない
    • 自動処理への AI 組み込みは、AI Builder クレジット確保後の段階とする

4.4 AI Builder の RAG 機能について

  • AI Builder のプロンプト機能には「ナレッジを追加」があり、Microsoft 公式ドキュメント上も RAG と説明されている
  • ただしデータソースは限定されている
    • 対象:Dataverse、および Salesforce/Oracle/Zendesk のコネクタテーブル
    • SharePoint リストは対象外のため、本構成では利用できない
  • その他の仕様
    • 取得レコード数は既定 30 件
    • リレーションは 2 階層まで
    • ベクトル検索ではなく、該当レコードをプロンプトに差し込む方式
  • 代替案
    • Power Automate で Lists から対象行を取得し、プロンプト本文に埋め込む方式であれば、数百件規模まで実用可能

4.5 Redmine 連携手段の比較

  • Redmine コネクタ
    • ライセンス:標準(無料)
    • ネットワーク:クラウドから到達が必要
    • 期限切れ取得:不可(一覧取得アクションが存在しない)
    • 担当者取得:不可(戻り値に含まれない)
    • 評価:書き戻し用途に限定される
  • Redmine webhook
    • ライセンス:標準(無料)
    • ネットワーク:Redmine から外向き通信のみで成立
    • 期限切れ取得:不可(イベント駆動のため)
    • 担当者取得:可
    • 評価:取り込みの主軸とする
  • HTTP コネクタ
    • ライセンス:Premium
    • ネットワーク:クラウドから到達が必要
    • 期限切れ取得:可
    • 担当者取得:可
    • 評価:利用可能であれば最適解
  • RSS コネクタ(Atom フィード)
    • ライセンス:標準(無料)
    • ネットワーク:クラウドから到達が必要
    • 期限切れ取得:可
    • 担当者取得:不可
    • 評価:次善策
  • rake send_reminders(メール取り込み)
    • ライセンス:標準(無料)
    • ネットワーク:制約なし
    • 期限切れ取得:可
    • 担当者取得:可
    • 評価:サーバー作業が必要。メールのパースとなるため精度が低い
  • 社内サーバーでの定期実行
    • ライセンス:不要
    • ネットワーク:社内で完結
    • 期限切れ取得:可
    • 担当者取得:可
    • 評価:サーバー作業が必要

4.6 Redmine コネクタ仕様詳細

  • 基本情報
    • 発行元:Microsoft
    • 提供クラス:Standard(Power Automate/Power Apps/Copilot Studio/Logic Apps いずれも)
    • 認証:API キーおよび Site URL
    • スロットリング:1 接続あたり 60 秒で 100 API コール
    • トリガーのポーリング頻度:15 秒に 1 回
    • 接続は共有不可(アプリを共有した場合、利用者ごとに接続の再作成が必要)
    • 補足:Premium とされるのは別製品向けの「Easy Redmine」コネクタであり、素の Redmine 用は Standard
  • 利用可能なアクション
    • Get issue by ID:ID 指定で 1 件取得
    • Get project by ID:プロジェクト 1 件取得
    • Get user by ID:ユーザー 1 件取得
    • List users:ユーザー一覧取得
    • Create an issue:チケット作成
    • Update an issue:チケット更新(status_id/priority_id/subject 等)
    • Create a project:プロジェクト作成
  • 利用可能なトリガー
    • When an issue is created:チケット作成時(project_id 必須)
    • When an issue is updated:チケット更新時(project_id 必須)
    • When a project is created:プロジェクト作成時
  • 重要な制約 1:チケット一覧を取得するアクションが存在しない
    • 「期限切れチケットを検索する」ことは不可能
    • ID が既知のものを 1 件ずつ取得することしかできない
  • 重要な制約 2:戻り値に担当者(Assignee)が含まれない
    • 含まれる項目:Issue Id、Project name、Tracker、Status、Priority、Author、Subject、Description、Start date、Due date、Done ratio、Estimated hours、Created on、Updated on
    • Author は起票者であり、担当者ではない
    • 担当者別の管理を行うには webhook が必須となる
  • 重要な制約 3:トリガーは project_id が必須
    • プロジェクト横断での検知ができない
    • プロジェクト数 × Redmine インスタンス数だけフローが必要になる

4.7 Teams webhook トリガー仕様

  • トリガー名:When a Teams webhook request is received
  • Microsoft Teams コネクタの一部であり、標準(Premium 不要)
  • POST リクエストのみ対応(GET は非対応)
  • 認証方式を選択可能
    • 誰でも
    • テナント内の任意のユーザー
    • 特定のユーザーのみ
  • 旧 Office 365 Connectors(Incoming Webhook)の後継として、Microsoft が推奨している方式
  • 任意の JSON を POST し、「JSON の解析」アクションで処理可能
  • 特記事項
    • 「HTTP 要求の受信時」トリガーは Premium であるが、本トリガーは標準である
    • この差が、追加費用なしで Redmine 連携を実現できる根拠となっている

4.8 Redmine REST API 仕様(HTTP コネクタ利用時)

  • リクエスト例
    • GET /issues.json?status_id=open&due_date=%3C%3D2026-08-02&sort=due_date:asc&limit=100
    • ヘッダー:X-Redmine-API-Key に API キーを指定
  • パラメータ仕様
    • status_id:open/closed/*/数値 ID を指定
    • due_date:<= 等の演算子を使用可能
    • 演算子に > < = を含む場合は URL エンコードが必須(<= は %3C%3D)
    • project_id を省略すると、API キー保有者が閲覧可能な全プロジェクト横断で取得できる
  • レスポンス仕様
    • total_count、limit、offset を含む
    • limit の上限は 100
    • 100 件を超える場合は offset でページングする
  • 推奨事項
    • 保存クエリの利用を推奨する(?query_id=5 の形式)
    • フィルタ条件を Redmine の画面側で保守できるため、フローの改修が不要になる

4.9 Redmine 標準のリマインダ機能

  • コマンド
    • bundle exec rake redmine:send_reminders days=7 RAILS_ENV="production"
  • 動作
    • 期限を超過したチケット、および今後 N 日以内に期限を迎えるチケットを、担当者ごとにメール送信する
    • days=0 とすることで、期限超過分に絞る運用が可能
  • 運用上の注意
    • crontab に登録する際は、小さなシェルスクリプトにラップして呼び出すことが公式に推奨されている

4.10 Teams 側の表示・操作手段

  • Adaptive Card
    • 利用可能な場所:チャネルおよびチャットへの投稿、Outlook のアクショナブルメッセージ、Copilot Studio 内、メッセージ拡張・ダイアログ
    • Adaptive Card タブは新しい Teams クライアントで利用できない
    • クラシック Teams クライアントは 2024 年 3 月 31 日に非推奨化されている
    • Microsoft は同等の代替機能を提供していない
    • 「Cards for Power Apps」は 2025 年 8 月 29 日に廃止済み
    • 投稿済みカードの更新は「チャットまたはチャネルのアダプティブカードを更新する」アクションで可能
    • ただし更新しても未読にならず、スレッドも最新に浮上しない
    • このためカード内に更新日時を明示する等の工夫が必要
    • 更新できるのは Bot 自身が投稿したメッセージのみ
  • Microsoft Lists ボードビュー
    • 選択肢列または Yes/No 列の値でスイムレーンを構成するカンバンビュー
    • カードをドラッグすると選択肢列の値が即座に書き戻される(フォームを開く操作が不要)
    • 他のビュー(グリッド・カレンダー・ギャラリー)とデータが同期する
    • Microsoft 365 に含まれており、追加購入は不要
    • 制約:リアルタイム同期ではなく、他メンバーの変更はブラウザ更新まで反映されない
  • Teams キーワードトリガー
    • トリガー名:When keywords are mentioned(Microsoft Teams コネクタ・標準)
    • パラメータ:メッセージの種類、キーワード、チーム、チャネル
    • 「メッセージの詳細を取得」アクションと組み合わせることで、投稿者を特定した応答が可能
    • 制約:キーワードが出現すれば必ず発火するため、コマンド専用チャネルの新設が必須
    • 制約:ポーリング方式のため、応答まで数秒から 1 分程度のラグが発生する
    • 制約:設定変更なしに突然失敗する事例が報告されており、失敗通知の設定が必要

5. 制約一覧

5.1 ライセンス制約

  • AI Builder クレジット:未保有
  • Copilot Studio ナレッジ:未保有
  • Power Platform Premium:要確認(HTTP コネクタおよびカスタムコネクタの可否に直結する)
  • M365 Copilot:保有(ただし人が手動で使う用途に限られる)

5.2 DLP 制約

  • 以下がブロックされていることを確認済み
    • Flow external share block
    • SharePoint
    • Cloud Flow
    • Microsoft Teams + M365 Channel in Copilot Studio
    • Direct Line channels in Copilot Studio
  • 管理者への DLP 解除依頼は困難である
  • HTTP コネクタが DLP でブロックされている可能性が高い
    • 企業テナントにおいて最も制限されやすいコネクタであるため

5.3 ネットワーク制約

  • Redmine は VPN 内および社内ネットワーク限定である
  • 社外からの Redmine へのアクセスは不可である
  • Power Automate から Redmine への到達は可能である(確認済み)
  • Redmine から外部への webhook 送信は可能である(確認済み)

5.4 運用制約

  • 管理者への設定変更依頼が困難である
  • 社内サーバーおよび個人 PC での定期実行は実施しない方針である
  • 追加の外部サービス導入は現時点で想定しない

6. 推奨構成詳細

6.1 全体構成

  • SharePoint サイト「依頼管理」を新設する
    • Microsoft Lists「依頼台帳」を 1 本のみ作成し、正本とする
    • 列構成:プロジェクト/出所/状態/担当者/期限/優先度/元リンク/重複防止キー
  • Teams「横断管理」チームを新設する
    • 一般チャネル:SharePoint ページタブ(全体ダッシュボード)
    • 看板チャネル:Lists ボードビュー(全件)
    • bot チャネル:問い合わせ専用
  • 各プロジェクトチャネルには Lists タブを設置する
    • 同一リストにプロジェクト列でフィルタをかけたビューを指す
  • 設計原則
    • リストは分割せず、ビューで分ける
    • データは 1 箇所、見え方のみをチームごとに変える

6.2 データフロー

  • Redmine から Lists へ
    • Redmine webhook から When a Teams webhook request is received で受信
    • JSON の解析を経て、Lists の項目を作成または更新
    • 使用ライセンス:標準
  • Teams から Lists へ
    • 「チャネルに新しいメッセージが追加されたとき」トリガーから項目を作成
    • 使用ライセンス:標準
  • 期限切れの判定
    • スケジュールフローから Lists を OData フィルタで抽出
    • 使用ライセンス:標準
  • Lists から Teams へ(通知)
    • Flow bot の個人チャットへ Adaptive Card を投稿
    • 使用ライセンス:標準
  • Lists から Teams へ(問い合わせ応答)
    • When keywords are mentioned から Lists を抽出し、スレッドに返信
    • 使用ライセンス:標準
  • Lists から Redmine へ(書き戻し)
    • Redmine コネクタの Create issue/Update issue を使用
    • 使用ライセンス:標準

6.3 期限切れの判定方法

  • Redmine には問い合わせない
  • webhook で同期された Lists 上の期限日を用いて判定する
  • OData フィルタ
    • Status ne '完了' and DueDate lt '@{formatDateTime(utcNow(),'yyyy-MM-dd')}'
  • ビューフィルタでは [今日] トークンが利用可能なため、日付の書き換えは不要
  • 設計上の注意
    • Lists の列は英語の内部名で作成する(Status/DueDate/Project/Assignee)
    • 表示名のみ日本語にリネームする
    • 日本語で列を作成すると内部名がエンコードされ、書式設定 JSON および OData フィルタが破綻する

6.4 見逃し防止の設計

  • 状況の把握
    • 配置場所:SharePoint ページタブ(常設)
    • 理由:流れないため
  • 状態の変更
    • 配置場所:Lists ボードビュー(ドラッグ操作)
    • 理由:流れないため
  • 個別の受付・完了
    • 配置場所:Adaptive Card(個人チャット宛)
    • 理由:チャネル投稿は他の会話に埋もれるため
  • 督促
    • 配置場所:Flow bot 個人チャット、および 3 日後の再送
    • 理由:1 回の通知では見逃されるため
  • 任意タイミングの確認
    • 配置場所:キーワード Bot
    • 理由:聞けば返るため
  • 原則
    • カードを一覧の掲示場所として使用しない(必ず埋もれるため)
    • 未処理のまま N 日経過した場合の再送(エスカレーション)を必ず実装する

7. 未確認事項と次アクション

7.1 未確認事項

  • HTTP コネクタのライセンス可否
    • 確認方法:HTTP アクションを 1 つ配置し、フローチェッカーを実行する
    • 影響:利用可であれば Redmine 連携が 1 アクションで完結し、担当者も取得できる
  • HTTP コネクタの DLP 可否
    • 確認方法:実際に GET を実行し、応答を確認する
    • 影響:ブロックされている場合、ライセンス確認の結果は無意味となる
  • RSS コネクタでの Redmine 到達可否
    • 確認方法:Atom フィード URL を RSS コネクタで取得する
    • 影響:通れば期限切れの洗い替えが可能になる
  • Redmine webhook プラグインの導入状況
    • 確認方法:各 Redmine インスタンスで確認する
    • 影響:未導入のインスタンスはコネクタトリガーで代替する必要がある
  • 既存チケットの初期投入方法
    • 確認方法:Redmine の CSV エクスポート機能を確認する
    • 影響:webhook は既存分を運ばないため必須の作業となる

7.2 推奨する着手順

  • 第 1 段階:HTTP コネクタの可否確認
    • 最優先事項。結果により構成が大きく変わる
  • 第 2 段階:Lists の列設計および期限切れビューの作成
    • 列は英語の内部名で作成する
  • 第 3 段階:Redmine webhook 受信フローを 1 本作成し、1 インスタンスで検証する
  • 第 4 段階:既存チケットの CSV 初期投入
  • 第 5 段階:キーワード Bot の作成
    • 効果が最も分かりやすいため、早期に実施することが望ましい
  • 第 6 段階:ボードビューおよび SharePoint ページの整備
  • 第 7 段階:個人宛通知および再送フローの実装

8. リスクと留意点

8.1 技術リスク

  • webhook の取りこぼし
    • Redmine 再起動中、フローのスロットリング発生時、チケット削除時は同期されない
    • 対策:月 1 回の CSV による洗い替え、または定期的なフル同期
  • Lists の 5,000 件しきい値
    • 対策:完了済み項目のアーカイブフローを初期段階から実装する
  • Power Apps の委任制限
    • 既定 500 件、最大 2,000 件を超えると取りこぼしが発生する
    • 「期限切れを全件表示」のつもりが上位 500 件のみ処理されている事故が典型的である
  • キーワードトリガーの不安定性
    • 突然失敗する事例が報告されている
    • 対策:失敗通知の設定を必須とする
  • ボードビューの非リアルタイム性
    • 常時監視の用途には適さない

8.2 運用リスク

  • フロー所有者の属人化
    • 個人アカウントを所有者にすると、退職や異動でフローが停止する
    • 対策:サービス用アカウントを所有者とする
  • Redmine コネクタの接続共有不可
    • 引き継ぎ時に接続の再作成が必要となる
  • 通知過多による形骸化
    • 対策:通知対象を「自分が担当かつ期限切れまたは高優先度」に限定する
  • Teams 投稿の全件取り込みによるノイズ
    • 対策:特定リアクションまたはタグ付き投稿のみを対象とする運用ルールを先に定める

8.3 セキュリティ留意点

  • Redmine の API キーは、閲覧権限のみの専用ユーザーを作成して使用する
  • Teams webhook の URL は認証情報と同等に扱う
    • 「誰でも」設定の場合、URL を保有する者は誰でも投稿できる
  • Lists は単一リストのため、原則として全メンバーが全件を閲覧できる
    • 項目レベル権限による制御は運用が破綻するため非推奨とする
    • 機微な案件は別リストに分離する運用とする

9. 参考資料(Microsoft 公式)


以上

0 likes

1Answer

こんにちは。
タイトルと本文を見る限り、テスト投稿や誤投稿の可能性があるように見えました。
もし意図しない公開でしたら、一度内容をご確認された方がよいかもしれません。

0Like

Your answer might help someone💌