ポイントインタイム リカバリ(PITR)を使用して FHIR リソースを復元する

このページでは、ポイントインタイム リカバリ(PITR)を使用して、FHIR ストア内の FHIR リソースを過去 21 日間の状態に復元する方法について説明します。PITR を使用して、FHIR リソースが誤って削除されるなどの不要な変更から復元できます。

準備

PITR リクエストは高度なオペレーション リクエストに分類され、それに応じて課金されます。PITR を使用する前に、高度なオペレーション リクエストの料金を確認してください。

PITR と FHIR のリソースの変更履歴

PITR は FHIR リソースの変更履歴に依存しません。FHIR ストアの disableResourceVersioning フィールドが true の場合、または FHIR リソースの過去のバージョンが削除されている場合は、引き続き PITR を使用できます。

復元ワークフロー

本番環境の復元が期待どおりに実行されるように、まずドライランを実行します。ドライランでは、復元する FHIR リソースの ID とタイプを含む 1 つ以上のファイルが出力されます。本番環境での復元を再度実行する前に、出力ファイルの正確性を確認します。

特定のリソースを復元する、またはフィルタ条件に従ってリソースを復元するには、フィルタを指定します。

ドライランを行う

本番環境で FHIR リソースを復元する前に、ドライランを行います。

次のサンプルは、fhirStores.rollback メソッドを使用してドライランを行う方法を示しています。

REST

  1. FHIR リソースを復元します。

    ドライランを行うには、force フィールドが false であることを確認します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • LOCATION: データセットの場所
    • DATASET_ID: FHIR ストアの親データセット
    • FHIR_STORE_ID: FHIR ストア ID
    • RECOVERY_TIMESTAMP: 過去 21 日以内の復元ポイント。RFC 3339 形式を使用します。2 番目の部分に時刻を指定し、タイムゾーンを加えます(例: 2015-02-07T13:28:17.239+02:002017-01-01T00:00:00Z)。
    • CLOUD_STORAGE_BUCKET: 出力ファイルを書き込む Cloud Storage フォルダまたはバケットの完全修飾 URI

    リクエストの本文(JSON):

    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "false"
    }
    

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    cat > request.json << 'EOF'
    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "false"
    }
    EOF

    その後、次のコマンドを実行して REST リクエストを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:rollback"

    PowerShell

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    @'
    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "false"
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    その後、次のコマンドを実行して REST リクエストを送信します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:rollback" | Select-Object -Expand Content

    API Explorer

    リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスには、長時間実行オペレーション(LRO)の識別子が含まれます。長時間実行オペレーションは、メソッドの呼び出しが完了するまでに時間がかかる場合に返されます。OPERATION_IDの値をメモします。この値は次の手順で必要になります。

  2. projects.locations.datasets.operations.get メソッドを使用して、長時間実行オペレーションのステータスを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • DATASET_ID: データセット ID
    • LOCATION: データセットの場所
    • OPERATION_ID: 長時間実行オペレーションから返された ID。

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    次のコマンドを実行します。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    次のコマンドを実行します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API Explorer

    メソッド リファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。必須フィールドを入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスに "done": true が含まれている場合、長時間実行オペレーションは終了しています。

ドライランの出力ファイルを表示する

各ドライランでは、復元する FHIR リソースの ID とタイプを含む 1 つ以上のファイルが出力されます。ファイルは、送信先の Cloud Storage バケットの rollback_resources フォルダ内のサブフォルダに作成されます。サブフォルダ名は、fhirStores.rollback レスポンスで返された LRO ID です。ファイルを表示して、復元が想定どおりに機能することを確認するには、オブジェクトのメタデータを表示するをご覧ください。

ファイルの数は、復元された FHIR リソースの数に比例します。

ファイル名の形式は trial-NUMBER-of-TOTAL_NUMBER.txt です。ここで、NUMBER はファイル番号、TOTAL_NUMBER はファイルの合計数です。

ドライランの出力ファイル スキーマ

ドライランの復元からの出力ファイルは、次の表に示すスキーマを使用します。

RESOURCE_TYPE RESOURCE_ID TIMESTAMP
FHIR のリソースタイプ。 FHIR のリソース ID。 FHIR ストアで FHIR リソースが作成または更新された時刻。

本番環境で復元する

本番環境で復元する前にドライランを実行し、ドライランの出力ファイルを調べて本番環境での復元が想定どおりに実行されることを確認します。

次のサンプルは、fhirStores.rollback メソッドを使用して本番環境で FHIR リソースを復元する方法を示しています。

REST

  1. FHIR リソースを復元します。

    force フィールドが true であることを確認します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • LOCATION: データセットの場所
    • DATASET_ID: FHIR ストアの親データセット
    • FHIR_STORE_ID: FHIR ストア ID
    • RECOVERY_TIMESTAMP: 過去 21 日以内の復元ポイント。RFC 3339 形式を使用します。2 番目の部分に時刻を指定し、タイムゾーンを加えます(例: 2015-02-07T13:28:17.239+02:002017-01-01T00:00:00Z)。
    • CLOUD_STORAGE_BUCKET: 出力ファイルを書き込む Cloud Storage フォルダまたはバケットの完全修飾 URI

    リクエストの本文(JSON):

    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "true"
    }
    

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    cat > request.json << 'EOF'
    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "true"
    }
    EOF

    その後、次のコマンドを実行して REST リクエストを送信します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:rollback"

    PowerShell

    リクエスト本文を request.json という名前のファイルに保存します。ターミナルで次のコマンドを実行して、このファイルを現在のディレクトリに作成または上書きします。

    @'
    {
      "rollbackTime": "RECOVERY_TIMESTAMP",
      "resultGcsBucket": "gs://CLOUD_STORAGE_BUCKET",
      "force": "true"
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    その後、次のコマンドを実行して REST リクエストを送信します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json; charset=utf-8" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID:rollback" | Select-Object -Expand Content

    API Explorer

    リクエスト本文をコピーして、メソッドのリファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。このツールにリクエスト本文を貼り付け、その他の必須フィールドに入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスには、長時間実行オペレーション(LRO)の識別子が含まれます。長時間実行オペレーションは、メソッドの呼び出しが完了するまでに時間がかかる場合に返されます。OPERATION_IDの値をメモします。この値は次の手順で必要になります。

  2. projects.locations.datasets.operations.get メソッドを使用して、長時間実行オペレーションのステータスを取得します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: Google Cloud プロジェクトの ID
    • DATASET_ID: データセット ID
    • LOCATION: データセットの場所
    • OPERATION_ID: 長時間実行オペレーションから返された ID。

    リクエストを送信するには、次のいずれかのオプションを選択します。

    curl

    次のコマンドを実行します。

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    次のコマンドを実行します。

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

    API Explorer

    メソッド リファレンス ページを開きます。ページの右側に [API Explorer] パネルが開きます。このツールを操作してリクエストを送信できます。必須フィールドを入力して、[Execute] をクリックします。

    次のとおり出力されます。レスポンスに "done": true が含まれている場合、長時間実行オペレーションは終了しています。

本番環境の復元の出力ファイルを表示する

本番環境の復元では、次のファイルが出力されます。ファイルは、送信先の Cloud Storage バケットの rollback_resources フォルダ内のサブフォルダに作成されます。サブフォルダ名は、fhirStores.rollback レスポンスで返された LRO ID です。ファイルを表示するには、オブジェクトのメタデータを表示するをご覧ください。

  • success-NUMBER-of-TOTAL_NUMBER.txt: 正常に復元された FHIR リソースが含まれます。
  • fail-NUMBER-of-TOTAL_NUMBER.txt: 復元に失敗した FHIR リソースが含まれます。失敗していない場合でも、空のファイルが生成されます。

ファイル名の NUMBER はファイル番号、TOTAL_NUMBER はファイルの合計数です。

本番環境の出力ファイル スキーマ

本番環境の復元からの成功ファイルと失敗ファイルは、次のスキーマを使用します。エラーファイルには追加の ERROR_MESSAGE 列が含まれています。

RESOURCE_TYPE RESOURCE_ID ROLLBACK_VERSION_ID NEW_VERSION_ID ERROR_MESSAGE(エラー ファイルのみ)
FHIR のリソースタイプ。 FHIR のリソース ID。 復元が開始された時点でのリソースの現在のバージョン ID。 復元後のリソースの現在のバージョン ID。disableResourceVersioningtrue の場合、またはリソースを復元するとリソースが削除される場合は、ROLLBACK_VERSION_IDNEW_VERSION_ID は空になります。 エラー ファイルのみ。復元する FHIR リソースを提出する理由を説明します。

フィルタを使用して特定の FHIR リソースを復元する

以降のセクションでは、フィルタを使用してフィルタ条件に基づいて FHIR リソースを復元する方法について説明します。フィルタは、fhirStores.rollback リクエストの送信時に RollbackFhirResourceFilteringFields オブジェクトで指定します。

フィルタは、次のような複数のユースケースで組み合わせて使用することも、個別に使用することもできます。

  • FHIR リソースを誤って削除した後、他の FHIR リソースを変更せずに、特定の FHIR リソースを復元します。
  • 特定のインポート オペレーションが特定の FHIR リソースをインポートする前の状態に FHIR ストアを復元する。

フィルタ ファイルを使用する

デフォルトでは、PITR は FHIR ストア内のすべての FHIR リソースを復元します。特定の FHIR リソースを復元するには、リソースタイプとそのリソース ID をファイルに指定し、そのファイルを Cloud Storage にアップロードします。inputGcsObject フィールドにファイルの場所を指定します。

Cloud Storage からフィルタ ファイルを読み取るには、Cloud Healthcare サービス エージェントのサービス アカウントに権限を付与する必要があります。詳細については、Cloud Storage からフィルタ ファイルを読み取るをご覧ください。

フィルタ ファイルの拡張子は任意です。次のスキーマを使用し、1 行に 1 つの FHIR リソースを含める必要があります。

FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID

たとえば、ID が 8f25b0ac の Patient リソースと、ID が d507417e90ee9950d90e の 2 つの Observation リソースを復元するには、フィルタ ファイルで次のように指定します。

Patient/8f25b0ac
Observation/d507417e90e
Observation/e9950d90e

カスタム関数を使用する

Cloud Healthcare API は、次のカスタム フィルタ関数を提供します。カスタム関数を rollbackTime フィールドと組み合わせて、追加のフィルタを適用できます。

tag
詳細
関数の構文
tag("system") = "code"
説明
リソース Meta.tag 要素に基づいて FHIR リソースをフィルタします。
引数
system
string
コードシステムを参照する URL。詳細については、リソースでコードを使用するをご覧ください。
code
string
コードシステムで定義されているコンセプトを識別する値。詳細については、リソースでコードを使用するをご覧ください。
extension_value_ts
詳細
関数の構文
extension_value_ts("url")
説明
extension 要素の url 値に基づいて FHIR リソースをフィルタリングします。ここで、url は UNIX タイムスタンプです。次の比較演算子をサポートしています。
  • =
  • !=
  • <
  • >
  • <=
  • >=
引数
url
string
拡張機能を定義する StructureDefinition リソースの正規 URL。たとえば、次の extension 要素では、urlhttp://hl7.org/fhir/StructureDefinition/timezone です。
"extension" : [{
  "url" : "http://hl7.org/fhir/StructureDefinition/timezone",
  "valueCode" : "America/New_York"
}]
詳細については、拡張機能の定義をご覧ください。

FHIR リソースタイプでフィルタする

リソースタイプのみに基づいて FHIR リソースを幅広くフィルタするには、types[] 配列でリソースタイプを指定します。

オペレーション タイプでフィルタリング

CREATEUPDATE、または DELETE のトランザクションで変更された FHIR リソースをフィルタリングするには、ChangeType 列挙型で値を指定します。

たとえば、削除された FHIR リソースのみを復元するには、DELETE 値を指定します。

CHANGE_TYPE_UNSPECIFIED または ALL を指定するか、値を指定しない場合は、すべての FHIR リソースが復元されます。

過去の復元を除外する

FHIR リソースの復元時に過去の復元を除外するには、excludeRollbacks フィールドを true に設定します。復元が正しく機能し、変更を上書きしない場合は、過去の復元を除外できます。タイムスタンプが重複する複数の復元を実行することもできます。

次のシナリオを考えてみます。

  1. 1:00 で、復元タイムスタンプを 0:01 に設定して復元を開始します。2:00 では、復元オペレーションにより FHIR ストアの Patient/1Patient/2 の Patient リソースが削除されます。復元オペレーションは 3:00 で終了します。
  2. 数日後、復元タイムスタンプを 1:00 に設定して復元オペレーションを実行します。デフォルトでは、オペレーションを実行すると次の結果になります。

    • Patient/1Patient/2 の Patient リソースを誤って再作成しました。
    • 3:00 の後に作成または更新された FHIR リソースを正しく復元。

Patient/1Patient/2 の Patient リソースを削除した初期復元オペレーションを除外し、再作成を避けるには、excludeRollbackstrue に設定します。

長時間実行オペレーション(LRO)ID を使用してフィルタする

FHIR リソースが 1 つ以上の長時間実行オペレーション(LRO)によって変更された場合は、operationIds フィールドで LRO ID を指定し、変更されたリソースを復元することができます。

Cloud Healthcare API データセットで LRO ID を一覧表示して表示する方法については、LRO の一覧表示をご覧ください。

本番環境で復元に失敗した FHIR リソースを再試行する

一部の FHIR リソースが本番環境の復元に失敗した場合は、復元を再試行できます。生成された本番環境の出力ファイルを使用して、失敗した FHIR リソースを見つけます。これらの FHIR リソースのタイプとその ID をフィルタ ファイルで指定し、復元を再度実行します。

各リクエストで同じ構成を使用し、タイムスタンプが過去 21 日以内であれば、復元を実行するたびに復元はべき等になります。

制限事項

  • PITR では、FHIR ストアの disableReferentialIntegrity 設定に関係なく、参照整合性が適用されません。一部の FHIR リソースのみを復元すると、FHIR ストアが参照整合性に違反する状態になる可能性があります。

  • PITR では、復元された FHIR リソースが作成または更新されたときに検証されているため、FHIR プロファイルの検証はスキップされます。FHIR ストア プロファイルの構成が変更された場合、PITR により FHIR ストアがプロファイル検証に違反する状態のままになることがあります。

  • rollbackTime の値が FHIR ストアで FHIR リソースが削除された時刻よりも前の場合、FHIR ストアで enableUpdateCreate が有効になっている必要があります。有効でない場合、リソースは復元されません。

  • 復元中に FHIR ストアを更新したり、データを読み書きしたりできますが、復元の段階によっては予期しない結果が表示されることがあります。たとえば、読み取りリクエストでは、復元された FHIR リソースと復元されていない FHIR リソースの組み合わせが返される場合があります。リソースを更新すると、復元によって更新が上書きされる可能性があります。

  • PITR は FHIR リソースの履歴を保持します。復元された各リソースには新しい現在のバージョンが割り当てられ、その履歴は保持されます。