DICOM Pub/Sub 通知を構成する

このページでは、Pub/Sub を使用して DICOM ストア内の臨床イベントに関する通知を受け取る方法について説明します。新しい DICOM インスタンスが DICOM ストアに保存されたとき、または Cloud Storage からインポートされたときに、Pub/Sub 通知を受け取ることができます。

Pub/Sub 通知は、ダウンストリーム処理のトリガーや新しいデータの分析など、複数の目的のために使用できます。たとえば、機械学習モデルは、トレーニングに新しいデータが利用可能になったときに通知を受け取り、分析情報を生成して患者ケアを改善できます。

次の図は、Pub/Sub 通知が生成されてパブリッシュされる仕組みを示しています。

DICOM Pub/Sub 通知。

図 1. DICOM ストア内の臨床イベントに関する Pub/Sub 通知の受信。

図 1 は、次の手順を示しています。

  1. 呼び出し元が DICOM インスタンスの保存またはインポートをリクエストします。
  2. DICOM ストアはリクエストを受け取り、Pub/Sub メッセージを作成して、DICOM ストアで構成された Pub/Sub トピックに送信します。
  3. Pub/Sub は、トピックにアタッチされたサブスクリプションにメッセージを転送します。
  4. サブスクライバーは、サブスクリプションからメッセージを受信します。並列処理を強化するために、各サブスクリプションに 1 つ以上のサブスクライバーを含めることが可能です。

準備

  1. トピックを作成します
  2. pull サブスクリプションを作成する

Pub/Sub パブリッシャー権限を追加する

Cloud Healthcare API から Pub/Sub にメッセージをパブリッシュするには、pubsub.publisher ロールをプロジェクトのCloud Healthcare サービス エージェント サービス アカウントに追加する必要があります。詳しくは、DICOM、FHIR、HL7v2 ストアの Pub/Sub 権限をご覧ください。

通知の形式と内容

Pub/Sub 通知には、臨床イベントに関する情報を含む Message オブジェクトが含まれています。DICOM Pub/Sub 通知には attributes フィールドが含まれていません。Message オブジェクトは次のようになります。

{
  "message": {
    "data": "BASE_64_ENCODED_DATA",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

data フィールドの値は、Base64 でエンコードされた文字列として次の識別子です。projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID

各 Pub/Sub メッセージに含まれるフィールドの詳細については、ReceivedMessagePubsubMessage をご覧ください。

通知を構成して表示する

このセクションでは、DICOM ストアで Pub/Sub 通知を有効にする方法、DICOM インスタンスを保存またはインポートして通知を公開する方法、通知を表示する方法について説明します。

DICOM ストアを構成する

次のサンプルは、新しい DICOM インスタンスが Cloud Storage に保存またはインポートされたときに、DICOM ストアで Pub/Sub 通知を有効にする方法を示しています。

REST

projects.locations.datasets.dicomStores.patch メソッドを使用します。

NotificationConfig.sendForBulkImport の値は true であるため、Cloud Storage からデータをインポートするときに通知が送信されます。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクトの ID
  • LOCATION: データセットの場所
  • DATASET_ID: DICOM ストアの親データセット
  • DICOM_STORE_ID: DICOM ストアの ID
  • PUBSUB_TOPIC: データストアでイベントが発生した場合にメッセージが公開される Pub/Sub トピック

リクエストの本文(JSON):

{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

cat > request.json << 'EOF'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
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"

PowerShell

リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

@'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
'@  | 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" | Select-Object -Expand Content

API Explorer

リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。

次のようなレスポンスが返されます。

DicomStore リソースでフィールドを構成した場合は、そのフィールドもレスポンスに表示されます。

gcloud

gcloud healthcare dicom-stores update コマンドを実行します。

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: Google Cloud プロジェクトの ID
  • LOCATION: データセットの場所
  • DATASET_ID: DICOM ストアの親データセット
  • DICOM_STORE_ID: DICOM ストアの ID
  • PUBSUB_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 するには、次の操作を行います。

  1. DICOM インスタンスを保存またはimportします。このリクエストにより、Cloud Healthcare API は構成済みの Pub/Sub トピックにメッセージを公開します。

  2. メッセージを取得します。単一のリクエストで複数の DICOM インスタンスをインポートすると、DICOM インスタンスごとにメッセージが生成されます。

    Pub/Sub メッセージを pull するために必要な Identity and Access Management 権限については、Pub/Sub のアクセス制御をご覧ください。

    REST

    projects.subscriptions.pull メソッドを使用します。次のサンプルでは、?maxMessages=10 クエリ パラメータを使用して、リクエストで返されるメッセージの最大数を指定しています。この値はユースケースに合わせて調整します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • PUBSUB_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 Content

    API 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 プロジェクトの ID
    • PUBSUB_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": {
          "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==",
          "messageId": "7586159156345265",
          "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
        }
      }
    ]
    

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 に送信されません。

次のステップ