Amazon Chime SDK messagingでリアルタイムコラボレーションを行う
Amazon Chime SDK messagingは、開発者がユーザーのコミュニティを安全かつスケーラブル、そして永続的なメッセージングで簡単に接続するために必要なビルディングブロックを提供します。利用可能なAPIには、メッセージの送信、履歴の取得、メッセージの編集および削除、保存されたメッセージの保持ポリシーの設定、チャットデータのストリーミングエクスポートなどがあります。Amazon Chime SDK messagingは、お客様がより迅速に構築できるよう支援し、運用を簡素化します。
Amazon Chime SDK messagingを1対1のメッセージングユースケースに使用できることに加え、弊社のAPIは、幅広いユースケースに対応できる柔軟性を備えているとお客様は実感されています。Amazon Chime SDK messagingをアプリケーションのデータトランスポートとして使用し、ユーザーにとって真にユニークなエクスペリエンスを構築しています。また私たちのお客様は、コラボレーションチャットから、ビデオ放送と並行したメッセージング、そしてオンラインドキュメントやホワイトボードでのリアルタイムコラボレーションに至るまで、さまざまなエクスペリエンスを構築しています。
Amazon Chime SDKを使用して会議を強化しているお客様は、ホワイトボードやその他のコラボレーション体験のために、これまでミーティング中に利用できるデータチャネル機能を使用してきました。これは一部のユースケースではうまくいきますが、会議以外でも利用できる永続的なエクスペリエンスを求めるお客様は、Amazon ChimeSDK messagingに切り替えています。このアプローチによって、会議の内外でのコラボレーションが可能となり、永続性が維持されるため、コラボレーションの開始時に出席していなくても、すべてのユーザーが同じエクスペリエンスを共有できます。
このブログでは、開発者がAmazon Chime SDK messagingを使用して、リアルタイムコラボレーションアプリケーションを簡単に構築できる方法を紹介します。Amazon Chime SDK messagingを使用すると、スケーリング時のメッセージの永続化、保護、配信する際の複雑さを排除できます。このブログのデモでは、分散データ構造の同期にYjsを選択しました。その理由は、YjsはAmazon Chime SDK messagingと簡単に統合できる、しっかりとサポートされているオープンソースのコラボレーションソリューションだからです。また、このブログでYjsに適用されている概念は、他のほぼすべてのコラボレーションソリューションにも同様に適用できます。
アプリケーションの概要
Amazon Chime SDK messagingを使用して、テキストエディタのデモアプリケーションを構築しました。このテキストエディタを使用すると、複数の参加者が共有テキストドキュメントを編集できます。アプリケーションは、ユーザーの変更をYjsドキュメントに永続化します。Yjsドキュメントは、配列(Array)、マップ(Map)、テキスト(Text)やその他の基本的な共有データタイプで構成されています。これらの基本的な共有データタイプを使用して、リアルタイムコラボレーションアプリケーションを構築できます。
Amazon Chime SDK messagingサービスは、テキストエディタアプリケーションのサーバー側コンポーネントです。メッセージングサービスは、各クライアントからドキュメントデルタを受信し、永続化します。そしてメッセージングサービスは、関連するチャネルのメンバーである、各ユーザーにドキュメントデルタをブロードキャストします。ドキュメント同期ロジックおよびその他のアプリケーションロジックは、クライアント側で実行されるため、メッセージングサービスはドキュメントデルタのコンテンツを解析しません。このアプローチにより、Amazon Chime SDK messagingを幅広いアプリケーションに使用できます。
このアーキテクチャには、次の4つの主要コンポーネントがあります。
- リアルタイムコラボレーションアプリケーション– ユーザーが共有ドキュメント上で共同作業できるようにします。
- Amazon Chime SDK Messaging – ドキュメントの変更を永続化およびブロードキャストし、ドキュメントアクセスのコントロールを提供します。
- Amazon API Gateway – クライアントをチャネルおよびユーザー作成のためのAWS Lambdaに接続します。
- チャネルとユーザー作成のための AWS Lambda 関数 – Amazon Chime SDKを使用して、チャネルおよびユーザーを作成し、チャネルにユーザーを追加します。
前提条件
このウォークスルーでは、次の前提条件を満たす必要があります。
注:この記事に記載されているデモをデプロイして使用すると、料金が発生します。使用を中止し、料金を発生させないためには、この記事の最後にある、デモとそのリソースを削除する手順を参照ください。実可動の使用量が多い場合に受けられるボリュームディスカウント、およびサービスクォータの増加に関する詳細については、こちらまでお問い合わせください。
テキストエディタのデモアプリケーションをデプロイする
AWSリソースを作成する
- プライマリアカウントでAWSマネジメントコンソールにサインインします。us-east-1(バージニア北部)リージョンに切り替えます。注:このセクションのAWS CloudFormationテンプレートは、米国東部(バージニア北部)リージョンで起動する必要があります。
- GitHubのリアルタイムコラボレーションサンプルアプリケーションからAWS CloudFormationテンプレートの内容をコピーし、
real-time-collaboration-template.yaml
という名前の新しいファイルとして保存します。 - AWS CloudFormationコンソールを開き、「Create stack」を選択します。
- 「Upload a template file」を選択し、
real-time-collaboration-template.yaml
ファイルを参照します。 - 「Stack name」に
real-time-collaboration-demo
と入力し、「Next」 を選択します。 - 「Specify details」 ページで、スタック名「DemoName-ChimeCollabDemo」と入力します。
- 「Next」を選択し、「Configure stack options」ページで「Next」を選択します。
- 「Review」ページで、「I acknowledge that AWS CloudFormation might create IAM resources」のボックスにチェックを入れます。そして「Create」をクリックします。
- スタックを作成すると、ApigateWayUrl、AppInstanceArn、AdminUserArnの3つのアウトプットが生成されます。これらの値は、次のステップでデモアプリを設定する際に使用するため、メモしてください。
テキストエディタのデモアプリケーションをローカルにデプロイする
このセクションでは、ローカル環境でデモアプリをインストールして構築します。
- GitHubからプロジェクトをクローンします:
git clone https://github.com/aws-samples/amazon-chime-sdk.git
- 次のコマンドを実行して、ルートフォルダへ移動します:
cd ./amazon-chime-sdk/apps/real-time-collaboration
- 次のコマンドを実行して、ルートフォルダからdependenciesをインストールします:
npm install
npm run build
テキストエディタのデモアプリケーションをローカルで実行する
このセクションでは、ローカル環境でテキストエディタWebアプリを実行します。このシンプルなテキストエディタを使用すると、複数のユーザーが共有テキストドキュメントを編集できます。このデモをローカルで実行する際、複数のブラウザタブまたは複数のブラウザを起動させることによって、1つのブラウザの変更が他のすべてのブラウザ間で同期されることを確認できます。また、Amazon Simple Storage Service(S3)ウェブサイトホスティングを使用して、このアプリをアカウントの静的ウェブサイトとしてホストし、他のデバイスからの参加者と共同作業することもできます。ユースケースに関連するS3バケットのセキュリティポリシーを使用して、ホストするアプリケーションへのアクセスを制限し、アプリケーションを保護する必要があります。
- 次のコマンドを実行して、テキストエディタフォルダに移動します。
cd ./amazon-chime-sdk/apps/real-time-collaboration/examples/text-editor
- 選択したエディタで次のコマンドを開きます。./amazon-chime-sdk/apps/real-time-collaboration/examples/text-editor/src/Config.js 次の設定を追加します:
export const appConfig = {
ApiGatewayUrl: '',
AppInstanceArn: '',
AdminUserArn: ''
};
- アプリケーションの設定を入力したら、テキストエディタフォルダで次のコマンドを実行します。
npm run start
- ブラウザを開き、https://localhost:8080/に移動してテストを開始します。アプリケーションは、このセッション用に作成されたAmazon ChimeチャネルでURLを更新します。テキストエディタにいくつかの単語を入力します。
- Amazon ChimeチャネルのURLを新しいウェブブラウザウィンドウにコピーします。新しいブラウザウィンドウに、先ほど入力したテキストが表示されます。新しいWebブラウザウィンドウのテキストエディタにいくつかの単語を入力します。テキストが最初のWebブラウザセッションと同期していることが確認できます。
AWS認証情報とチャネルアクセスの取得
テキストエディタのデモアプリケーションでは、シンプルなプロセスを使用してユーザーを認証し、ユーザーにチャネルへのアクセスを許可します。このアプローチは、ユーザーアカウントや、ドキュメントの作成者から直接付与されるドキュメントアクセス権を必要とせずに、ユーザーが共有ドキュメントで、簡単かつ迅速に共同作業するようなユースケースには最適です。
このデモアプリにはシンプルな認証プロセスがありますが、Amazon Chime SDK messagingでは、ユーザー作成、チャネルのモデレーション、チャネルアクセス権限APIが用意されており、特定のユースケースに合わせて、細かなドキュメントアクセス権限の設定を構築できます。たとえば、ドキュメントの作成者がチャネルモデレーターである、ドキュメントアクセスビジネスロジックを実装できます。ドキュメントの作成者は、他のユーザーにドキュメントアクセス権を付与します。さらに、ユーザーがメッセージを送信できないよう制限し、ドキュメントを読み取り専用に設定することで、ドキュメントの読み取り専用権限を実装できます。
Amazon Chime SDKメッセージングはほぼすべてのIDプロバイダーで動作するため、上記の「アプリケーションの概要」の図に示されている、チャネルとユーザーLambda関数機能を、独自のIDプロバイダーに置き換えることによって、ゲストアクセスを完全に排除することができます。IDプロバイダーをAmazon Chime SDK messagingと統合させる方法の詳細については、こちらのブログ記事をご覧ください。
リアルタイムコラボレーションアプリケーション
リアルタイムコラボレーションアプリケーションは、次の3つの広範なコンポーネントで構成されています:アプリケーションプレゼンテーション、クライアントデータ同期フレームワーク、バックエンドサービスです。アプリケーションプレゼンテーションは、ユーザーが基盤としている、共有ドキュメントを変更するためのインターフェイスを提供します。クライアントデータ同期フレームワークは、ドキュメントの変更を共有オブジェクトにマージし、バックエンドサービスに発行します。バックエンドサービスは変更を永続化し、ドキュメントの参加者に配布します。
クライアントデータ同期フレームワークは、新しいローカルドキュメントの変更を発行し、他のドキュメント共同作業者からの新しいドキュメントの変更を、ローカルドキュメントにマージします。クライアントフレームワークとしてYjsを選択しましたが、この同じ概念は他のほぼすべてのコラボレーションソリューションにも適用できます。Yjsドキュメントは、1つ以上の共有オブジェクトによって構成されています。1つのYjsドキュメントの変更は、マージコンフリクトなしで、他のYjsドキュメントにマージできます。アプリケーションプレゼンテーションは、ユーザーの入力を受け取り、変更をYjsドキュメントのローカルコピーに永続化します。Yjsプロバイダーを使用して、Yjsは他のドキュメント共同作業者とドキュメントの変更情報を交換します。
Amazon Chime SDK messagingでYjsプロバイダーを実装して、ドキュメントの変更を送受信しました。バックエンドサービスは、ドキュメントの変更を永続化し、ドキュメント共同作業者間に配布します。Amazon Chime SDK messagingはドキュメントの変更に対して、安全でスケーラブルであり、低レイテンシーかつ永続的なデータ転送を提供します。Amazon Chime SDK messagingでYjsプロバイダーを使用すると、ドキュメントの変更をAmazon Chime SDK messagingサービスに送信できます。プロバイダーは、Amazon Chime SDK messagingサービスへの永続的なWebSocket接続を確立し、新しいドキュメントの変更を低レイテンシーで受信します。マージロジックはクライアント側で実行されるため、Amazon Chime SDK messagingサービスは、ドキュメントの変更内容を解析しません。
ドキュメントの変更および一時的なステータスの同期
Amazon Chime SDK messagingを使用すると、クライアントデータ同期フレームワークで永続データと一時データの両方を交換できます。Yjsはドキュメントの変更を送信します。ドキュメントの変更は永続化されるため、ドキュメントの変更で、最新のドキュメントを再構築できます。またYjsは、マウスカーソルの位置やテキスト選択などの一時的なデータを認識情報として送信します。Amazon Chime SDK messagingの Yjsプロバイダーは、SendChannelMessage APIを使用してメッセージを送信します。タイプは、ドキュメントの変更に対してPERSISTENT
(永続的)であり、認識情報には NON_PERSISTENT
(非永続的)です。Amazon Chime SDK messagingサービスは、ドキュメントの変更と認識情報の両方を、ドキュメントの共同作業者に配信しますが、ドキュメントの変更のみがAmazon Chime SDK messagingサービスに永続化されます。
プロバイダーは、シンプルなドキュメント変更戦略を実装します。プロバイダーは、500 ミリ秒以内に行われた複数のドキュメントの変更を、1つのメッセージにバッチ処理します。このシンプルな戦略は、アプリケーションの応答性と、テキストエディタに送信されたメッセージ数の間でバランスをとります。特定のユースケースに対して、異なるバッチ処理戦略を使用することも可能です。
最新のドキュメントステータスを取得する
ドキュメントの共同作業者は、Amazon Chime SDK messagingサービスに保存されているドキュメントの変更を適用することで、ドキュメントの最新版を取得します。アプリケーションの初期化中に、Amazon Chime SDKメッセージングのYjsプロバイダーはListChannelMessages APIを呼び出し、Amazon Chime SDK messagingで永続化されたドキュメントの変更を取得します。プロバイダーは、共同作業者のローカルドキュメントに永続化されたドキュメントの変更を適用して、最新のドキュメントステータスに更新します。
次のステップとして、Yjsプロバイダーをさらに最適化できます。ドキュメントの変更のみを含む最新のドキュメントを作成するのではなく、ドキュメントのステータスのスナップショットを使用することで、最新のドキュメントを取得するプロセスを最適化できます。スナップショットは、クライアント側またはサービス側のどちらでも生成できます。クライアント側のアプローチでは、ドキュメント共同作業者を1人選び、スナップショットを作成してもらいます。クライアントは、ローカルドキュメントのステータスをシリアル化します。次に、ドキュメントをS3などのオブジェクトストアサービスにアップロードします。そしてクライアントは、SendChannelMessageリクエストの「Metadata」フィールドで指定されたS3バケットARNを使用して、Amazon Chime SDK messagingサービスにメッセージを送信します。サービス側のアプローチでは、Lambda関数は以前のスナップショットと直近のドキュメントの変更を使用して、新しいスナップショットを作成します。Lambdaは、Amazon Kinesis Data Streamsでストリーミングチャットのエクスポートを使用します。クライアント側のアプローチと同様、LambdaはスナップショットをS3に保存し、リクエストの「Metadata」フィールドにS3バケットARNを提供します。アプリケーションの初期化中に、プロバイダーはListChannelMessages APIを呼び出し、最新のスナップショットが見つけるまで、永続化されたドキュメントの変更を取得します。プロバイダーは、直近のスナップショットの上に、最新の永続化したドキュメントの変更を適用し、最新のドキュメントのステータスを取得します。
クリーンアップ
テキストエディタのデモアプリケーション使用料の課金が発生しないよう、デモアプリケーションをデプロイするセクションで作成した、AWS CloudFormationスタックとリソースを削除してクリーンアップします。
スタックとそのリソースを削除するには:
- us-east-1のAWS CloudFormationコンソールから、このデモ用に作成したスタックを選択します。
- 「Delete stack」をクリックします。
- 表示される確認メッセージ、「Yes, Delete」 をクリックします。この段階で、ステータスが
DELETE_IN_PROGRESS
に変わります。スタック作成を監視したのと同じ方法で、「Events」タブを使用してスタックの削除を監視します。AWS CloudFormationがスタックの削除を完了すると、リストからスタックが削除されます。
まとめ
この記事では、Amazon Chime SDK messagingをビルディングブロックとして使用し、安全でスケーラブルな、リアルタイムコラボレーションアプリケーションを簡単に構築する方法について説明しました。Amazon Chime SDK messagingは、お客様が選択する可能性のある、他のほぼすべてのコラボレーションソリューションで使用できます。
Amazon Chime SDKのメッセージング機能は、現在米国東部(バージニア北部)リージョンで、メッセージ毎の低価格の課金方式でご利用いただけます。Amazon Chime SDK messagingの使用を開始するには、開発者ガイドをご覧ください。
参考リンク
AWS Media Services AWS Media & Entertainment Blog (日本語) AWS Media & Entertainment Blog (英語)
AWSのメディアチームの問い合わせ先: awsmedia@amazon.co.jp ※ 毎月のメルマガをはじめました。最新のニュースやイベント情報を発信していきます。購読希望は上記宛先にご連絡ください。
翻訳は BD山口、SA小林が担当しました。原文はこちらをご覧ください。