日本一詳しいCompany Communicator

みなさま、こんにちは！
日本マイクロソフトのカスタマーサクセスマネージャーの岩田です。
今回は、Teams上で動作する、特定業務用のTeamsアプリテンプレートの中から、Company Communicatorを深堀してご紹介します。
Teamsアプリテンプレートにそのもの関しては、以前の投稿をご確認ください。
[第 5 回 Teamsアプリテンプレート](https://qiita.com/Nagaaki_Iwata/items/49536e2965fa2cebb2bd)

### 全社通知をCompany Communicatorで
下図はMicrosoft 365によるコミュニケーションツールの使い分けの例を示しています。
縦軸は情報の緊急性、横軸は情報の範囲（個人→部門→全社→社外）を示しています。
![ツールの使い分け.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/c8fa93fe-9134-cd08-c167-cf84df6f88e3.jpeg)
Teamsが弱い部分、特に、<font color="Red">赤枠</font>で囲った「部門や全社的な通知」に関しては、現在もメールが使われているケースが多いのではないでしょうか。
Company Communicatorは、これまでなかなかTeamsに置き換えることができなかった、部門や全社的な通知をカバーします。
社長のメッセージや社員総会の案内、セミナーなどの情報を、TeamsのCompany Communicatorで社内に広く通知できるようになります。

### Company Communicatorの使い方
Company Communicatorは、メッセージ送信用（管理者用）とメッセージ受信用（クライアント）のアプリがあります。
メッセージ送信用アプリを特定のチームにインストールすると、そのチームの一般チャネルにCompany Communicatorのタブが表示されます。
タブから「新しいメッセージ」ボタンを押し、タイトルや内容を入力することで、カード形式のメッセージを送信することができます。（右側にカードのプレビューが表示されます）

**メッセージの記入**
![送信.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/7c700e34-4198-c966-2b23-ed73790bcc68.jpeg)
上の例は、人事部が主催するキャリアセミナーの通知です。
ボタンのURLの欄にTeams会議のURLを記入しておけば、メッセージを受け取った社員は、ボタンを押すことでTeams会議でセミナーに参加できます。

メッセージの入力後、次へボタンを押すと、「特定のチームのチャネル」に送るのか、「個人のチャット」に送るのかを選択します。

**メッセージ送信先の選択**
![送り先.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/1b956013-cf71-121a-f349-5675fad5cbe0.jpeg)
メッセージを受信するには、Company Communicatorのメッセージ受信用アプリがインストールされている必要があります。
特定のチームに送る場合はそのチームに、個人チャットに送る場合はその個人に、受信用アプリをインストールします。
送信先は以下1～4を選択できますが、1はチームに、2～4は個人に、受信用アプリがインストールされている必要があります。

**1. 特定のチームの全般チャネルに送信（チームに送信）**
指定したチームの一般チャネルにメッセージが送信されます。
**2. チームのメンバーにチャットで送信（個人チャットに送信）**
指定したチームのメンバーに送信されます。チャネルではなく、メンバーの個人チャットにメッセージが送信されます。
**3. すべてのユーザーにチャットで送信（個人チャットに送信）**
全社員の個人チャットにメッセージが送信されます。
**4. M365グループ、配布グループ、またはセキュリティグループのメンバーに、チャットで送信（個人チャットに送信）**
Microsoft 365グループ、配布グループ、セキュリティグループのメンバーの個人チャットにメッセージが送信されます。

**メッセージの受信（個人チャットの場合）**
![受信.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/f5c0aa33-3889-61d1-2040-2f769cd8722b.jpeg)
より詳細な使い方に関しては、以下の操作ガイドをご参照ください。
・[Company Communicator ユーザー向け操作ガイド（日本語版）](https://github.com/OfficeDevJP/microsoft-teams-apps-company-communicator/releases/download/v1.0.0/Company_Communicator_User_Guide.pdf)

### Company Communicatorの導入のポイントと構成の理解
Company Communicatorは、複数のAzureリソースで構成されるクラウドネイティブなアプリケーションです。
ここでは、導入に関して、管理者が抑えるべき３つのポイントを説明します。
**1.Company Communicatorの構成要素**
**2.Azure Resource Managerテンプレート（以下ARMテンプレート）**
**3.Teams App Package**

Company Communicatorの細かい導入手順は割愛します。手順に関しては、以下のリンクをご参照ください。
・[Company Communicator Deployment Guide](https://github.com/OfficeDev/microsoft-teams-apps-company-communicator/wiki/Deployment-guide)
・[Company Communicator 管理者向け展開ガイド（日本語版）](https://github.com/OfficeDevJP/microsoft-teams-apps-company-communicator/releases/download/v1.0.0/Company_Communicator_Deployment_Guide.pdf)

#### 1. Company Communicatorの構成要素
展開ガイドに沿って導入すると、複数のリソースが自社のAzure環境に展開されます。
ここでは、展開される主要なリソースを説明します。

**Company Communicatorの構成要素**
![構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/004937d0-a1ff-5dd3-515e-f3232f489bf5.jpeg)

**① Azure Bot (Bot Connector)**
TeamsとCompany Communicatorの仲介役です。
Company Communicatorはメッセージ送信用と受信用の二つのクライアントアプリがあり、それぞれのAzure BotのアプリケーションIDとシークレットキーがAzure Active Directoryに登録され、安全な通信を保証します。
Company Communicatorは、Microsoft Graphを使ってMicrosoft 365の情報にアクセスします。
Azure Active Directoryに登録された送信用・受信用2つのAzure Botは、それぞれMicrosoft Graphのアクセススコープも保持しており、そのスコープに応じたトークンがCompany Communicator側にリダイレクトされ、以降、ユーザーはその権限を持ってMicrosoft 365の情報にアクセスします。
また、Azure Botは、Teamsをはじめとするさまざまなチャットプラットホーム（例えばLINE等）を吸収するので、アプリ開発者にとっては、複数のチャットアプリの実装を考慮する必要がないメリットもあります。

**② App Service (Webアプリ)**
Company Communicatorそのもので、Reactで実装されています。
メッセージ送信用アプリと受信用アプリの二つのエンドポイントを公開しており、送信用はTeamsのチャネルのタブアプリとして、受信用はチャット欄アクティビティとしてインターフェイスを備えています。

**③ Azure Function (関数アプリ)**
Service Busのキューからメッセージをピックアップし、受信者に対してメッセージを送信します。
送信情報をストレージアカウントのテーブルに格納し、成功・失敗のカウントを行ったり、GuestユーザーやTeamsのライセンスを持っていないユーザーにメッセージを送らないようにフィルタリングしたり、メッセージ送信周りの機能を実装しています。

**④ Service Bus (メッセージングキュー)**
送信されるメッセージはService Busのキューにキューイングされ、Azure Functionによって処理されます。
キューによって、メッセージの作成プロセスと、メッセージを受信者に届けるプロセスを切り離し、負荷を分散します。

**⑤ ストレージ アカウント (ストレージ領域)**
メッセージ送信用アプリから、特定のチームにメッセージを送信したい場合、チーム名がプルダウンで表示されるのは、なぜなのでしょうか。
実は、チームに受信用アプリケーションをインストールした際に、チームの情報がストレージのテーブルに保存されるからです。
ストレージアカウントには様々な情報が保存されますが、送信メッセージの下書きを保存するのも、ストレージアカウントの役割です。

#### 2. ARMテンプレートによるインフラ構築作業の自動化
導入手順にただ従うだけでは、今何をやっているのだろう？と疑問に思われる方も多いかと思います。
特に、良くも悪くもブラックボックスなのが、[Company Communicator Deployment Guide](https://github.com/OfficeDev/microsoft-teams-apps-company-communicator/wiki/Deployment-guide)の**2.Deploy to your Azure subscription**の箇所で、ここでは自社環境にCompany CommunicatorのAzureのリソースを展開する際のパラメーター（自社特有の可変要素）の設定を行っています。
これがAzureのインフラ構築作業の自動化、ARMテンプレートです。
ARMテンプレートの実体はJSONファイルで、作成するリソース群（Webアプリ、ストレージ等）とリソースに設定するパラメーター（リソース名、アプリケーションキー、シークレットキー等）で構成されています。
Company Communicatorは、すでにARMテンプレートが用意されているので、必要なパラメータを画面に入力することで、展開が完了します。（Company Communicatorの場合はおおよそ1時間）
ここでは、ポイントとなるパラメーターに関してみていきましょう。

**パラメーターの入力画面**
![ARM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/17a19921-7196-0f4b-304a-fd18dcf4e797.jpeg)
**① Base Resource Name**
1.Company Communicatorの構成要素で示したリソースが展開される際、リソース名は世界中でユニークである必要があります。
ここで入力するBase Resource Nameは、それらリソースの接頭名です。
例えば、Base Resource Nameを**contoso-cc**と設定すると、それぞれのリソースのURLは、以下のように設定されます
https://**contoso-cc**.azurewebsites.net（App Service）
https://**contoso-cc**.azurewebsites.net/api/messages/author（Bot Service）
https://**contoso-cc**-data-function.azurewebsites.net（Azure Function）

**② User Client Id/User Client Secret**
Azure Botであるメッセージ受信用クライアントアプリのIDとシークレットです。Azure Active Directoryで発行され、Azure Botと紐づけ、相互の信頼関係を結ぶものです。
通常、Azure環境にAzure Botリソースを作成すると、自動的にAzure Active Directory側がアプリケーションIDとシークレットを発行し、Azure Botと紐づけ、アプリ登録が完了します。
Company Communicatorの導入においては、まずAzure Active Directoryで仮のアプリ登録を行い、アプリケーションIDとシークレットを払い出します。（シークレットは手動で作成）そして、それらをARMテンプレートのパラメータと入力することで、Azure Bot側に値が埋め込まれて、アプリ登録が完了します。

**③ Author Client Id/Author Client Secret**
Azure Botであるメッセージ送信用クライアントアプリのIDとシークレットです。Azure Active Directoryで発行され、Azure Botと紐づけ、相互の信頼関係を結ぶものです。

**④ Sender UPN List**
Company Communicatorでは、メッセージ送信者を限定しています。
ここで記入したメールアドレスが、送信者の初期設定になります。複数人いる場合はセミコロン(;)で区切ってください。
後で、送信者を追加する場合、以下の手順で、直接Company Communicator (App Service)のリソースの構成から値を変更してください。
・[Azure Portal](https://portal.azure.com)にログイン
・Company Communicator (リソースの種類はApp Service)を選択
・[構成]→[AuthorizedCreatorUpns]を選択
・セミコロン(;)で区切ってメールアドレスを追記する
![AuthorizedCreatorUpns.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/85c1b545-83bb-2734-ce3d-b75e32ed4ae0.jpeg)

#### 3. Teams App Package
Teamsのアプリケーションの実体は、Webアプリケーションです。
ユーザーはTeamsを経由してCompany CommunicatorというWebアプリケーション（App Service）を利用しているのです。
WebアプリケーションをTeams経由で利用するには、Teams App Package（Teams用アプリインストーラーのようなもの）を作成する必要があります。
Teams App Packageは、アプリの設定情報が書かれたmanifestファイルと2つのアイコンファイル、計3つのファイルをzip化したものです。

**Teams App Package**
![アプリケーションパッケージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/544e4c88-0583-bea1-98b6-8544d0d41828.jpeg)


Teams App Packageの作成は、[Company Communicator Deployment Guide](https://github.com/OfficeDev/microsoft-teams-apps-company-communicator/wiki/Deployment-guide)の**5.Create the Teams app packages**の箇所です。
このガイドでは、manifest.jsonファイルを、メモ帳などのテキストエディタで編集する形で進めています。
ただ、JSON形式のmanifest.jsonファイルを一から作成するのは難しいため、本来、Teams App Packageの作成は、Developer PortalのAppsメニューからGUIで作成します。
[Developer Portal](https://dev.teams.microsoft.com)

Developer Portalを使うと、Teams App Packageの作成だけでなく、作成したアプリを自社環境のTeamsアプリストアに公開することもできます。
以下、Company Communicator Deployment Guideに従って作成したTeams App Packageを、Developer Portalで開いてみましたので、ご参考まで。
![DeveloperPortal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/7057958e-e2d6-ef80-88ce-3136f6c31f0b.jpeg)


### Company Communicatorのコスト
最後にコストの説明をさせていただきます。
Company Communicatorのコストの詳細は、以下をご参照ください。
[Cost estimate](https://github.com/OfficeDev/microsoft-teams-apps-company-communicator/wiki/Cost-estimate)

#### 概算のコスト
＜前提条件＞メッセージの送信数：1000ユーザー×5メッセージ/月＝5000メッセージ
＜概算コスト＞　**$74.50/月**
<font color="Red">Company Communicatorのリソースを作成するAzureのリージョン、送信するメッセージのサイズ等によって、コストは異なります。</font>

#### 利用部門へのコスト請求
全社ではなく、一部門のみCompany Communicatorを利用する場合、コストの請求はどうなるのでしょうか。
Azureにはテナント（=Azure Active Directory)に紐づいた、サブスクリプションという管理単位があります。
Azureの課金はサブスクリプション単位での請求となるため、完全に明細を分けたい場合は、利用部門用にサブスクリプションを分割する必要があります。
Enterprise AgreementでAzureを契約している場合は、自社でサブスクリプションの分割が可能です。
ただ、Company Communicatorを利用するだけで、サブスクリプションを分割するのは現実的ではありません。
Company Communicatorが展開されているAzureのリソースグループ単位でコストを確認し、利用部門から請求（社内振替）するのが現実的と思われます。
リソースグループグループごとのコストを確認するには、以下の手順で確認できます。
・[Azure Portal](https://portal.azure.com)にログイン
・[コストの管理と請求]→[コストの管理]を選択
・[コストの分析]から上タブの[リソースごとのコスト]ブルダウン→[リソースグループ]

**リソースグループ単位のコスト確認**
![コスト分析.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1552155/c7d2f4d8-c140-655a-cf8e-0dcef7bbb0ad.jpeg)

### 最後に
いかがでしたでしょうか。
今回は、「日本一詳しいCompany Communicator」と題しまして、TeamsアプリテンプレートのCompany Communicatorをご紹介しました。
通知系のメールをCompany Communicatorで置き換え、是非、Teamsで行えるコミュニケーションの領域を増やしてみてください。

当社が提供しているCompany Communicatorの情報は、以下のURLをご参照ください。
[Company Communicator](https://docs.microsoft.com/en-us/microsoftteams/platform/samples/app-templates#company-communicator)

それではまた。