Collegare un PACS all'API Cloud Healthcare

Questa pagina spiega come utilizzare l'adattatore DICOM dell'API Cloud Healthcare open source su Google Kubernetes Engine (GKE) per completare le seguenti attività:

  • Collega un sistema PACS (Picture Archiving and Communication System) all'API Cloud Healthcare.
  • Importa i dati DICOM dal PACS in un archivio DICOM nell'API Cloud Healthcare.

Questa guida fornisce un modo semplice per configurare un prototipo utilizzando Google Kubernetes Engine e una macchina virtuale (VM) Compute Engine. La VM Compute Engine simula il PACS on-premise. Per informazioni più dettagliate, consulta il file README dell'adattatore DICOM.

Panoramica dell'adattatore DICOM

L'adattatore è costituito da due componenti principali: l'adattatore di importazione e l'adattatore di esportazione. Questa guida mostra come utilizzare l'adattatore di importazione per archiviare immagini DICOM in un archivio DICOM.

Utilizza l'adattatore DICOM per convertire i dati tra protocolli tradizionali e protocolli RESTful. Ad esempio, puoi convertire il formato C-STORE nel formato STOW-RS.

Costi

Questa guida utilizza componenti fatturabili di Google Cloud, tra cui:

  • API Cloud Healthcare
  • Google Kubernetes Engine
  • Compute Engine

Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto. I nuovi utenti di Cloud Platform potrebbero avere diritto a una prova gratuita.

Prima di iniziare

  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. Attendi che l'API GKE e i relativi servizi siano abilitati. L'operazione può richiedere diversi minuti.
  9. Se non l'hai ancora fatto, crea un archivio DICOM.
  10. Scegliere una shell

    Per completare questa guida, utilizza Cloud Shell o la shell locale.

    Cloud Shell è un ambiente shell per la gestione delle risorse ospitate su Google Cloud. Cloud Shell viene fornito con i seguenti strumenti preinstallati, che utilizzi in questa guida:

    • gcloud CLI: fornisce l'interfaccia a riga di comando principale per Google Cloud
    • kubectl: fornisce l'interfaccia a riga di comando per l'esecuzione di comandi nei cluster GKE

    Per aprire Cloud Shell o configurare la shell locale, completa i seguenti passaggi:

    Cloud Shell

    1. Vai alla Google Cloud console.

      Google Cloud console

    2. Nell'angolo in alto a destra della console, fai clic sul pulsante Attiva Google Cloud Shell:

    All'interno di un frame nella parte inferiore della console si apre una sessione di Cloud Shell. Utilizza questa shell per eseguire i comandi gcloud e kubectl.

    Shell locale

    Se preferisci utilizzare la shell locale, devi installare gcloud CLI. Per istruzioni, vedi Installazione di Google Cloud CLI.

    Esegui il deployment dell'adattatore utilizzando Google Kubernetes Engine

    L'adattatore di importazione e l'adattatore di esportazione sono applicazioni containerizzate sottoposte a staging in un'immagine Docker predefinita in Container Registry. In questa guida, esegui il deployment dell'immagine dicom-import-adapter da eseguire su un cluster GKE.

    Concedi le autorizzazioni al account di servizio Compute Engine

    Segui le istruzioni riportate in Creazione e attivazione di service account per le istanze per concedere al service account predefinito di Compute Engine il ruolo roles/healthcare.dicomEditor. Per ulteriori informazioni, consulta Ruoli dell'archivio DICOM.

    Crea il cluster

    gcloud

    Per creare un cluster in GKE denominato dicom-adapter, esegui il comando gcloud container clusters create.

    Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

    • COMPUTE_ZONE: la zona in cui è stato eseguito il deployment del cluster. Una zona è una località regionale approssimativa in cui vengono implementati i cluster e le relative risorse. Ad esempio, us-west1-a è una zona nella regione us-west. Se hai impostato una zona predefinita utilizzando il comando gcloud config set compute/zone, il valore del flag nel comando precedente sostituisce il valore predefinito.

    Esegui questo comando:

    Linux, macOS o 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

    Dovresti ricevere una risposta simile alla seguente:

    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
    

    Configura il deployment

    Quando esegui il deployment di un'applicazione in GKE, definisci le proprietà del deployment utilizzando un file manifest del deployment, che in genere è un file YAML. Per informazioni sui file manifest di deployment, vedi Creazione di deployment.

    Con un editor di testo, crea un file manifest di deployment per l'adattatore di importazione denominato dicom_adapter.yaml con i seguenti contenuti:

    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"

    Sostituisci quanto segue:

    • PROJECT_ID: ID progetto
    • LOCATION: posizione del set di dati
    • DATASET_ID: ID del set di dati principale dell'archivio DICOM
    • DICOM_STORE_ID: ID dell'archivio DICOM in cui stai importando i dati DICOM

    Configura il servizio

    Per rendere l'adattatore DICOM accessibile alle applicazioni al di fuori del cluster GKE (ad esempio un PACS), devi configurare un bilanciatore del carico interno. Il bilanciatore del carico ti consente di esporre internamente la porta DIMSE (in questa guida, la porta 2575).

    Crea un file manifest Service per configurare il bilanciamento del carico. Nella directory in cui hai creato il file manifest di deployment, utilizza un editor di testo per creare un file denominato dicom_adapter_load_balancer.yaml con il seguente contenuto. Crea ed esegui il deployment del file manifest del servizio in Deployment del servizio e del bilanciatore del carico interno.

    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
    

    Esegui il deployment

    Per eseguire il deployment dell'adattatore in un cluster GKE, esegui questo comando nella directory contenente il file manifest di deployment dicom_adapter.yaml:

    kubectl apply -f dicom_adapter.yaml
    

    L'output è il seguente:

    deployment.apps/dicom-adapter created
    

    Ispeziona il deployment

    Dopo aver creato il deployment, utilizza lo strumento kubectl per esaminarlo.

    Per ottenere informazioni dettagliate sul deployment, esegui questo comando:

    kubectl describe deployment dicom-adapter
    

    Per visualizzare il pod creato dal deployment, esegui questo comando:

    kubectl get pods -l app=dicom-adapter
    

    Per ottenere informazioni sul pod creato, esegui questo comando utilizzando il nome del pod restituito dal comando precedente:

    kubectl describe pod POD_NAME

    Se il deployment è andato a buon fine, l'ultima parte dell'output del comando precedente contiene le seguenti informazioni. L'adattatore è pronto a gestire le richieste quando il contenitore dicom-import-adapter ha il valore Started nella colonna 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
    

    Esegui il deployment del servizio e del bilanciatore del carico interno

    Per creare il bilanciatore del carico interno, nella directory contenente il file manifest del servizio dicom_adapter_load_balancer.yaml, esegui questo comando:

    kubectl apply -f dicom_adapter_load_balancer.yaml
    

    L'output è il seguente:

    service/dicom-adapter-load-balancer created
    

    Ispezionare il servizio

    Dopo aver creato il servizio, esaminalo per verificare che sia stato configurato correttamente.

    Per ispezionare il bilanciatore del carico, esegui questo comando:

    kubectl describe service dicom-adapter-load-balancer
    

    L'output è il seguente:

    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
    

    Il caricamento dell'indirizzo IP LoadBalancer Ingress potrebbe richiedere fino a un minuto. Salva l'indirizzo IP LoadBalancer Ingress. Lo utilizzerai per accedere al servizio dall'esterno del cluster nella sezione successiva.

    Crea una macchina virtuale Compute Engine

    Per simulare il tuo PACS on-premise, crea una VM di Compute Engine per inviare richieste all'adattatore DICOM. Poiché hai deployato un bilanciatore del carico interno, la VM che crei e il cluster GKE esistente devono trovarsi nella stessa regione e utilizzare la stessa rete VPC.

    Completa i seguenti passaggi per creare un'istanza di macchina virtuale Linux in Compute Engine:

    Console

    1. Nella console Google Cloud , vai alla pagina Istanze VM.

      Vai a Istanze VM

    2. Fai clic su Crea istanza.

    3. Scegli una regione e una zona per l'istanza che corrisponda alla zona che hai selezionato quando hai creato il cluster. Ad esempio, se hai utilizzato us-central1-a per COMPUTE_ZONE quando hai creato il cluster, seleziona us-central1 (Iowa) per la regione e us-central1-a per la zona.

    4. Nella sezione Disco di avvio, fai clic su Cambia per configurare il disco di avvio.

    5. Nella scheda Immagini pubbliche, scegli la versione 9 del sistema operativo Debian.

    6. Fai clic su Seleziona.

    7. Nella sezione Firewall, seleziona Consenti traffico HTTP.

    8. Fai clic sul pulsante Crea per creare l'istanza.

    gcloud

    Esegui il comando gcloud compute instances create. Il comando utilizza il tag http-server per consentire il traffico HTTP.

    Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

    • PROJECT_ID: l'ID del tuo Google Cloud progetto
    • COMPUTE_ZONE: la zona che hai selezionato quando hai creato il cluster
    • INSTANCE_NAME: il nome della VM

    Esegui questo comando:

    Linux, macOS o 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

    Dovresti ricevere una risposta simile alla seguente:

    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
    

    Potrebbe essere necessario un po' di tempo per l'avvio dell'istanza. Dopo l'avvio dell'istanza, viene elencata nella pagina Istanze VM con un'icona di stato verde.

    Connettiti alla VM

    Per connetterti alla VM, completa i seguenti passaggi:

    Console

    1. Nella console Google Cloud , vai alla pagina Istanze VM.

      Vai a Istanze VM

    2. Nell'elenco delle istanze della macchina virtuale, fai clic su SSH nella riga dell'istanza che hai creato.

    gcloud

    Esegui il comando gcloud compute ssh.

    Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

    • PROJECT_ID: l'ID del tuo Google Cloud progetto
    • COMPUTE_ZONE: la zona della VM
    • INSTANCE_NAME: il nome della VM

    Esegui questo comando:

    Linux, macOS o 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

    Ora hai una finestra del terminale per interagire con l'istanza Linux.

    Importare immagini DICOM nell'archivio DICOM

    Esistono diverse opzioni software che puoi utilizzare per inviare immagini DICOM su una rete. Nelle sezioni seguenti utilizzerai il toolkit DCMTK DICOM.

    Per importare immagini DICOM nell'archivio DICOM, completa i seguenti passaggi dalla VM che hai creato nella sezione precedente:

    1. Installa il software del toolkit DICOM DCMTK:

      sudo apt-get install -y dcmtk
      
    2. Salva l'immagine DICOM nella VM. Ad esempio, se l'immagine DICOM è archiviata in un bucket Cloud Storage, esegui questo comando per scaricarla nella directory di lavoro corrente:

      gcloud storage cp gs://BUCKET/DCM_FILE .

      Per utilizzare un'immagine DICOM resa disponibile gratuitamente da Google Cloud dal set di dati gcs-public-data--healthcare-tcia-lidc-idri, esegui il seguente comando:

      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. Esegui il comando dcmsend, disponibile tramite il toolkit DICOM DCMTK. Quando esegui il comando, imposta il titolo dell'entità applicazione (AE) su IMPORTADAPTER. Se vuoi, puoi aggiungere il flag --verbose per mostrare i dettagli del trattamento. La porta utilizzata in questa guida è la 2575.

      dcmsend --verbose PEER 2575 DCM_FILE_IN -aec IMPORTADAPTER

      Sostituisci quanto segue:

      • PEER: LoadBalancer Ingress indirizzo IP restituito quando hai ispezionato il servizio
      • DCMFILE_IN: il percorso dell'immagine DICOM sulla VM

      Quando esegui dcmsend con una singola immagine DICOM, l'output è il seguente:

      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. Per verificare che l'immagine DICOM sia stata importata correttamente nell'archivio DICOM, cerca le istanze nell'archivio DICOM e assicurati che la nuova immagine DICOM sia presente nell'archivio.

    Dopo aver completato questa sezione, hai eseguito correttamente il deployment dell'adattatore DICOM in GKE e inviato un'immagine DICOM da un'istanza PACS tramite l'adattatore all'API Cloud Healthcare.

    Risoluzione dei problemi

    Risoluzione dei problemi di GKE

    Se l'adattatore DICOM rileva un errore dopo il deployment in GKE, segui i passaggi descritti in Risoluzione dei problemi relativi ai carichi di lavoro di cui è stato eseguito il deployment.

    Risoluzione dei problemi relativi all'adattatore

    Gli adattatori di importazione ed esportazione generano log che puoi utilizzare per diagnosticare eventuali problemi. Quando esegui un adattatore utilizzando GKE, i log vengono archiviati in Cloud Logging. Per visualizzare i log, completa i seguenti passaggi utilizzando la console Google Cloud o lo strumento kubectl:

    Console

    1. Vai alla dashboard dei carichi di lavoro GKE nella console Google Cloud .

      Vai a Carichi di lavoro GKE

    2. Seleziona il workload dicom-adapter.

    3. Nella pagina Dettagli deployment, fai clic su Log container.

    kubectl

    Per visualizzare tutti i pod in esecuzione nel cluster, esegui questo comando:

    kubectl get pods
    

    Cerca il pod il cui nome inizia con dicom-adapter.

    Per ottenere i log del pod, esegui questo comando:

    kubectl logs POD_NAME

    Se hai saltato uno dei passaggi di questa guida, il comando dcmsend potrebbe non riuscire a caricare le immagini. Per esaminare il problema, esegui nuovamente il comando con il flag -d (per "debug"). Il flag stampa un log più dettagliato delle azioni, inclusi i messaggi che forniscono informazioni sull'errore.

    Risoluzione dei problemi relativi ad autorizzazioni e permessi

    Le seguenti sezioni descrivono gli errori che possono verificarsi in dcmsend quando le autorizzazioni o le autorizzazioni sono configurate in modo errato.

    Errore di interruzione dell'associazione peer

    Il seguente problema si verifica quando il traffico di rete non può fluire dal PACS alla porta 2575 del bilanciatore del carico:

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

    Per risolvere il problema, assicurati che la VM PACS e il cluster GKE vengano eseguiti nella stessa rete VPC. Se non vengono eseguiti nella stessa rete VPC, controlla quanto segue:

    • Il bilanciatore del carico non è configurato come "interno".
    • Non esistono regole firewall che bloccano le connessioni alla porta 2575.

    Questo errore può verificarsi anche quando il servizio di bilanciamento del carico o il pod dell'adattatore non sono configurati correttamente nel cluster GKE. Per assicurarti che siano configurati correttamente, consulta le sezioni Ispezione del deployment e Ispezione del servizio in questa guida.

    Errore API richieste non abilitate

    Si verifica il seguente problema quando l'API Cloud Healthcare non è stata abilitata nel progetto in cui è in esecuzione il cluster GKE con l'adattatore:

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

    Per risolvere il problema, assicurati che tutte le API necessarie siano abilitate seguendo le istruzioni in Prima di iniziare.

    Errore di ambito insufficiente

    Il seguente problema si verifica quando il cluster GKE in cui è in esecuzione l'adattatore non ha impostato il valore di ambito corretto:

    LO [Http_403, PERMISSION_DENIED, Request had insufficient authentica]
    

    Per risolvere il problema, aggiorna il cluster GKE o creane uno nuovo con il seguente flag:

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

    Errore di autorizzazione negata per l'archivio DICOM

    Si verifica il seguente errore quando il account di servizio utilizzato dal cluster GKE in cui è in esecuzione l'adattatore non dispone del ruolo roles/healthcare.dicomEditor:

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

    Per risolvere il problema, segui le istruzioni riportate in Concessione delle autorizzazioni dell'account di servizio Compute Engine.

    Passaggi successivi

    Dopo aver configurato il prototipo in questa guida, puoi iniziare a utilizzare Cloud VPN per criptare il traffico tra il tuo PACS e l'API Cloud Healthcare.