1. はじめに
この Codelab では、OHS(Open Health Stack)と Google Cloud Healthcare API を使用して、安全性、スケーラビリティ、コンプライアンスに優れた革新的な医療ソリューションを構築する方法について説明します。これらの優れたツールの組み合わせにより、医療従事者と開発者は、患者のケアと転帰を大幅に改善できるデータドリブンなソリューションを作成する機能を得られます。
Google は、Android-FHIR SDK を使用するモバイルアプリで Open Health Stack と Google Cloud Healthcare API の機能を活用して、ユーザーが Google Cloud で FHIR 患者記録を処理できるようにする予定です。
実装手順を確認してみましょう。
作成するアプリの概要
この実装では、
- 構造化データ キャプチャ ライブラリを使用して問診票をレンダリングし、FHIR エンジン ライブラリを使用して回答の FHIR コンテンツを保存します。
- その後、データは Cloud Healthcare API を使って Cloud FHIR ストアにアップロードされます。
- アップロードの前に、まず Firebase を使用して自分たちを認証します。

上の図はフローを表しています。各コンポーネントの詳細については、ブログをご覧ください。
2. 必要なもの
- ブラウザ(Chrome、Firefox など)
- 課金を有効にした Google Cloud プロジェクト
- 最新バージョンの Android Studio
- Android Emulator のセットアップ(実際の Android デバイスを使用することもできます)
プロジェクトを作成する
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- 必要な API(BigQuery、Healthcare API)を有効にします
Cloud Shell をアクティブにする
Cloud コンソールで、[Cloud Shell をアクティブにする] をクリックします。

- Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
gcloud コマンドとその使用方法については、ドキュメントをご覧ください。
3. Healthcare API の設定
- Healthcare API が有効になっていることを確認します。Google Cloud コンソールの API ライブラリに移動し、Healthcare API を検索して [有効にする] をクリックすると、API が有効になり、Healthcare サービス アカウントがプロジェクトに追加されます。
- サービス アカウントに BigQuery 管理者権限を付与する Cloud Shell ターミナルで次の gcloud コマンドを実行して、権限を付与します。
gcloud projects add-iam-policy-binding <<YOUR_PROJECT_ID>> \
--member=serviceAccount:service-<<PROJECT_NUMBER>>@gcp-sa-healthcare.iam.gserviceaccount.com --role=roles/bigquery.admin
注: PROJECT_ID と PROJECT_NUMBER はコンソールで確認できます。ID については、ドキュメントをご覧ください。
医療データセットを作成する
Cloud Shell で次のコマンドを実行して、医療データセットを作成します。
gcloud beta healthcare datasets create <<DATASET_ID>> --location=us-central1
ロケーションをリージョンに設定します。
FHIR データストアを作成する
Cloud Shell で次のコマンドを実行して、FHIR データストアを作成します。
gcloud beta healthcare fhir-stores create <<FHIR_STORE>> \
--dataset=<<DATASET_ID>> --location=us-central1 --version=r4
ロケーションをリージョンに設定します。
4. BigQuery のセットアップとストリーミング
ここでは、FHIR ストアのデータを BigQuery データセットに保存し、BigQuery と BQML の機能を活用してクエリ、プログラム、分析を行えるようにします。
BigQuery データセットを作成する
BigQuery データセットはテーブルのコレクションです。データセット内のすべてのテーブルは、同じデータの ロケーションに保存されます。また、カスタム アクセス制御をアタッチして、データセットとそのテーブルへのアクセスを制限することも可能です。
Cloud Shell で次のコマンドを実行します。
bq mk --location=us-central1 --dataset <<PROJECT_ID>>:<<BQ_DATASET>>
ロケーションをリージョンに設定します。
BigQuery ストリーミングを作成する
FHIR ストアで FHIR リソースが作成、更新、パッチ適用、または削除されるたびにリソースの変更を BigQuery にエクスポートするには、ストリーミングが必要です。各ストアには、ストリーミング設定を最大 10 個まで含めることができます。
- Google Cloud Healthcare コンソールのブラウザページに移動します。
- 新しく作成したデータセットをクリックします。
- 新しく作成したデータストアをクリックします。

- [ADD NEW STREAMING CONFIGURATION] をクリックします。

- リストから新しく作成した BigQuery データセットを選択し、スキーマタイプを [Analytics V2]、リストからリソースタイプ [Patient] を選択して(リソースタイプはいくつでも選択できます)、[Done] をクリックします。

これで完了です。FHIR ストアのデータを保存し、BigQuery にストリーミングする準備が整いました。
5. Cloud Functions(Healthcare API を使用して R4 データを FHIR データストアに書き込む)
Cloud Functions を使うと、サーバーレスな方法でコードを記述してクラウドにデプロイできます。スケーラブル、従量課金制、イベント ドリブンで、オープンソースのテクノロジーと言語をサポートします。その他の特長については、ドキュメントをご覧ください。
ここに記述する関数では、Cloud Healthcare API を使用して、FHIR R4 形式で送られてくるデータを認証し、FHIR データストアに記述します。Cloud Functions の関数を作成するには:
- Cloud Functions に移動し、[ファンクションを作成] をクリックします。
- 名前を「fhir-datastore-proxy」、リージョンを「us-central1」、認証オプションを [Require Authentication] に設定します。
- [ランタイム、ビルド、接続、セキュリティの設定] を開きます。次の 5 つのランタイム環境変数を追加します。
名前: CLOUD_FUNCTIONS_ENDPOINT | 値: 関数の URL エンドポイント。これは上述の認証ブロックに表示され、次のような形式になります。 https://us-central1-PROJECT_ID.cloudfunctions.net/fhir-datastore-proxy
名前: PROJECT_ID | 値: ご利用のプロジェクト ID
名前: DATASET_LOCATION | 値: FHIR データストアのロケーション
名前: DATASET_ID | 値: Healthcare データストア ID
名前: FHIR_STORE_ID | 値: FHIR ストア ID
- [Next] を押して次のページに進み、コードを追加します。
- インライン エディタが表示されたら、言語として [Java 17] を選択し、HelloHttpFunction.java クラスに移動します。ファイル名を FhirDatastoreProxy.java に変更します。エントリー ポイントの名前を gcfv2.FhirDatastoreProxy に変更することも忘れないでください。
- リポジトリのコードをコピーして、インライン エディタに貼り付けます。
- pom.xml ファイルに移動し、リポジトリの pom ファイル をインライン エディタにコピーします。
- [DEPLOY] をクリックすると、間もなく関数が作成され実行されます。
注:
- この関数で使用される Cloud Healthcare API は、Healthcare API に送信されるリクエストを認証するために、アプリケーションのデフォルト認証情報を使用します。
- デプロイされた関数の URL を保存して、Android アプリケーションから呼び出せるようにします。ここまでで、Android アプリが Healthcare API を個別に使用して BigQuery に FHIR データを書き込むために必要なすべてのピースを作成しました。次に、すべてのピースを接続し、問診票の送信時に API が呼び出されることを確認します。
6. Android プロジェクトと Firebase の設定
最新バージョンの Android Studio と Android Emulator のセットアップを使用します(実際の Android デバイスを使用することもできます)。準備が整ったら、以下の手順を行います。
- FHIR アプリサンプルのリポジトリをクローニングします。https://github.com/google/fhir-app-examples
- Android Studio を開き、[Import Project (Gradle, Eclipse ADT, etc.)] を選択して、cloudfunction/ フォルダを先ほどダウンロードしたソースコードから選択します。app/google-services.json を開きます。空なので入力する必要があります。
./gradlew signingReport を使用して SHA-1 鍵を生成し、デバッグ バリアントの SHA1 フィールドをメモします。
Firebase コンソールを使用して(ステップ 1 と 2 の手順に従います)、Firebase にアプリを追加します。[Debug signing certificate SHA-1] フィールドに前のステップの値を記入します。
google-services.json をダウンロードし、Firebase のコンテンツをアプリフォルダ内の空のファイルに置き換えます。
Firebase SDK はすでに Gradle のビルドファイルに追加されています。
- FhirApplication.kt を開き、baseUrl フィールドを Cloud Functions の関数の URL に設定します。
- Android Studio のツールバーから [Sync your project with Gradle files] を選択します。
これで、実装のセットアップと依存関係の追加が完了しました。
7. 問診票の設定と回答
すでにリポジトリにある問診票の設定を行いましたが、コードを詳しく見ていきます。
- app/src/main/res/layout/activity_main.xml ファイルの ConstraintLayout 内に FragmentContainerView があることを確認します。
- QuestionnaireFragment に、フラグメントをレンダリングするために JSON エンコードされた FHIR 問診票があることを確認してください。
この場合は、json - "new-patient-registration-paginated.json"を使用してフラグメントのレンダリングを行います。 MainActivity.kt、 AddPatientFragment.kt、 AddPatientViewModel.kt のファイルをチェックします。
フラグメント、json、モデルを確認したので、次へ進みます。アプリを実行して、問診票のフィールドに回答を入力してみましょう。
文字列、日付、数値フィールド、その他の条件の検証があることがわかります。
アプリを実行し、作成されたレコードを表示してログで確認できます。

フラグメントの使用について詳しくは、こちらをご覧ください。問診票のフラグメントと回答の設定については以上です。
8. FHIR ストアと BigQuery データセット結果の表示
セットアップとアップデートが完了したので、[Sync Project with Gradle Files] をクリックします。完了したら、次を行います。
- Android Emulator 上でアプリを実行し、問診票が読み込まれるのを確認します。
- 質問に答え、上部の [Submit] をクリックします。
- アプリに [Patient is saved] というメッセージが表示されます。
FHIR ストア結果を表示する
Google Cloud Healthcare FHIRViewer コンソールに移動します。

FHIR ストアを選択し、クエリを作成し [RUN SEARCH] を押すと、すぐ下にの検索結果が表示されます。 
BigQuery データセット結果を表示する
Google Cloud BigQuery コンソールに移動し、Explorer ペインでこのプロジェクト用に作成したデータセットに移動します。

[Preview] をクリックすると、Healthcare FHIR ストアで見つけたものと同じ番号と結果のデータが BigQuery データセットに表示されます。

クラウド データセットに保存した FHIR データに対して、BigQuery SQL、アナリティクス、ML を実行できるようになりました。
9. 検索とオフライン機能
OHS を搭載した Android FHIR SDK アプリでオフライン機能を確保するには、こちらで説明する実装で有効にする必要がある 設計ガイドライン に沿って対応してください。
FHIR リソースの検索には、次の 2 つの方法があります。
- Google Cloud コンソールの FHIR ビューア
- GET または POST リクエストを使用した FHIR 検索メソッド
10. アプリのデモ
アプリを開発したので、動作させてクラウド上で結果を確認します。
11. クリーンアップ
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順に従います。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
12. 完了
おめでとうございます!このプロジェクトでは、わずか 7 つのステップで、Android アプリを作成し、Cloud Healthcare API を使用して、Cloud Healthcare FHIR ストアと BigQuery データセットで患者の FHIR データを保存し、クエリを実行しました。
- Android アプリを設定する
- Google Cloud Healthcare API を設定する
- 医療データセットと FHIR データストアを作成する
- BigQuery データセットを作成する
- FHIR データストアのデータを BigQuery データセットに書き込むための BigQuery ストリームを構成する
- Cloud Functions の関数をデプロイして R4 データを FHIR データストアに書き込む
- Android アプリから Cloud Functions の関数をトリガーして問診票の回答を送信する
明確な手順をご紹介しましたので、同様の手順で患者 FHIR の編集のクラウドへの同期を試してみてください。