都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

Azure Health Data Services を試してみる

 最近、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 ワークスペース" を選択します。

Health Data Services ワークスペースを選択する

Azure Health Data Services ワークスペースは、Fast Healthcare Interoperability Resources (FHIR®) サービス、Digital Imaging and Communications in Medicine (DICOM®) サービス、MedTech サービスなど、すべての医療サービス インスタンスの論理コンテナーです。 ワークスペースでは、保護された正常性情報を移動できるコンプライアンス境界 (HIPAA、HITRUST) も作成されます。

learn.microsoft.com

  • 現時点では、日本のリージョンは選択できません。※むぅ、医療データは国外保存ができないので、まだ日本では採用ができません(´;ω;`) 
    リソースグループ、ワークスペース名などを設定する
  • FHIR サービスを追加します。
    FHIR サービスを追加する
  • FHIR サービスの設定し、作成します。
    FHIR サービスを設定する
  • FHIR サービスの CORS を設定し、"保存" します。
    CORS を設定する

Azure Health Data Services の FHIR サービス (ここでは FHIR サービスと呼ばれます) では、 クロスオリジン リソース共有 (CORS) がサポートされています。 CORS を使用すると、あるドメイン (オリジン) のアプリケーションが異なるドメインのリソースにアクセスできる ("ドメイン間要求" と呼ばれます) ように、設定を構成することができます。

learn.microsoft.com

  • Azure AD の "アプリの登録" → "新規登録" をします。
    アプリの登録をする
  • 名前を付けて、"登録"します。
    アプリの登録をする
  • クライアント ID、テナント ID はあとで使用するので、メモ帳などにコピーしておいてもよいかもしれません。
    アプリを登録する
  • "証明書とシークレット" → "新しいクライアントシークレット" をクリックします。
    シークレットを設定する
  • シークレットの設定し、"追加" をクリックします。
    シークレットの設定をする
  • シークレットの値をメモ帳などにコピーしておきます。※シークレットは厳重に管理しましょう。
    シークレットをコピーする
  • "API のアクセス許可" → "アクセス許可の追加" をクリックします。
    API のアクセス許可をする
  • "所属する組織で使用している API" をクリックし、"Azure" で検索します。検索結果から "Azure Healthcare APIs" をクリックします。
    API のアクセス許可をする
  • "委任されたアクセス許可" をクリックし、"user_impersonation" にチェックを入れ、"アクセス許可の追加" をクリックします。
    API のアクセス許可をする
  • FHIR サービスの設定をします。※FHIR メタデータエンドポイントもメモ帳などにコピーしておいてください。
    FHIR サービスを設定する
  • "アクセス制御 (IAM)" → "追加" → "ロールの割り当ての追加" をクリックします。
    ロールの割り当てをする
  • "FHIR データ共同作成者" を選択し、"次へ" をクリックします。
    ロールの割り当てをする
  • "メンバーを選択する" をクリックし、"myfhirapp" を選択します。
    ロールの割り当てをする
  • "レビューと割り当て" をクリックします。
    ロールの割り当てをする

marketplace.visualstudio.com

  • メモ帳にコピーしている各種情報を *.http ファイルに設定していきます。
    VS Code で REST Client を使用する

※実際に使用したコードは下記の通りです。

### 変数定義 環境に合わせて修正してください。
@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> (&quot;Jim&quot;)\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" をクリックすることで、Azure AD よりトークンを取得することができます。
    トークンを取得する
  • "### 患者の取得 (すべて)" というコメント下にある、"Send Request" をクリックすることで、FHIR サービスより患者情報を取得することができます。
    患者情報を取得する
  • "### 患者の登録" というコメント下にある、"Send Request" をクリックすることで、FHIR サービスに対して患者登録を依頼します。
    患者情報を登録する

とりあえず試してみました。

最近、ロボット掃除機がほしくなってきた。Anker がほしいなぁ。

これも捨てがたい。
www.makuake.com