最近、IT 業界暗いニュースが飛び交っています。
www.businessinsider.jp
www.businessinsider.jp
www.businessinsider.jp
www.businessinsider.jp
www.businessinsider.jp
いやはや、いつごろ景気が回復するのかなぁと思う今日この頃です。それはさておき、色々あって Azure Health Data Services を検証していくことになりました。Azure Health Data Services とは、FHIR に準拠したサービスとなっています。FHIR (Fast Healthcare Interoperability Resources)は、医療において、ヘルスケア情報を効率的かつ安全に交換するために開発されたデータ標準規格です。FHIRは、現在の業界標準であるHL7 v2やCDA(Clinical Document Architecture)などと比較して、より簡潔かつ革新的なフォーマットを採用しています。このことにより、患者のレコードをよりスムーズに移行したり、異なるヘルスケアシステム間での情報共有を容易にすることができます。※FHIR の説明は、少しだけ ChatGPT に頼ってみましたw
それでは、早速試してみましょう。今回は、Azure Health Data Services で FHIR サービスをデプロイし、Visual Studio Code を使って簡単に動作確認をしていきたいと思います。Azure Portal から、"Health Data Services ワークスペース" を選択します。
Azure Health Data Services ワークスペースは、Fast Healthcare Interoperability Resources (FHIR®) サービス、Digital Imaging and Communications in Medicine (DICOM®) サービス、MedTech サービスなど、すべての医療サービス インスタンスの論理コンテナーです。 ワークスペースでは、保護された正常性情報を移動できるコンプライアンス境界 (HIPAA、HITRUST) も作成されます。
- ワークスペースを作成します。
- 現時点では、日本のリージョンは選択できません。※むぅ、医療データは国外保存ができないので、まだ日本では採用ができません(´;ω;`)
- FHIR サービスを追加します。
- FHIR サービスの設定し、作成します。
- FHIR サービスの CORS を設定し、"保存" します。
Azure Health Data Services の FHIR サービス (ここでは FHIR サービスと呼ばれます) では、 クロスオリジン リソース共有 (CORS) がサポートされています。 CORS を使用すると、あるドメイン (オリジン) のアプリケーションが異なるドメインのリソースにアクセスできる ("ドメイン間要求" と呼ばれます) ように、設定を構成することができます。
- Azure AD の "アプリの登録" → "新規登録" をします。
- 名前を付けて、"登録"します。
- クライアント ID、テナント ID はあとで使用するので、メモ帳などにコピーしておいてもよいかもしれません。
- "証明書とシークレット" → "新しいクライアントシークレット" をクリックします。
- シークレットの設定し、"追加" をクリックします。
- シークレットの値をメモ帳などにコピーしておきます。※シークレットは厳重に管理しましょう。
- "API のアクセス許可" → "アクセス許可の追加" をクリックします。
- "所属する組織で使用している API" をクリックし、"Azure" で検索します。検索結果から "Azure Healthcare APIs" をクリックします。
- "委任されたアクセス許可" をクリックし、"user_impersonation" にチェックを入れ、"アクセス許可の追加" をクリックします。
- FHIR サービスの設定をします。※FHIR メタデータエンドポイントもメモ帳などにコピーしておいてください。
- "アクセス制御 (IAM)" → "追加" → "ロールの割り当ての追加" をクリックします。
- "FHIR データ共同作成者" を選択し、"次へ" をクリックします。
- "メンバーを選択する" をクリックし、"myfhirapp" を選択します。
- "レビューと割り当て" をクリックします。
- これで準備ができましたので、Visual Studio Code から FHIR サービスに対してリクエストを投げてみます。VS Code の REST Client 拡張機能をインストールします。
- メモ帳にコピーしている各種情報を *.http ファイルに設定していきます。
※実際に使用したコードは下記の通りです。
### 変数定義 環境に合わせて修正してください。 @fhirurl =https://myhealthdataservices01-myfhir.fhir.azurehealthcareapis.com @clientid =1f204d78-9da7-4ee0-b41f-cb4829e2542b @clientsecret =AZI8Q~LQ4qiCDGwSRX8h_lOkwNiDxx3cDQiu_c5O @tenantid =xxxxxxxxxx-xxxx-xxxxxxxx-xxxxx-xxxxxxxxxxxxx ### トークンの取得 # @name getAADToken POST https://login.microsoftonline.com/{{tenantid}}/oauth2/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &resource={{fhirurl}} &client_id={{clientid}} &client_secret={{clientsecret}} ### トークンを変数に格納 @token = {{getAADToken.response.body.access_token}} ### 患者の取得 (すべて) GET {{fhirurl}}/Patient Authorization: Bearer {{token}} ### 患者の登録 PUT {{fhirurl}}/Patient/example HTTP/1.1 Content-Type: application/json Authorization: Bearer {{token}} { "resourceType": "Patient", "id": "example", "text": { "status": "generated", "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>Name</td>\n\t\t\t\t\t\t<td>Peter James \n <b>Chalmers</b> ("Jim")\n </td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>Address</td>\n\t\t\t\t\t\t<td>534 Erewhon, Pleasantville, Vic, 3999</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>Contacts</td>\n\t\t\t\t\t\t<td>Home: unknown. Work: (03) 5555 6473</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td>Id</td>\n\t\t\t\t\t\t<td>MRN: 12345 (Acme Healthcare)</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>" }, "identifier": [ { "use": "usual", "type": { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v2-0203", "code": "MR" } ] }, "system": "urn:oid:1.2.36.146.595.217.0.1", "value": "12345", "period": { "start": "2001-05-06" }, "assigner": { "display": "Acme Healthcare" } } ], "active": true, "name": [ { "use": "official", "family": "Chalmers", "given": [ "Peter", "James" ] }, { "use": "usual", "given": [ "Jim" ] }, { "use": "maiden", "family": "Windsor", "given": [ "Peter", "James" ], "period": { "end": "2002" } } ], "telecom": [ { "use": "home" }, { "system": "phone", "value": "(03) 5555 6473", "use": "work", "rank": 1 }, { "system": "phone", "value": "(03) 3410 5613", "use": "mobile", "rank": 2 }, { "system": "phone", "value": "(03) 5555 8834", "use": "old", "period": { "end": "2014" } } ], "gender": "male", "birthDate": "1974-12-25", "_birthDate": { "extension": [ { "url": "http://hl7.org/fhir/StructureDefinition/patient-birthTime", "valueDateTime": "1974-12-25T14:35:45-05:00" } ] }, "deceasedBoolean": false, "address": [ { "use": "home", "type": "both", "text": "534 Erewhon St PeasantVille, Rainbow, Vic 3999", "line": [ "534 Erewhon St" ], "city": "PleasantVille", "district": "Rainbow", "state": "Vic", "postalCode": "3999", "period": { "start": "1974-12-25" } } ], "contact": [ { "relationship": [ { "coding": [ { "system": "http://terminology.hl7.org/CodeSystem/v2-0131", "code": "N" } ] } ], "name": { "family": "du Marché", "_family": { "extension": [ { "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix", "valueString": "VV" } ] }, "given": [ "Bénédicte" ] }, "telecom": [ { "system": "phone", "value": "+33 (237) 998327" } ], "address": { "use": "home", "type": "both", "line": [ "534 Erewhon St" ], "city": "PleasantVille", "district": "Rainbow", "state": "Vic", "postalCode": "3999", "period": { "start": "1974-12-25" } }, "gender": "female", "period": { "start": "2012" } } ], "managingOrganization": { "reference": "Organization/1" } }
※患者情報のサンプルは、ここから取得しています。
- "### 患者の取得 (すべて)" というコメント下にある、"Send Request" をクリックすることで、FHIR サービスより患者情報を取得することができます。
- "### 患者の登録" というコメント下にある、"Send Request" をクリックすることで、FHIR サービスに対して患者登録を依頼します。
とりあえず試してみました。
最近、ロボット掃除機がほしくなってきた。Anker がほしいなぁ。
これも捨てがたい。
www.makuake.com