このページでは、Pub/Sub を使用して DICOM ストア内の臨床イベントに関する通知を受け取る方法について説明します。DICOM ストアで新しい DICOM インスタンスが保存、Cloud Storage からインポート、更新、削除されたときに、Pub/Sub 通知を受信できます。
Pub/Sub 通知は、ダウンストリーム処理のトリガーや新しいデータの分析など、さまざまな目的に使用できます。たとえば、新しいデータがトレーニングに利用可能になったときに、機械学習モデルが通知を受け取り、患者ケアを改善するための分析情報を生成できます。
次の図は、Pub/Sub 通知が生成されてパブリッシュされる仕組みを示しています。
図 1. DICOM ストア内の臨床イベントに関する Pub/Sub 通知を受信する。
図 1 は次の手順を示しています。
- 呼び出し元が DICOM インスタンスの保存またはインポートをリクエストします。
- DICOM ストアはリクエストを受け取り、Pub/Sub メッセージを作成して、DICOM ストアで構成された Pub/Sub トピックに送信します。
- Pub/Sub は、トピックにアタッチされたサブスクリプションにメッセージを転送します。
- サブスクライバーは、サブスクリプションからメッセージを受信します。並列処理を強化するために、各サブスクリプションに 1 つ以上のサブスクライバーを含めることが可能です。
準備
Pub/Sub パブリッシャー権限を追加する
Cloud Healthcare API から Pub/Sub にメッセージをパブリッシュするには、pubsub.publisher
ロールをプロジェクトのCloud Healthcare サービス エージェント サービス アカウントに追加する必要があります。詳しくは、DICOM、FHIR、HL7v2 ストアの Pub/Sub 権限をご覧ください。
通知の構成
DICOM ストアの DicomNotificationConfig
オブジェクトで、Pub/Sub 通知とその動作を構成できます。各 DICOM ストアには、複数の DicomNotificationConfig
オブジェクトを構成できます。
次の表に、DicomNotificationConfig
オブジェクトのフィールドを示します。
フィールド | 説明 | 例 |
---|---|---|
pubsubTopic |
DICOM ストアにアタッチする Pub/Sub トピック。通知は指定されたトピックに送信されます。 | projects/my-project/topics/my-topic |
通知の形式と内容
Pub/Sub 通知には、臨床イベントに関する情報を含む Message
オブジェクトが含まれています。Message
オブジェクトは次のようになります。
{ "message": { "attributes": { "action": "ACTION", "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME", "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID", "studyInstanceUID": "STUDY_UID", "seriesInstanceUID": "SERIES_UID", "sopInstanceUID": "INSTANCE_UID", "versionId": "VERSION_ID", "modality": "MODALITY", "storageClass": "STORAGE_CLASS", "previousStorageClass": "PREVIOUS_STORAGE_CLASS" }, "data": "BASE_64_ENCODED_DATA", "messageId": "MESSAGE_ID", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } }
各 Pub/Sub メッセージに含まれるフィールドの詳細については、ReceivedMessage
と PubsubMessage
をご覧ください。
次の表に、attributes
オブジェクトの各フィールドの説明を示します。
属性 | 説明 | 例 |
---|---|---|
action |
DICOM リソースで発生したアクション。有効な値は次のとおりです。
|
StoreInstances |
lastUpdatedTime |
DICOM リソースが変更された直近の時刻のタイムスタンプ。タイムスタンプは RFC 1123 形式を使用します。 | Mon, 01 Jan 2020 00:00:00 UTC |
storeName |
アクションが発生した DICOM ストアの完全なリソース名。 | projects/my-project/locations/us/datasets/my-dataset/dicomStores/my-dicom-store |
studyInstanceUID |
DICOM スタディ インスタンスの一意の識別子(UID)。 | 1.2.3.4.5.6 |
seriesInstanceUID |
DICOM シリーズ インスタンスの一意の識別子(UID)。 | 1.2.3.4.5.6 |
sopInstanceUID |
DICOM SOP インスタンスの一意の識別子(UID)。 | 1.2.3.4.5.6 |
versionId |
アクションが行われた DICOM リソースの最新バージョンの ID。 | MTY4MzA2MDQzOTI5NjIxMDAwMA |
modality |
DICOM リソースのモダリティ タグ。有効な値は次のとおりです(これらに限定されません)。
|
CT |
storageClass |
DICOM リソースのストレージ クラス。有効な値は次のとおりです。
|
STANDARD |
previousStorageClass |
DICOM リソースの以前のストレージ クラス。有効な値は次のとおりです。
|
NEARLINE |
次の表に、message
オブジェクトの残りのフィールドを示します。
フィールド | 説明 |
---|---|
data |
次の識別子の Base64 でエンコードされた文字列: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID |
messageId |
Pub/Sub メッセージの識別子。 |
publishTime |
Pub/Sub サーバーがメッセージを公開した時刻。 |
通知を構成して表示する
このセクションでは、DICOM ストアで Pub/Sub 通知を有効にする方法、DICOM インスタンスを保存またはインポートして通知を公開する方法、通知を表示する方法について説明します。
DICOM ストアを構成する
次のサンプルは、新しい DICOM インスタンスが保存されたとき、または Cloud Storage からインポートされたときに、DICOM ストアで Pub/Sub 通知を有効にする方法を示しています。
REST
projects.locations.datasets.dicomStores.patch
メソッドを使用します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDLOCATION
: データセットの場所DATASET_ID
: DICOM ストアの親データセットDICOM_STORE_ID
: DICOM ストアの IDPUBSUB_TOPIC
: データストアでイベントが発生した場合にメッセージが公開される Pub/Sub トピック
リクエストの本文(JSON):
{ "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
cat > request.json << 'EOF' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] } EOF
その後、次のコマンドを実行して REST リクエストを送信します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfigs"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。
@' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] } '@ | Out-File -FilePath request.json -Encoding utf8
その後、次のコマンドを実行して REST リクエストを送信します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfigs" | Select-Object -Expand Content
API Explorer
リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。
次のようなレスポンスが返されます。
DicomStore
リソースでフィールドを構成した場合は、そのフィールドもレスポンスに表示されます。
gcloud
gcloud healthcare dicom-stores update
コマンドを実行します。
後述のコマンドデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDLOCATION
: データセットの場所DATASET_ID
: DICOM ストアの親データセットDICOM_STORE_ID
: DICOM ストアの IDPUBSUB_TOPIC
: データストアでイベントが発生した場合にメッセージが公開される Pub/Sub トピック
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud healthcare dicom-stores update DICOM_STORE_ID \ --dataset=DATASET_ID \ --location=LOCATION \ --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC \ --send-for-bulk-import
Windows(PowerShell)
gcloud healthcare dicom-stores update DICOM_STORE_ID ` --dataset=DATASET_ID ` --location=LOCATION ` --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC ` --send-for-bulk-import
Windows(cmd.exe)
gcloud healthcare dicom-stores update DICOM_STORE_ID ^ --dataset=DATASET_ID ^ --location=LOCATION ^ --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC ^ --send-for-bulk-import
次のようなレスポンスが返されます。
レスポンス
Updated dicomStore [DICOM_STORE_ID]. ... name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID notificationConfig: pubsubTopic: projects/PROJECT_ID/topics/PUBSUB_TOPIC sendForBulkImport: true
DICOM インスタンスを保存またはインポートして、Pub/Sub 通知を表示する
DICOM インスタンスを保存またはインポートして、生成された Pub/Sub メッセージを pull するには、次の操作を行います。
DICOM インスタンスを保存またはインポートします。このリクエストにより、Cloud Healthcare API で構成済みの Pub/Sub トピックにメッセージが公開されます。
メッセージを pull します。単一のリクエストで複数の DICOM インスタンスをインポートすると、DICOM インスタンスごとにメッセージが生成されます。
Pub/Sub メッセージの pull に必要な Identity and Access Management 権限については、Pub/Sub のアクセス制御をご覧ください。
REST
projects.subscriptions.pull
メソッドを使用します。次のサンプルでは、?maxMessages=10
クエリ パラメータを使用して、リクエストで返されるメッセージの最大数を指定しています。この値はユースケースに合わせて調整します。リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDPUBSUB_SUBSCRIPTION_ID
: DICOM ストアに構成された Pub/Sub トピックにアタッチされるサブスクリプションの ID
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
次のコマンドを実行します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10"PowerShell
次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-Uri "https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10" | Select-Object -Expand ContentAPI Explorer
メソッド リファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。必須フィールドを入力して、[Execute] をクリックします。
次のような JSON レスポンスが返されます。
gcloud
gcloud pubsub subscriptions pull
コマンドを実行するサンプルでは、次の Google Cloud CLI フラグを使用します。
--limit=10
: 最大 10 件のメッセージを返します。この値はユースケースに合わせて調整します。--format=json
: 出力を JSON としてレンダリングします。--auto-ack
: pull されたすべてのメッセージに自動的に確認応答を行います。
後述のコマンドデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDPUBSUB_SUBSCRIPTION_ID
: DICOM ストアに構成された Pub/Sub トピックにアタッチされるサブスクリプションの ID
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud pubsub subscriptions pull \ projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID \ --limit=10 \ --auto-ack \ --format=json
Windows(PowerShell)
gcloud pubsub subscriptions pull ` projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ` --limit=10 ` --auto-ack ` --format=json
Windows(cmd.exe)
gcloud pubsub subscriptions pull ^ projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ^ --limit=10 ^ --auto-ack ^ --format=json
次のようなレスポンスが返されます。
[ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "attributes": { "action": "ImportDicomData", "lastUpdatedTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ", "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID", "studyInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857604", "seriesInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857605", "sopInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857606", "versionId": "MTY4MzA2MDQzOTI5NjIxMDAwMA", "modality": "CT", "storageClass": "STANDARD", }, "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } } ]
notificationConfig
から notificationConfigs
に移行する
既存の DICOM ストア ユーザーで、notificationConfig
フィールドを使用して Pub/Sub トピックを構成している場合は、notificationConfigs
フィールドに移行する必要があります。主な違いは次のとおりです。
dicomStore.notificationConfig
は 1 つのサブスクライバーのみをサポートしますが、dicomStore.notificationConfigs
は複数のサブスクライバーをサポートします。dicomStore.notificationConfig
はNotificationConfig
を使用します。これは非推奨となり、DicomNotificationConfig
に置き換えられます。dicomStore.notificationConfigs
は、ImportDicomData
、DeleteInstances
などの利用可能なすべての DICOM オペレーションの通知を自動的に送信することをサポートしています。そのため、NotificationConfig.sendForBulkImport
のサポートは終了しました。特定のサブスクライバーに対して受信するメッセージを選択したり、不要なメッセージをフィルタしたりする場合は、サブスクリプションからのメッセージをフィルタする機能を使用できます。たとえば、
attributes.action != "ImportDicomData"
を使用して、ImportDicomData
オペレーションから送信されたすべてのメッセージを除外できます。REST
dicomStores.patch
メソッドを使用します。notificationConfig
を使用してストアにトピックがすでに設定されていることを前提とします。リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDLOCATION
: データセットの場所DATASET_ID
: DICOM ストアの親データセットDICOM_STORE_ID
: DICOM ストアの ID
リクエストの本文(JSON):
{ "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を
request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。cat > request.json << 'EOF' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] } EOF
その後、次のコマンドを実行して REST リクエストを送信します。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig,notificationConfigs"PowerShell
リクエスト本文を
request.json
という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。@' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] } '@ | Out-File -FilePath request.json -Encoding utf8
その後、次のコマンドを実行して REST リクエストを送信します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig,notificationConfigs" | Select-Object -Expand ContentAPI Explorer
リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。
次のようなレスポンスが返されます。
DicomStore
リソースでフィールドを構成した場合は、そのフィールドもレスポンスに表示されます。
Cloud Healthcare API と Pub/Sub メッセージ ストレージ ポリシー
Cloud Healthcare API データと Pub/Sub メッセージ内の関連データが同じリージョンに存在するようにするには、Pub/Sub メッセージ ストレージ ポリシーを設定する必要があります。
データが同じリージョンに留まるようにするには、データストアに構成された Pub/Sub トピックでメッセージ ストレージ ポリシーを明示的に設定する必要があります。たとえば、Cloud Healthcare API データセットと FHIR ストアが us-central1
にある場合、メッセージ ストレージ ポリシーで us-central1
リージョンのみに許可する必要があります。
メッセージ ストレージ ポリシーを構成するには、メッセージ ストレージ ポリシーを構成するをご覧ください。
不明な Pub/Sub メッセージのトラブルシューティング
通知を Pub/Sub に公開できない場合は、Cloud Logging にエラーが記録されます。詳細については、Cloud Logging でのエラーログの表示をご覧ください。
エラー生成率が制限を超えると、この制限を超えたエラーは Cloud Logging に送信されません。