Tutorial ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang Linux. Pemahaman dasar tentang Google Cloud dan Spesifikasi FHIR serta penggunaannya dalam sistem catatan kesehatan elektronik (EHR) juga akan berguna. Jalankan semua perintah dalam tutorial ini di Cloud Shell.
Tujuan
- Membuat set data Cloud Healthcare API dan penyimpanan FHIR.
- Mengimpor data FHIR ke penyimpanan FHIR Cloud Healthcare API.
- Menggunakan operasi de-identifikasi FHIR pada Cloud Healthcare API untuk menghapus atau memodifikasi PII dan PHI dalam instance FHIR di penyimpanan FHIR.
- Menggunakan alat command line
curluntuk melakukan panggilan de-identifikasi FHIR melalui Cloud Healthcare API.
Biaya
Tutorial ini menggunakan komponen Google Cloudyang dapat ditagih berikut:Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.
Sebelum memulai
Semua penggunaan Cloud Healthcare API terjadi dalam konteks projectGoogle Cloud . Project menjadi dasar untuk membuat, mengaktifkan, dan menggunakan semua layananGoogle Cloud , termasuk mengelola API, mengaktifkan penagihan, menambahkan dan menghapus kolaborator, serta mengelola izin untuk resource Google Cloud. Gunakan prosedur berikut untuk membuat project Google Cloud , atau pilih project yang telah Anda buat.-
In the Google Cloud console, go to the project selector page.
-
Select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Healthcare API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- Di Cloud Shell, jalankan perintah
gcloud components updateuntuk memastikan Anda menggunakan gcloud CLI versi terbaru yang menyertakan fungsionalitas terkait Cloud Healthcare API.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.
Membuat akun layanan IAM
Peran Healthcare Dataset Administrator, FHIR Administrator, dan FHIR Resource Editor diperlukan untuk tutorial ini. Gunakan langkah-langkah berikut untuk membuat akun layanan dan menetapkan peran yang benar:
- Membuat akun layanan:
Menetapkan peran ke akun layanan:
- Healthcare Dataset Administrator
- Healthcare FHIR Administrator
- Healthcare FHIR Resource Editor
Mengaktifkan kunci akun layanan:
gcloud auth activate-service-account --key-file=path-to-key-file
Outputnya adalah sebagai berikut:
Activated service account credentials for: [key-name@project-name.iam.gserviceaccount.com]
key-nameadalah nama yang Anda tetapkan ke kunci akun layanan.project-nameadalah nama project Google Cloud Anda.
Mendapatkan token akses OAuth 2.0
Agar dapat menggunakan Cloud Healthcare API untuk menyerap data, Anda memerlukan token akses OAuth 2.0 yang diperoleh perintah dalam tutorial ini untuk Anda. Dalam tutorial ini, beberapa contoh permintaan Cloud Healthcare API menggunakan alat command line curl. Contoh ini menggunakan perintah gcloud auth print-access-token untuk mendapatkan token pemilik OAuth 2.0 dan mencantumkan token tersebut di header otorisasi permintaan. Untuk mengetahui informasi selengkapnya tentang perintah ini, lihat gcloud auth application-default print-access-token.
Menyiapkan set data FHIR untuk de-identifikasi
Setiap resource FHIR adalah objek mirip JSON yang berisi key-value pair. Sebagian elemen sudah terstandardisasi dan sebagian lainnya merupakan teks bebas. Anda dapat menggunakan operasi de-identifikasi untuk keperluan berikut:
- Menghapus nilai untuk kunci tertentu dalam resource FHIR.
- Memproses teks tidak terstruktur untuk menghapus elemen PII saja, dan membiarkan konten selebihnya apa adanya.
Saat mende-identifikasi set data, set data tujuan tidak boleh ada sebelum Anda melakukan panggilan API de-identifikasi. Operasi de-identifikasi akan menciptakan set data tujuan tersebut.
Saat Anda mende-identifikasi satu penyimpanan FHIR, set data tujuan harus ada sebelum Anda melakukan panggilan API de-identifikasi.
Set data sumber, penyimpanan FHIR, dan penyimpanan FHIR untuk set data tujuan harus berada di project Google Cloud yang sama. Saat Anda menjalankan operasi de-identifikasi, set data tujuan dan penyimpanan FHIR akan dibuat di project Google Cloud yang sama dengan set data sumber dan penyimpanan FHIR.
Jika ingin menghasilkan data FHIR sintetis yang akan digunakan untuk tutorial ini, Anda dapat menggunakan Synthea untuk menghasilkan data sintetis dalam format FHIR STU3, menyalin data yang dihasilkan tersebut ke bucket Cloud Storage, lalu mengimpornya ke dalam penyimpanan FHIR Cloud Healthcare API. Synthea tidak menghasilkan data FHIR dengan komponen teks bebas atau tidak terstruktur, sehingga Anda tidak dapat menggunakannya untuk mengeksplorasi aspek de-identifikasi ini.
Untuk tutorial ini, Anda akan mengimpor sampel data FHIR ke penyimpanan FHIR seperti yang ditunjukkan dalam prosedur berikut.
Siapkan variabel lingkungan untuk project dan lokasi tempat set data, penyimpanan FHIR, dan data FHIR akan disimpan. Nilai yang ditetapkan ke variabel lingkungan merupakan nilai sampel, sebagai berikut:
export PROJECT_ID=MyProj export REGION=us-central1 export SOURCE_DATASET_ID=dataset1 export FHIR_STORE_ID=FHIRstore1 export DESTINATION_DATASET_ID=deid-dataset1Definisi variabel lingkungan yang dideklarasikan dalam contoh di atas adalah sebagai berikut:
$PROJECT_IDadalah ID project Google Cloud Anda.$REGIONadalah region Google Cloud tempat set data Cloud Healthcare API dibuat.$SOURCE_DATASET_IDadalah nama set data Cloud Healthcare API tempat data sumber disimpan.$FHIR_STORE_IDadalah nama penyimpanan FHIR sumber Cloud Healthcare API.$DESTINATION_DATASET_IDadalah nama set data tujuan Cloud Healthcare API tempat data yang dide-identifikasi ditulis.
Anda juga akan menggunakan variabel lingkungan tersebut nanti dalam tutorial ini.
Buat set data Cloud Healthcare API:
gcloud healthcare datasets create $SOURCE_DATASET_ID --location=$REGIONOutputnya terlihat seperti berikut, dengan
[OPERATION_NUMBER]adalah ID operasi pembuatan set data yang digunakan untuk melacak permintaan:Create request issued for: $SOURCE_DATASET_ID Waiting for operation [OPERATION_NUMBER] to complete...done. Created dataset $SOURCE_DATASET_ID.
Perintah di atas membuat set data sumber dengan nama
$SOURCE_DATASET_IDdi region$REGION.Buat penyimpanan FHIR menggunakan perintah berikut:
gcloud healthcare fhir-stores create $FHIR_STORE_ID \ --dataset=$SOURCE_DATASET_ID --location=$REGIONPerintah di atas membuat penyimpanan FHIR dengan nama
$FHIR_STORE_IDdalam set data$SOURCE_DATASET_ID.Tambahkan resource FHIR Patient ke penyimpanan FHIR menggunakan fungsi
createFHIR dengan perintah berikut:curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data "{ \"address\": [ { \"city\": \"Anycity\", \"district\": \"Anydistrict\", \"line\": [ \"123 Main Street\" ], \"period\": { \"start\": \"1990-12-05\" }, \"postalCode\": \"12345\", \"state\": \"CA\", \"text\": \"123 Main Street Anycity, Anydistrict, CA 12345\", \"use\": \"home\" } ], \"name\": [ { \"family\": \"Smith\", \"given\": [ \"Darcy\" ], \"use\": \"official\" } ], \"gender\": \"female\", \"birthDate\": \"1980-12-05\", \"resourceType\": \"Patient\" }" \ "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/fhirStores/$FHIR_STORE_ID/fhir/Patient"Argumen perintah ini berkaitan dengan contoh resource FHIR, yaitu resource FHIR Patient.
{ "address": [ { "city": "Anycity", "district": "Anydistrict", "line": [ "123 Main Street" ], "period": { "start": "1990-12-05" }, "postalCode": "12345", "state": "CA", "text": "123 Main Street Anycity, Anydistrict, CA 12345", "use": "home" } ], "name": [ { "family": "Smith", "given": [ "Darcy" ], "use": "official" } ], "gender": "female", "birthDate": "1980-12-05", "resourceType": "Patient" }Jika permintaan berhasil, server akan menampilkan output seperti berikut:
{ "address": [ { "city": "Anycity", "district": "Anydistrict", "line": [ "123 Main Street" ], "period": { "start": "1990-12-05" }, "postalCode": "12345", "state": "CA", "text": "123 Main Street Anycity, Anydistrict, CA 12345", "use": "home" } ], "birthDate": "1980-12-05", "gender": "female", "id": "0359c226-5d63-4845-bd55-74063535e4ef", "meta": { "lastUpdated": "2020-02-08T00:03:21.745220+00:00", "versionId": "MTU4MTEyMDIwMTc0NTIyMDAwMA" }, "name": [ { "family": "Smith", "given": [ "Darcy" ], "use": "official" } ], "resourceType": "Patient" }Perintah
curldi atas menyisipkan resource Patient baru dalam penyimpanan FHIR sumber. ID pasien (id) dihasilkan dalam output. ID pasien adalah string alfanumerik yang telah dide-identifikasi dan digunakan dalam resource FHIR Encounter untuk ditautkan ke resource FHIR Patient.Tambahkan resource FHIR Encounter ke penyimpanan FHIR menggunakan fungsi
createFHIR dengan perintah berikut. Ganti nilaisubject.referencedalam perintah ini dengan nilai ID pasien dari output perintahcurldi atas:curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/fhir+json; charset=utf-8" \ --data "{ \"status\": \"finished\", \"class\": { \"system\": \"http://hl7.org/fhir/v3/ActCode\", \"code\": \"IMP\", \"display\": \"inpatient encounter\" }, \"reason\": [ { \"text\": \"Mrs. Smith is a 39-year-old female who has a past medical history significant for a myocardial infarction. Catheterization showed a possible kink in one of her blood vessels.\" } ], \"subject\": { \"reference\": \"Patient/0359c226-5d63-4845-bd55-74063535e4ef\" }, \"resourceType\": \"Encounter\" }" \ "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/fhirStores/$FHIR_STORE_ID/fhir/Encounter"Argumen perintah ini berkaitan dengan contoh resource FHIR, yaitu resource FHIR Encounter.
{ "status": "finished", "class": { "system": "http://hl7.org/fhir/v3/ActCode", "code": "IMP", "display": "inpatient encounter" }, "reason": [ { "text": "Mrs. Smith is a 39-year-old female who has a past medical history significant for a myocardial infarction. Catheterization showed a possible kink in one of her blood vessels." } ], "subject": { "reference": "Patient/0359c226-5d63-4845-bd55-74063535e4ef" }, "resourceType": "Encounter" }Jika permintaan berhasil, server akan menampilkan output seperti berikut:
{ "class": { "code": "IMP", "display": "inpatient encounter", "system": "http://hl7.org/fhir/v3/ActCode" }, "id": "0038a95f-3c11-4163-8c2e-10842b6b1547", "meta": { "lastUpdated": "2020-02-12T00:39:16.822443+00:00", "versionId": "MTU4MTQ2Nzk1NjgyMjQ0MzAwMA" }, "reason": [ { "text": "Mrs. Smith is a 39-year-old female who has a past medical history significant for a myocardial infarction. Catheterization showed a possible kink in one of her blood vessels." } ], "resourceType": "Encounter", "status": "finished", "subject": { "reference": "Patient/0359c226-5d63-4845-bd55-74063535e4ef" }Perintah
curldi atas menyisipkan resource Encounter baru dalam penyimpanan FHIR sumber.
Mende-identifikasi data FHIR
Selanjutnya, Anda akan mende-identifikasi data FHIR yang telah Anda sisipkan dalam penyimpanan FHIR sumber.
Anda akan menyamarkan atau mengubah semua elemen PII di kolom terstruktur, seperti kolom Patient.name dan Patient.address. Anda juga akan mende-identifikasi elemen PII dalam data tidak terstruktur dalam teks, seperti Encounter.reason.text.
Jika ingin, Anda dapat mengekspor data yang dihasilkan langsung ke BigQuery untuk analisis dan pelatihan machine learning.
Konfigurasi de-identifikasi ini dapat digunakan untuk analisis kesehatan populasi atau kasus penggunaan serupa. Dalam konteks tutorial ini, Anda dapat memindahkan data terstruktur yang telah dide-identifikasi ke BigQuery untuk menilai tren dalam skala besar. Anda mungkin tidak memerlukan kolom tidak terstruktur, yang sulit dinormalisasi dan dianalisis dalam skala besar. Namun, kolom tidak terstruktur disertakan dalam tutorial ini sebagai referensi.
Ada banyak potensi kasus penggunaan de-identifikasi data FHIR. Ada juga banyak opsi konfigurasi yang didukung oleh Cloud Healthcare API. Untuk mengetahui informasi selengkapnya, termasuk contoh perintah curl dan contoh alat untuk PowerShell dalam berbagai skenario, lihat Mende-identifikasi data FHIR.
Kolom yang berisi tanggal ditransformasi melalui teknik pergeseran tanggal, yang mengubah semua tanggal dalam resource FHIR sebesar jumlah acak yang konsisten. Pergeseran tanggal mempertahankan konsistensi dalam resource FHIR, sehingga detail yang relevan secara medis, seperti usia pasien dan interval antar-janji temu, dipertahankan tanpa mengungkapkan informasi identitas pribadi pasien tersebut. Semua ID di kolom tidak terstruktur juga ditransformasi.
Contoh berikut juga mencakup transformasi hashing di kolom name. Hashing adalah teknik enkripsi satu arah yang memastikan bahwa nama selalu ditransformasi ke nilai output yang sama, sehingga menghasilkan output yang konsisten untuk nama pasien yang sama di berbagai kumpulan data dalam set data.
Dalam operasi ini, Anda mengaburkan PII sekaligus mempertahankan link antar-resource.
Dalam contoh ini, kunci kriptografis yang disediakan, U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=, adalah contoh kunci berenkode base64 dan dienkripsi dengan AES 256-bit, yang dihasilkan menggunakan perintah berikut.
echo -n "test" | openssl enc -e -aes-256-ofb -a -salt
Perintah tersebut meminta Anda memasukkan sandi. Masukkan sandi pilihan Anda.
Gunakan perintah
curluntuk menyamarkan atau mentransformasi semua elemen PII di kolom terstruktur, seperti kolomnamedanaddress, serta untuk mentransformasi semua ID di kolom tidak terstruktur.curl -X POST \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ --data "{ 'destinationDataset': 'projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID', 'config': { 'fhir': { 'fieldMetadataList': { 'paths': [ 'Patient.address.state', 'Patient.address.line', 'Patient.address.text', 'Patient.address.postalCode' ], 'action': 'TRANSFORM' }, 'fieldMetadataList': { 'paths': [ 'Encounter.reason.text' ], 'action': 'INSPECT_AND_TRANSFORM' }, 'text': { 'transformations': [ { 'infoTypes': [], 'replaceWithInfoTypeConfig': {} } ] }, 'fieldMetadataList': { 'paths': [ 'Patient.name.family', 'Patient.name.given' ], 'action': 'TRANSFORM' }, 'text': { 'transformations': { 'infoTypes': [ 'PERSON_NAME' ], 'cryptoHashConfig': { 'cryptoKey': 'U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=' } } }, 'fieldMetadataList': { 'paths': [ 'Patient.birthDate', 'Patient.address.period.start' ], 'action': 'TRANSFORM' }, 'text': { 'transformations': { 'infoTypes': [ 'DATE' ], 'dateShiftConfig': { 'cryptoKey': 'U2FsdGVkX19bS2oZsdbK9X5zi2utBn22uY+I2Vo0zOU=' } } } } }" "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID:deidentify"Jika permintaan ini berhasil, server akan menampilkan respons dalam format JSON seperti berikut:
{ "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/OPERATION_NAME" }Dalam contoh di atas, perintah
curlmende-identifikasi resource FHIR dengan mentransformasi nilai menggunakan cara berikut:- Menyamarkan nilai
Patient.address.line,Patient.address.text, danPatient.address.postalCode. - Mengganti nilai
Patient.name.familydanPatient.name.givendengan nilai hash. - Mengganti nilai di kolom
Patient.birthDatedanperiod.startdengan nilai yang dihasilkan melalui pergeseran tanggal dengan diferensial 100 hari. - Di kolom
Encounter.reason.text, mengganti nama keluarga pasien dengan nilai hash, dan mengganti usia pasien dengan nilai literal[AGE].
- Menyamarkan nilai
Respons terhadap operasi di atas memuat nama operasi. Gunakan metode
getuntuk melacak status operasi:curl -X GET \ -H "Authorization: Bearer "$(gcloud auth print-access-token) \ -H "Content-Type: application/json; charset=utf-8" \ "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME"Jika permintaan ini berhasil, server akan menampilkan respons dalam format JSON. Setelah proses de-identifikasi selesai, respons akan menyertakan
"done": true.{ "name": "projects/$PROJECT_ID/locations/$REGION/datasets/$SOURCE_DATASET_ID/operations/OPERATION_NAME", "metadata": { "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata", "apiMethodName": "google.cloud.healthcare.v1.dataset.DatasetService.DeidentifyDataset", "createTime": "2018-01-01T00:00:00Z", "endTime": "2018-01-01T00:00:00Z" }, "done": true, "response": { "@type": "...", "successStoreCount": "SUCCESS_STORE_COUNT" } }Perintah di atas menampilkan status operasi de-identifikasi.
Gunakan ID pasien untuk mendapatkan detail resource FHIR Patient dalam set data tujuan baru dengan menjalankan perintah berikut:
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://healthcare.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/datasets/$DESTINATION_DATASET_ID/fhirStores/$FHIR_STORE_ID/fhir/Patient/a952e409-2403-43e6-9815-cb78c5b5eca2/\$everything"Jika permintaan ini berhasil, server akan menampilkan respons seperti berikut, yang merupakan versi resource FHIR asli yang telah dide-identifikasi:
"entry": [\ {\ "resource": {\ "class": {\ "code": "IMP",\ "display": "inpatient encounter",\ "system": "http://hl7.org/fhir/v3/ActCode"\ },\ "id": "0038a95f-3c11-4163-8c2e-10842b6b1547",\ "reason": [\ {\ "text": "Mr. NlVBV12Hhb5DD8WNqlTpXboFxzlUSlqAmYDet/jIViQ= is a [AGE] gentleman who has a past medical history significant for a myocardial infarction. Catheterization showed a possible kink in one of his vessels."\ }\ ],\ "resourceType": "Encounter",\ "status": "finished",\ "subject": {\ "reference": "Patient/0359c226-5d63-4845-bd55-74063535e4ef"\ }\ }\ },\ {\ "resource": {\ "address": [\ {\ "city": "Anycity",\ "district": "Anydistrict",\ "line": [\ ""\ ],\ "period": {\ "start": "1990-09-23"\ },\ "postalCode": "",\ "state": "",\ "text": "",\ "use": "home"\ }\ ],\ "birthDate": "1980-09-23",\ "gender": "female",\ "id": "0359c226-5d63-4845-bd55-74063535e4ef",\ "name": [\ {\ "family": "NlVBV12Hhb5DD8WNqlTpXboFxzlUSlqAmYDet/jIViQ=",\ "given": [\ "FSH4e the project.D/IGb80a1rS0L0kqfC3DCDt6//17VPhIkOzH2pk="\ ],\ "use": "official"\ }\ ],\ "resourceType": "Patient"\ }\ }\ ],\ "resourceType": "Bundle",\ "total": 2,\ "type": "searchset"\ }Perintah di atas memverifikasi bahwa operasi de-identifikasi berhasil mende-identifikasi resource FHIR.
Pembersihan
Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus resource satu per satu.
Menghapus project
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Menghapus resource satu per satu
Hapus set data tujuan:
gcloud healthcare datasets delete $DESTINATION_DATASET_ID
Langkah berikutnya
- Konsep FHIR Cloud Healthcare API.
- Mengimpor data klinis FHIR ke cloud menggunakan Cloud Healthcare API.
- Mende-identifikasi data FHIR.
- Mengekspor resource FHIR ke BigQuery.
- Dokumentasi Cloud Healthcare API.
- Cloud Healthcare API kami dan solusi lainnya untuk mendukung organisasi layanan kesehatan dan ilmu hayati selama pandemi.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.