Menghubungkan PACS ke Cloud Healthcare API

Halaman ini menjelaskan cara menggunakan adaptor DICOM Cloud Healthcare API open source di Google Kubernetes Engine (GKE) untuk menyelesaikan tugas berikut:

  • Menghubungkan Sistem Pengarsipan dan Komunikasi Gambar (PACS) ke Cloud Healthcare API.
  • Mengimpor data DICOM dari PACS ke penyimpanan DICOM di Cloud Healthcare API.

Panduan ini memberikan cara sederhana untuk menyiapkan prototipe menggunakan Google Kubernetes Engine dan mesin virtual (VM) Compute Engine. VM Compute Engine mensimulasikan PACS lokal. Untuk mengetahui informasi selengkapnya, lihat README adaptor DICOM.

Ringkasan adaptor DICOM

Adaptor terdiri dari dua komponen utama: adaptor impor dan adaptor ekspor. Panduan ini menunjukkan cara menggunakan adaptor impor untuk menyimpan gambar DICOM di penyimpanan DICOM.

Gunakan adaptor DICOM untuk menerjemahkan data antara protokol tradisional dan protokol RESTful. Misalnya, Anda dapat menerjemahkan dari format C-STORE ke format STOW-RS.

Biaya

Panduan ini menggunakan komponen Google Cloudyang dapat ditagih, termasuk:

  • Cloud Healthcare API
  • Google Kubernetes Engine
  • Compute Engine

Gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan. Pengguna baru Cloud Platform mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Healthcare API, Google Kubernetes Engine, and Container Registry APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Healthcare API, Google Kubernetes Engine, and Container Registry APIs.

    Enable the APIs

  8. Tunggu hingga GKE API dan layanan terkait diaktifkan. Proses ini dapat memerlukan waktu beberapa menit.
  9. Buat penyimpanan DICOM jika Anda belum melakukannya.
  10. Memilih shell

    Untuk menyelesaikan panduan ini, gunakan Cloud Shell atau shell lokal Anda.

    Cloud Shell adalah lingkungan shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal sebelumnya dengan alat berikut, yang akan Anda gunakan dalam panduan ini:

    • gcloud CLI: menyediakan antarmuka command line utama untuk Google Cloud
    • kubectl: menyediakan antarmuka command line untuk menjalankan perintah terhadap cluster GKE

    Untuk membuka Cloud Shell atau mengonfigurasi shell lokal, selesaikan langkah-langkah berikut:

    Cloud Shell

    1. Buka Google Cloud console.

      Google Cloud console

    2. Dari pojok kanan atas konsol, klik tombol Activate Google Cloud Shell:

    Sesi Cloud Shell akan terbuka di dalam frame di bagian bawah konsol. Anda menggunakan shell ini untuk menjalankan perintah gcloud dan kubectl.

    Shell lokal

    Jika lebih suka menggunakan shell lokal, Anda harus menginstal gcloud CLI. Lihat bagian Menginstal Google Cloud CLI untuk mengetahui petunjuknya.

    Men-deploy adapter menggunakan Google Kubernetes Engine

    Adaptor impor dan adaptor ekspor adalah aplikasi dalam container yang dipersiapkan dalam image Docker yang telah dibuat sebelumnya di Container Registry. Dalam panduan ini, Anda akan men-deploy image dicom-import-adapter untuk dijalankan di cluster GKE.

    Memberikan izin akun layanan Compute Engine

    Ikuti petunjuk di Membuat dan mengaktifkan akun layanan untuk instance guna memberikan peran roles/healthcare.dicomEditor kepada akun layanan default Compute Engine. Untuk mengetahui informasi selengkapnya, lihat Peran penyimpanan DICOM.

    Membuat cluster

    gcloud

    Untuk membuat cluster di GKE bernama dicom-adapter, jalankan perintah gcloud container clusters create.

    Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

    • COMPUTE_ZONE: zona tempat cluster Anda di-deploy. Zona adalah perkiraan lokasi regional tempat cluster Anda dan resource-nya di-deploy. Misalnya, us-west1-a adalah zona di region us-west. Jika Anda telah menetapkan zona default menggunakan perintah gcloud config set compute/zone, nilai flag dalam perintah sebelumnya akan menggantikan nilai default.

    Jalankan perintah berikut:

    Linux, macOS, atau Cloud Shell

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

    Windows (PowerShell)

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

    Windows (cmd.exe)

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

    Anda akan melihat respons seperti berikut:

    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.18.16-gke.502   123.456.789.012  n1-standard-1  1.18.16-gke.502  3     RUNNING
    

    Mengonfigurasi Deployment

    Saat men-deploy aplikasi ke GKE, Anda menentukan properti Deployment menggunakan file manifes Deployment, yang biasanya berupa file YAML. Untuk mengetahui informasi tentang file manifes Deployment, lihat Membuat Deployment.

    Dengan menggunakan editor teks, buat file manifes Deployment untuk adaptor impor yang disebut dicom_adapter.yaml dengan konten berikut:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dicom-adapter
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dicom-adapter
      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.43
              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"

    Ganti kode berikut:

    • PROJECT_ID: project ID
    • LOCATION: lokasi set data
    • DATASET_ID: ID untuk set data induk penyimpanan DICOM Anda
    • DICOM_STORE_ID: ID untuk penyimpanan DICOM tempat Anda mengimpor data DICOM

    Mengonfigurasi Layanan

    Agar adaptor DICOM dapat diakses oleh aplikasi di luar cluster GKE (seperti PACS), Anda harus mengonfigurasi load balancer internal. Load balancer memungkinkan Anda mengekspos port DIMSE secara internal (dalam panduan ini, port 2575).

    Buat file manifes Service untuk mengonfigurasi load balancing. Di direktori tempat Anda membuat file manifes Deployment, gunakan editor teks untuk membuat file bernama dicom_adapter_load_balancer.yaml dengan konten berikut. Anda membuat dan men-deploy file manifes Service di Men-deploy Service dan load balancer internal.

    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
    

    Men-deploy Deployment

    Untuk men-deploy adapter ke cluster GKE, jalankan perintah berikut di direktori yang berisi file manifes Deployment dicom_adapter.yaml:

    kubectl apply -f dicom_adapter.yaml
    

    Outputnya adalah sebagai berikut:

    deployment.apps/dicom-adapter created
    

    Memeriksa Deployment

    Setelah membuat Deployment, gunakan alat kubectl untuk memeriksanya.

    Untuk mendapatkan informasi mendetail tentang Deployment, jalankan perintah berikut:

    kubectl describe deployment dicom-adapter
    

    Untuk melihat Pod yang dibuat oleh Deployment, jalankan perintah berikut:

    kubectl get pods -l app=dicom-adapter
    

    Untuk mendapatkan informasi tentang Pod yang dibuat, jalankan perintah berikut menggunakan nama Pod yang ditampilkan dari perintah sebelumnya:

    kubectl describe pod POD_NAME

    Jika Deployment berhasil, bagian terakhir output dari perintah sebelumnya berisi informasi berikut. Adaptor siap melayani permintaan saat penampung dicom-import-adapter memiliki nilai Started di kolom Reason.

    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.43"
      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.43"
      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
    

    Men-deploy Service dan load balancer internal

    Untuk membuat load balancer internal, di direktori yang berisi file manifes Service dicom_adapter_load_balancer.yaml, jalankan perintah berikut:

    kubectl apply -f dicom_adapter_load_balancer.yaml
    

    Outputnya adalah sebagai berikut:

    service/dicom-adapter-load-balancer created
    

    Periksa Layanan

    Setelah membuat Layanan, periksa untuk memverifikasi bahwa Layanan telah dikonfigurasi dengan benar.

    Untuk memeriksa load balancer, jalankan perintah berikut:

    kubectl describe service dicom-adapter-load-balancer
    

    Outputnya adalah sebagai berikut:

    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
    

    Alamat IP LoadBalancer Ingress mungkin memerlukan waktu hingga satu menit untuk diisi. Simpan alamat IP LoadBalancer Ingress. Anda akan menggunakannya untuk mengakses Service dari luar cluster di bagian berikutnya.

    Membuat virtual machine Compute Engine

    Untuk menyimulasikan PACS lokal, buat VM Compute Engine untuk mengirim permintaan ke adaptor DICOM. Karena Anda men-deploy load balancer internal, VM yang Anda buat dan cluster GKE yang ada harus berada di region yang sama dan menggunakan jaringan VPC yang sama.

    Selesaikan langkah-langkah berikut untuk membuat instance virtual machine Linux di Compute Engine:

    Konsol

    1. Di Google Cloud konsol, buka halaman VM Instances.

      Buka Instance VM

    2. Klik Create instance.

    3. Pilih Region dan Zone untuk instance yang cocok dengan zona yang Anda pilih saat membuat cluster. Misalnya, jika Anda menggunakan us-central1-a untuk COMPUTE_ZONE saat membuat cluster, pilih us-central1 (Iowa) untuk Region dan us-central1-a untuk Zone.

    4. Di bagian Boot disk, klik Change untuk mengonfigurasi boot disk Anda.

    5. Di tab Public images, pilih sistem operasi Debian versi 9.

    6. Klik Pilih.

    7. Di bagian Firewall, pilih Izinkan traffic HTTP.

    8. Klik Buat untuk membuat instance.

    gcloud

    Jalankan perintah gcloud compute instances create. Perintah ini menggunakan tag http-server untuk mengizinkan traffic HTTP.

    Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

    • PROJECT_ID: ID Google Cloud project Anda
    • COMPUTE_ZONE: zona yang Anda pilih saat membuat cluster
    • INSTANCE_NAME: nama VM

    Jalankan perintah berikut:

    Linux, macOS, atau Cloud Shell

    gcloud compute instances create INSTANCE_NAME \
      --project=PROJECT_ID \
      --zone=COMPUTE_ZONE \
      --image-family=debian-9 \
      --image-project=debian-cloud \
      --tags=http-server

    Windows (PowerShell)

    gcloud compute instances create INSTANCE_NAME `
      --project=PROJECT_ID `
      --zone=COMPUTE_ZONE `
      --image-family=debian-9 `
      --image-project=debian-cloud `
      --tags=http-server

    Windows (cmd.exe)

    gcloud compute instances create INSTANCE_NAME ^
      --project=PROJECT_ID ^
      --zone=COMPUTE_ZONE ^
      --image-family=debian-9 ^
      --image-project=debian-cloud ^
      --tags=http-server

    Anda akan melihat respons seperti berikut:

    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
    

    Tunggu hingga instance memulai. Setelah instance dimulai, instance akan tercantum di halaman VM Instances dengan ikon status hijau.

    Terhubung ke VM

    Untuk terhubung ke VM, selesaikan langkah-langkah berikut:

    Konsol

    1. Di Google Cloud konsol, buka halaman VM Instances.

      Buka Instance VM

    2. Di daftar instance virtual machine, klik SSH di baris instance yang Anda buat.

    gcloud

    Jalankan perintah gcloud compute ssh.

    Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

    • PROJECT_ID: ID Google Cloud project Anda
    • COMPUTE_ZONE: zona VM
    • INSTANCE_NAME: nama VM

    Jalankan perintah berikut:

    Linux, macOS, atau Cloud Shell

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

    Windows (PowerShell)

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

    Windows (cmd.exe)

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

    Sekarang Anda memiliki jendela terminal untuk berinteraksi dengan instance Linux.

    Mengimpor gambar DICOM ke penyimpanan DICOM

    Ada beberapa opsi software yang tersedia yang dapat Anda gunakan untuk mengirim gambar DICOM melalui jaringan. Di bagian berikut, Anda akan menggunakan toolkit DICOM DCMTK.

    Untuk mengimpor gambar DICOM ke penyimpanan DICOM, selesaikan langkah-langkah berikut dari VM yang Anda buat di bagian sebelumnya:

    1. Instal software toolkit DICOM DCMTK:

      sudo apt-get install -y dcmtk
      
    2. Simpan gambar DICOM ke VM. Misalnya, jika gambar DICOM disimpan di bucket Cloud Storage, jalankan perintah berikut untuk mendownloadnya ke direktori kerja saat ini:

      gcloud storage cp gs://BUCKET/DCM_FILE .

      Untuk menggunakan gambar DICOM yang disediakan secara bebas oleh Google Cloud dari set data gcs-public-data--healthcare-tcia-lidc-idri, jalankan perintah berikut:

      gcloud storage 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 . --billing-project=PROJECT_ID
    3. Jalankan perintah dcmsend, yang tersedia melalui toolkit DICOM DCMTK. Saat Anda menjalankan perintah, tetapkan Judul Entitas Aplikasi (AE) ke IMPORTADAPTER. Anda dapat menambahkan tanda --verbose secara opsional untuk menampilkan detail pemrosesan. Port yang digunakan dalam panduan ini adalah 2575.

      dcmsend --verbose PEER 2575 DCM_FILE_IN -aec IMPORTADAPTER

      Ganti kode berikut:

      • PEER: Alamat IP LoadBalancer Ingress yang ditampilkan saat Anda memeriksa Service
      • DCMFILE_IN: jalur ke gambar DICOM di VM

      Saat menjalankan dcmsend dengan satu gambar DICOM, outputnya adalah sebagai berikut:

      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. Untuk memverifikasi bahwa gambar DICOM berhasil diimpor ke penyimpanan DICOM Anda. Cari instance di penyimpanan DICOM dan pastikan gambar DICOM baru ada di penyimpanan.

    Setelah menyelesaikan bagian ini, Anda telah berhasil men-deploy adaptor DICOM ke GKE dan mengirim gambar DICOM dari instance PACS melalui adaptor ke Cloud Healthcare API.

    Memecahkan masalah

    Pemecahan masalah GKE

    Jika adaptor DICOM mengalami kegagalan setelah Anda men-deploy-nya ke GKE, ikuti langkah-langkah di Memecahkan masalah pada workload yang di-deploy.

    Pemecahan masalah adaptor

    Adaptor impor dan ekspor menghasilkan log yang dapat Anda gunakan untuk mendiagnosis masalah apa pun. Saat Anda menjalankan adaptor menggunakan GKE, log disimpan di Cloud Logging. Untuk melihat log, selesaikan langkah-langkah berikut menggunakan konsol Google Cloud atau alat kubectl:

    Konsol

    1. Buka dasbor GKE Workloads di Google Cloud console.

      Buka Beban Kerja GKE

    2. Pilih beban kerja dicom-adapter.

    3. Di halaman Deployment details, klik Container logs.

    kubectl

    Untuk melihat semua Pod yang berjalan di cluster Anda, jalankan perintah berikut:

    kubectl get pods
    

    Cari Pod yang namanya diawali dengan dicom-adapter.

    Untuk mendapatkan log Pod, jalankan perintah berikut:

    kubectl logs POD_NAME

    Jika Anda melewatkan salah satu langkah dalam panduan ini, perintah dcmsend mungkin gagal mengupload gambar. Untuk menyelidiki masalah ini, jalankan ulang perintah dengan tanda -d (untuk "debug"). Flag ini mencetak log tindakan yang lebih verbose, termasuk pesan yang memberikan informasi tentang kegagalan.

    Pemecahan masalah izin dan otorisasi

    Bagian berikut menjelaskan error yang dapat terjadi di dcmsend jika izin atau otorisasi dikonfigurasi secara tidak benar.

    Error asosiasi dibatalkan oleh peer

    Masalah berikut terjadi saat traffic jaringan tidak dapat mengalir dari PACS ke port 2575 load balancer:

    cannot send SOP instance: Peer aborted Association (or never connected)
    

    Untuk mengatasi masalah ini, pastikan VM PACS dan cluster GKE berjalan di jaringan VPC yang sama. Jika tidak berjalan di jaringan VPC yang sama, periksa hal berikut:

    • Load balancer tidak dikonfigurasi sebagai "internal".
    • Tidak ada aturan firewall yang memblokir koneksi ke port 2575.

    Error ini juga dapat terjadi saat layanan load balancer atau Pod adapter tidak disiapkan dengan benar di cluster GKE. Untuk memastikan penyiapannya sudah benar, tinjau Memeriksa Deployment dan Memeriksa Layanan dalam panduan ini.

    Error API yang diperlukan tidak diaktifkan

    Masalah berikut terjadi jika Cloud Healthcare API belum diaktifkan di project tempat cluster GKE dengan adaptor berjalan:

    LO [Http_403, PERMISSION_DENIED, Cloud Healthcare API has not been u]
    

    Untuk mengatasi masalah ini, pastikan semua API yang diperlukan diaktifkan dengan mengikuti petunjuk di bagian Sebelum memulai.

    Error cakupan tidak memadai

    Masalah berikut terjadi saat cluster GKE tempat adapter berjalan tidak memiliki nilai cakupan yang benar:

    LO [Http_403, PERMISSION_DENIED, Request had insufficient authentica]
    

    Untuk mengatasi masalah ini, perbarui cluster GKE atau buat cluster baru dengan tanda berikut:

    --scopes=https://www.googleapis.com/auth/cloud-healthcare
    

    Error izin ditolak penyimpanan DICOM

    Error berikut terjadi saat akun layanan yang digunakan oleh cluster GKE tempat adapter berjalan tidak memiliki peran roles/healthcare.dicomEditor:

    LO [Http_403, PERMISSION_DENIED, Permission healthcare.dicomStores.d]
    

    Untuk mengatasi masalah ini, ikuti petunjuk di Memberikan izin akun layanan Compute Engine.

    Langkah berikutnya

    Setelah mengonfigurasi prototipe dalam panduan ini, Anda dapat mulai menggunakan Cloud VPN untuk mengenkripsi traffic antara PACS Anda dan Cloud Healthcare API.