PACS の Cloud Healthcare API への接続

このページでは、Google Kubernetes Engine(GKE)でオープンソースの Cloud Healthcare API DICOM アダプタを使用して、Picture Archiver and Communication System(PACS)を Cloud Healthcare API に接続し、DICOM データをインポートします。

このガイドでは、Google Kubernetes Engine と Compute Engine 仮想マシン(VM)を使用してプロトタイプを簡単に設定する方法について説明します。Compute Engine VM で、オンプレミス PAC がシミュレートされます。詳細については、GitHub の DICOM adapter README をご覧ください。

概要

DICOM アダプタには、従来の DICOM DIMSE プロトコル(C-STORE など)と RESTful DICOMweb プロトコル(STOW-RS など)の間でデータを変換できる一連のコンポーネントが用意されています。このアダプタは、インポート アダプタとエクスポート アダプタの 2 つの主要コンポーネントで構成されます。このガイドでは、インポート アダプタを使用して DICOM 画像を DICOM ストアにインポートします。

料金

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Cloud Healthcare API
  • Google Kubernetes Engine
  • Compute Engine

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことが可能です。新しい Cloud Platform ユーザーは無料トライアルをご利用いただけます。

始める前に

DICOM アダプタを設定する前に、次の手順を行って、Google Cloud プロジェクトを選択するか作成して、必要な API を有効にする必要があります。

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Healthcare API, Google Kubernetes Engine, and Container Registry API を有効にします。

    API を有効にする

  5. GKE API と関連サービスが有効になるのを待ちます。 これには数分かかることがあります。

シェルを選択する

このチュートリアルを完了するには、Cloud Shell またはローカルシェルを使用します。

Google Cloud Shell は、Google Cloud でホストされているリソースを管理するためのシェル環境です。Cloud Shell には、gcloud ツールkubectl ツールがあらかじめインストールされています。gcloud ツールは、GCP の主要なコマンドライン インターフェースを提供します。kubectl は、GKE クラスタに対してコマンドを実行するためのコマンドライン インターフェースを提供します。

ローカルシェルを使用する場合は、gcloud ツールと kubectl ツールを含む Cloud SDK をインストールする必要があります。

Cloud Shell を開くか、ローカルシェルの構成は、次の手順で行います。

Cloud Shell

Cloud Shell の起動は、次の手順で行います。

  1. Google Cloud Console に移動します。

    Google Cloud Console

  2. コンソールの右上隅にある [Google Cloud Shell の有効化] ボタン をクリックします。

コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルで gcloud コマンドと kubectl コマンドを実行します。

ローカルシェル

gcloud ツールと kubectl ツールをインストールするには、最新の Cloud SDK バージョンをインストールして初期化します。

DICOM ストアの作成

DICOM アダプタを使用する前に、DICOM ストアを作成しておく必要があります(まだ作成していない場合)。

Google Kubernetes Engine を使用したアダプタのデプロイ

インポート アダプタとエクスポート アダプタは、Container Registry 内の事前に構築された Docker イメージでステージングされたコンテナ化アプリケーションです。これらのイメージをデプロイして、GKE クラスタで実行できます。

クラスタを作成する

GKE 内に dicom-adapter という名前のクラスタを作成するには、gcloud container clusters create コマンドを実行します。

gcloud container clusters create dicom-adapter \
    --zone=COMPUTE_ZONE \
    --scopes=https://www.googleapis.com/auth/cloud-healthcare

ここで

  • COMPUTE_ZONE は、クラスタがデプロイされているゾーンです。ゾーンとは、クラスタとそのリソースがデプロイされるおおよその場所を示すものです。たとえば、us-west1-aus-west リージョン内のゾーンです。gcloud config set compute/zone を使用してデフォルト ゾーンを設定した場合は、このフラグの値でデフォルト値がオーバーライドされます。

成功した場合、コマンドは次のレスポンスを返します。

Creating cluster dicom-adapter in COMPUTE_ZONE... Cluster is being health-checked (master is healthy)...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters/dicom-adapter].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/COMPUTE_ZONE/dicom-adapter?project=PROJECT_ID
kubeconfig entry generated for dicom-adapter.
NAME           LOCATION    MASTER_VERSION  MASTER_IP        MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
dicom-adapter  COMPUTE_ZONE  1.15.12-gke.2   123.456.789.012  n1-standard-1  1.15.12-gke.2  3          RUNNING

デプロイの構成

アプリケーションを GKE にデプロイするときは、Deployment マニフェスト ファイル(通常は YAML ファイル)を使用して Deployment のプロパティを定義します。

テキスト エディタを使用して、次の内容が含まれる、インポート アダプタの Deployment マニフェスト ファイルを dicom_adapter.yaml という名前で作成します。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dicom-adapter
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: dicom-adapter
    spec:
      containers:
        - name: dicom-import-adapter
          image: gcr.io/cloud-healthcare-containers/healthcare-api-dicom-dicomweb-adapter-import:0.2.1
          ports:
            - containerPort: 2575
              protocol: TCP
              name: "port"
          args:
            - "--dimse_aet=IMPORTADAPTER"
            - "--dimse_port=2575"
            - "--dicomweb_address=https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb"

ここで

  • PROJECT_ID は、DICOM ストアが含まれる Google Cloud プロジェクトの ID です。
  • LOCATION は、DICOM ストアが配置される場所です。
  • DATASET_ID は、DICOM ストアの親データセットの ID です。
  • DICOM_STORE_ID は、DICOM データのインポート先である DICOM ストアの ID です。

Service の構成

DICOM アダプタを GKE クラスタ外のアプリケーション(PACS など)からアクセスできるようにするには、内部ロードバランサを構成する必要があります。ロードバランサを使用すると、DIMSE ポート(このガイドでは、ポート 2575)を内部で公開できます。

サービス マニフェスト ファイルを作成して、内部負荷分散を構成します。Deployment マニフェスト ファイルを作成したディレクトリに、テキスト エディタを使用して、次の内容が含まれる dicom_adapter_load_balancer.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Service
metadata:
  name: dicom-adapter-load-balancer
  # The "Internal" annotation will result in an load balancer that can only
  # be accessed from within the VPC the Kubernetes cluster is in.
  # You can remove this annotation to get an externally accessible load balancer.
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
spec:
  ports:
  - port: 2575
    targetPort: 2575
    protocol: TCP
    name: port
  selector:
    app: dicom-adapter
  type: LoadBalancer

Deployment のデプロイ

アダプタを GKE クラスタにデプロイするには、dicom_adapter.yaml Deployment マニフェスト ファイルを含むディレクトリで、次のコマンドを実行します。

kubectl apply -f dicom_adapter.yaml

成功した場合、コマンドは次の出力を返します。

deployment.extensions "dicom-adapter-deployment" created

Deployment の検査

Deployment を作成したら、kubectl ツールを使用して検査できます。

Deployment の詳細情報を取得するには、次のコマンドを実行します。

kubectl describe deployment dicom-adapter

Deployment によって作成された Pod を一覧表示するには、次のコマンドを実行します。

kubectl get pods -l app=dicom-adapter

作成された Pod に関する情報を取得するには:

kubectl describe pod POD_NAME

Deployment が成功すると、前のコマンドの最後の部分に次の情報が含まれます。

Events:
  Type    Reason     Age    From                                                   Message
  ----    ------     ----   ----                                                   -------
  Normal  Scheduled  3m33s  default-scheduler                                      Successfully assigned default/dicom-adapter-69d579778-qrm7n to gke-dicom-adapter-default-pool-6f6e0dcd-9cdd
  Normal  Pulling    3m31s  kubelet, gke-dicom-adapter-default-pool-6f6e0dcd-9cdd  Pulling image "gcr.io/cloud-healthcare-containers/healthcare-api-dicom-dicomweb-adapter-import:0.2.1"
  Normal  Pulled     3m10s  kubelet, gke-dicom-adapter-default-pool-6f6e0dcd-9cdd  Successfully pulled image "gcr.io/cloud-healthcare-containers/healthcare-api-dicom-dicomweb-adapter-import:0.2.1"
  Normal  Created    3m7s   kubelet, gke-dicom-adapter-default-pool-6f6e0dcd-9cdd  Created container dicom-import-adapter
  Normal  Started    3m7s   kubelet, gke-dicom-adapter-default-pool-6f6e0dcd-9cdd  Started container dicom-import-adapter

サービスの Deployment と内部ロードバランサの作成

内部ロードバランサを作成するには、dicom_adapter_load_balancer.yaml Service マニフェスト ファイルを含むディレクトリで、次のコマンドを実行します。

kubectl apply -f dicom_adapter_load_balancer.yaml

成功した場合、コマンドは次の出力を返します。

deployment.extensions "dicom_adapter_load_balancer.yaml" created

Service の検査

Service を作成したら、Service が正常に構成されていることを確認します。

次のコマンドを実行して、内部ロードバランサを検査します。

kubectl describe service dicom-adapter-load-balancer

成功した場合、コマンドは次のような出力を返します。

Name:                     dicom-adapter-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              cloud.google.com/load-balancer-type: Internal
Selector:                 app=dicom-adapter
Type:                     LoadBalancer
IP:                       198.51.100.1
LoadBalancer Ingress:     203.0.113.1
Port:                     port  2575/TCP
TargetPort:               2575/TCP
NodePort:                 port  30440/TCP
Endpoints:                192.0.2.1:2575
Session Affinity:         None
External Traffic Policy:  Cluster
Events:

Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  1m    service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   1m    service-controller  Ensured load balancer

LoadBalancer Ingress の IP アドレスの入力には 1 分ほどかかることがあります。次のセクションで このアドレスと 2575 ポートを使用してクラスタの外部から Service にアクセスするため、LoadBalancer Ingress IP アドレスをコピーします。

Compute Engine 仮想マシンの作成

オンプレミスの PACS をシミュレートするには、DICOM アダプタにリクエストを送信するために使用する Compute Engine VM を作成します。内部ロードバランサをデプロイしたため、作成する VM と既存の GKE クラスタは、同じリージョンにあり、同じ VPC ネットワークを使用している必要があります。

次の手順は、Compute Engine で Linux 仮想マシン インスタンスを作成する方法を示しています。

Console

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。

  3. インスタンスに対して、クラスタを作成したときに選択したゾーンと一致するリージョンゾーンを選択します。たとえば、クラスタの作成時に COMPUTE_ZONE として us-central1-a を使用した場合、インスタンスの作成画面で、リージョンには us-central1 (Iowa) を、ゾーンには us-central1-a を選択します。

  4. [ブートディスク] セクションで [変更] をクリックし、ブートディスクの構成を開始します。

  5. [公開イメージ] タブで、Debian オペレーティング システムのバージョン9を選択します。

  6. [選択] をクリックします。

  7. [ファイアウォール] セクションで [HTTP トラフィックを許可する] を選択します。

  8. [作成] をクリックしてインスタンスを作成します。

gcloud

コンピューティング インスタンスを作成するには、次のオプションを使用して gcloud compute instances create メソッドを実行します。

  • クラスタの作成時に選択した COMPUTE_ZONE
  • HTTP トラフィックを許可する http-server タグ
gcloud compute instances create INSTANCE_NAME \
   --project=PROJECT_ID \
   --zone=COMPUTE_ZONE \
   --image-family=debian-9 \
   --image-project=debian-cloud \
   --tags=http-server

出力は次のサンプルのようになります。

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/instances/INSTANCE_NAME].
NAME          ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
INSTANCE_NAME  COMPUTE_ZONE           n1-standard-1               INTERNAL_IP  EXTERNAL_IP    RUNNING

インスタンスが起動するまで、しばらくお待ちください。インスタンスが起動すると、[VM インスタンス] ページに緑色のステータス アイコンが表示されます。

デフォルトでは、クラスタで使用するデフォルトの VPC ネットワークをインスタンスで使用します。これは、インスタンスからクラスタにトラフィックを送信できることを意味します。

インスタンスへの接続は、次の手順で行います。

Console

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. 仮想マシン インスタンスのリストで、作成したインスタンスの行にある [SSH] をクリックします。

gcloud

インスタンスに接続するには、gcloud compute ssh コマンドを実行します。

gcloud compute ssh INSTANCE_NAME \
    --project PROJECT_ID \
    --zone COMPUTE_ZONE

Linux インスタンスとのやり取りに使用するターミナル ウィンドウが用意されています。

DICOM 画像の DICOM ストアへのインポート

ネットワーク上で DICOM 画像を送信するために使用できるソフトウェア オプションは複数あります。以降のセクションでは、DCMTK DICOM ツールキットを使用します。

DICOM 画像を DICOM ストアにインポートするには、前のセクションで作成した VM から次の手順を行います。

  1. DCMTK DICOM ツールキット ソフトウェアをインストールします。

    sudo apt install dcmtk
    
  2. DICOM ストアにインポートする DICOM 画像を VM にアップロードします。たとえば、DICOM 画像が Cloud Storage バケットに保存されている場合、次のコマンドを実行して、現在の作業ディレクトリにダウンロードします。

    gsutil cp gs://BUCKET/DCM_FILE .
    

    gcs-public-data--healthcare-tcia-lidc-idri データセットから無料で入手できる DICOM 画像を Google Cloud で使用するには、次のコマンドを実行します。

    gsutil -u PROJECT_ID cp gs://gcs-public-data--healthcare-tcia-lidc-idri/dicom/1.3.6.1.4.1.14519.5.2.1.6279.6001.100036212881370097961774473021/1.3.6.1.4.1.14519.5.2.1.6279.6001.130765375502800983459674173881/1.3.6.1.4.1.14519.5.2.1.6279.6001.100395847981751414562031366859.dcm .
    
  3. DCMTK DICOM ツールキットから入手できる dcmsend コマンドを実行します。コマンドを実行する際は、アプリケーション エンティティ(AE)タイトルを IMPORTADAPTER に設定します。必要に応じて、--verbose フラグを追加して処理の詳細を表示します。リクエストを送信する前に、次のように置き換えます。

    • PEER: Service を検査したときに返された LoadBalancer Ingress IP アドレス。
    • PORT: 使用されるポートは 2575 です。
    • DCMFILE_IN: アップロードする DICOM 画像へのファイルシステム上のパス。
    dcmsend --verbose PEER 2575 DCM_FILE_IN -aec IMPORTADAPTER
    

    リクエストが成功すると、単一の DICOM 画像を使用して dcmsend を実行したときに、ターミナルに次の出力が表示されます。

    I: checking input files ...
    I: starting association #1
    I: initializing network ...
    I: negotiating network association ...
    I: Requesting Association
    I: Association Accepted (Max Send PDV: 16366)
    I: sending SOP instances ...
    I: Sending C-STORE Request (MsgID 1, MR)
    I: Received C-STORE Response (Success)
    I: Releasing Association
    I:
    I: Status Summary
    I: --------------
    I: Number of associations   : 1
    I: Number of pres. contexts : 1
    I: Number of SOP instances  : 1
    I: - sent to the peer       : 1
    I:   * with status SUCCESS  : 1
    
  4. DICOM 画像が DICOM ストアに正常にインポートされたことを確認するには、DICOM ストアでインスタンスを検索し、新しい DICOM 画像がストアにあることを確認します。

このセクションを完了すると、DICOM アダプタが GKE に正常にデプロイされ、アダプタを介して DICOM 画像が PACS インスタンスから Cloud Healthcare API に送信されます。

アダプタ障害のトラブルシューティング

GKE にデプロイした後、DICOM アダプタで障害が発生した場合は、デプロイされたワークロードに関する問題のトラブルシューティングの手順に従います。

インポート アダプタとエクスポート アダプタによって生成されるログは、問題の診断に使用できます。GKE を使用してアダプタを実行すると、ログが Cloud Logging に保存されます。ログを表示するには、Google Cloud Console または kubectl ツールを使用して、次の手順を行います。

Console

  1. Cloud Console で GKE の [ワークロード] ダッシュボードに移動します。

    GKE の [ワークロード] ダッシュボードに移動

  2. dicom-adapter ワークロードを選択します。

  3. [Deployment の詳細] ページで、[コンテナのログ] をクリックします。

kubectl

クラスタで実行しているすべての Pod を表示するには、次のコマンドを実行します。

kubectl get pods

名前が dicom-adapter で始まる Pod を探します。

Pod のログを取得するには、次のコマンドを実行します。

kubectl logs POD_NAME

次のステップ

このガイドのプロトタイプを構成すると、Cloud VPN を使用して PACS と Cloud Healthcare API の間のトラフィックを暗号化できるようになります。