Recuperar recursos FHIR com a recuperação pontual (PITR)

Nesta página, descrevemos como usar a recuperação pontual (PITR, na sigla em inglês) para recuperar recursos FHIR em um armazenamento FHIR para um estado nos últimos 21 dias. É possível usar a PITR para se recuperar de alterações indesejadas, como a exclusão acidental de recursos FHIR.

Antes de começar

As solicitações PITR são categorizadas como solicitações de operação avançada e são cobradas de acordo. Antes de usar a PITR, revise os preços das solicitações de operação avançada.

Histórico de versões de recursos de PITR e FHIR

A PITR não depende do histórico de versões do recurso FHIR. Ainda será possível usar a PITR se o campo disableResourceVersioning em um armazenamento FHIR for true ou se as versões históricas de um recurso FHIR tiverem sido limpadas (links em inglês).

Fluxo de trabalho de recuperação

Para garantir que uma recuperação de produção seja executada conforme esperado, primeiro faça uma simulação. A simulação gera um ou mais arquivos que contêm os IDs e os tipos de recursos FHIR a serem recuperados. Verifique a exatidão dos arquivos de saída antes de executar a recuperação novamente em production.

Para recuperar recursos específicos ou recuperar recursos de acordo com um critério de filtragem, especifique um filtro.

Fazer uma simulação

Antes de recuperar recursos FHIR na produção, faça uma simulação.

Os exemplos a seguir mostram como fazer uma simulação usando o método fhirStores.rollback.

REST

  1. Recupere os recursos FHIR.

    Para fazer uma simulação, verifique se o campo force é false.

    Antes de usar os dados da solicitação, faça as substituições a seguir:

    • PROJECT_ID: o ID do seu projeto do Google Cloud;
    • LOCATION: o local do conjunto de dados;
    • DATASET_ID: o conjunto de dados pai do armazenamento de FHIR
    • FHIR_STORE_ID: o ID de armazenamento de FHIR
    • RECOVERY_TIMESTAMP: um ponto de recuperação nos últimos 21 dias. Use o formato RFC 3339 (link em inglês). Especifique a hora no segundo e inclua um fuso horário, por exemplo, 2015-02-07T13:28:17.239+02:00 ou 2017-01-01T00:00:00Z.
    • CLOUD_STORAGE_BUCKET: o URI totalmente qualificado para uma pasta ou bucket do Cloud Storage em que os arquivos de saída são gravados.

    Solicitar corpo JSON:

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

    Para enviar a solicitação, escolha uma destas opções:

    curl

    Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

    Depois execute o comando a seguir para enviar a solicitação 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

    Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

    Depois execute o comando a seguir para enviar a solicitação 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

    APIs Explorer

    Copie o corpo da solicitação e abra a página de referência do método. O painel "APIs Explorer" é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Cole o corpo da solicitação nessa ferramenta, preencha todos os outros campos obrigatórios e clique em Executar.

    A saída é esta. A resposta contém um identificador para uma operação de longa duração (LRO, na sigla em inglês). Operações de longa duração são retornadas quando as chamadas de método podem levar mais tempo para serem concluídas. Anote o valor de OPERATION_ID. Você vai precisar desse valor na próxima etapa.

  2. Use o método projects.locations.datasets.operations.get para ver o status da operação de longa duração.

    Antes de usar os dados da solicitação, faça as substituições a seguir:

    • PROJECT_ID: o ID do seu projeto do Google Cloud;
    • DATASET_ID: o ID do conjunto de dados;
    • LOCATION: o local do conjunto de dados;
    • OPERATION_ID: o ID retornado da operação de longa duração.

    Para enviar a solicitação, escolha uma destas opções:

    curl

    execute o seguinte comando:

    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

    execute o seguinte comando:

    $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

    APIs Explorer

    Abra a página de referência do método. O painel APIs Explorer é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Preencha todos os campos obrigatórios e clique em Executar.

    A saída é esta. Quando a resposta contiver "done": true, a operação de longa duração será concluída.

Acessar arquivos de saída de simulação

Cada simulação gera um ou mais arquivos contendo os IDs e os tipos de recursos FHIR a serem recuperados. Os arquivos são criados em uma subpasta na pasta rollback_resources, no bucket de destino do Cloud Storage. O nome da subpasta é o ID da LRO retornado na resposta fhirStores.rollback. Para ver os arquivos e garantir que a recuperação funcione conforme o esperado, consulte Visualizar metadados do objeto.

O número de arquivos é proporcional ao número de recursos FHIR recuperados.

Os nomes de arquivos usam o formato trial-NUMBER-of-TOTAL_NUMBER.txt, em que NUMBER é o número do arquivo e TOTAL_NUMBER é o número total de arquivos.

Esquema do arquivo de saída de simulação

Os arquivos de saída de uma recuperação de simulação usam o esquema mostrado na tabela a seguir:

RESOURCE_TYPE RESOURCE_ID TIMESTAMP
O tipo de recurso FHIR. O ID do recurso FHIR. A hora em que o recurso FHIR foi criado ou atualizado no armazenamento FHIR.

Recuperar na produção

Antes de recuperar na produção, faça uma simulação e inspecione os arquivos de saída de simulação para garantir que a recuperação da produção seja executada conforme o esperado.

Os exemplos a seguir mostram como restaurar recursos FHIR em produção usando o método fhirStores.rollback.

REST

  1. Recupere os recursos FHIR.

    Confira se o campo force é true.

    Antes de usar os dados da solicitação, faça as substituições a seguir:

    • PROJECT_ID: o ID do seu projeto do Google Cloud;
    • LOCATION: o local do conjunto de dados;
    • DATASET_ID: o conjunto de dados pai do armazenamento de FHIR
    • FHIR_STORE_ID: o ID de armazenamento de FHIR
    • RECOVERY_TIMESTAMP: um ponto de recuperação nos últimos 21 dias. Use o formato RFC 3339 (link em inglês). Especifique a hora no segundo e inclua um fuso horário, por exemplo, 2015-02-07T13:28:17.239+02:00 ou 2017-01-01T00:00:00Z.
    • CLOUD_STORAGE_BUCKET: o URI totalmente qualificado para uma pasta ou bucket do Cloud Storage em que os arquivos de saída são gravados.

    Solicitar corpo JSON:

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

    Para enviar a solicitação, escolha uma destas opções:

    curl

    Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

    Depois execute o comando a seguir para enviar a solicitação 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

    Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

    Depois execute o comando a seguir para enviar a solicitação 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

    APIs Explorer

    Copie o corpo da solicitação e abra a página de referência do método. O painel "APIs Explorer" é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Cole o corpo da solicitação nessa ferramenta, preencha todos os outros campos obrigatórios e clique em Executar.

    A saída é esta. A resposta contém um identificador para uma operação de longa duração (LRO, na sigla em inglês). Operações de longa duração são retornadas quando as chamadas de método podem levar mais tempo para serem concluídas. Anote o valor de OPERATION_ID. Você vai precisar desse valor na próxima etapa.

  2. Use o método projects.locations.datasets.operations.get para ver o status da operação de longa duração.

    Antes de usar os dados da solicitação, faça as substituições a seguir:

    • PROJECT_ID: o ID do seu projeto do Google Cloud;
    • DATASET_ID: o ID do conjunto de dados;
    • LOCATION: o local do conjunto de dados;
    • OPERATION_ID: o ID retornado da operação de longa duração.

    Para enviar a solicitação, escolha uma destas opções:

    curl

    execute o seguinte comando:

    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

    execute o seguinte comando:

    $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

    APIs Explorer

    Abra a página de referência do método. O painel APIs Explorer é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Preencha todos os campos obrigatórios e clique em Executar.

    A saída é esta. Quando a resposta contiver "done": true, a operação de longa duração será concluída.

Ver os arquivos de saída da recuperação de produção

Uma recuperação de produção gera os arquivos a seguir. Os arquivos são criados em uma subpasta na pasta rollback_resources no bucket de destino do Cloud Storage. O nome da subpasta é o ID da LRO retornado na resposta fhirStores.rollback. Para ver os arquivos, consulte Visualizar metadados do objeto.

  • success-NUMBER-of-TOTAL_NUMBER.txt: contém recursos FHIR recuperados.
  • fail-NUMBER-of-TOTAL_NUMBER.txt: contém recursos FHIR que não foram recuperados. Um arquivo vazio é gerado mesmo que não haja falhas.

Nos nomes dos arquivos, NUMBER é o número do arquivo e TOTAL_NUMBER é o número total de arquivos.

Esquema do arquivo de saída de Production

Os arquivos de sucesso e falha de uma recuperação de produção usam o esquema a seguir. Os arquivos de erro contêm uma coluna ERROR_MESSAGE extra.

RESOURCE_TYPE RESOURCE_ID ROLLBACK_VERSION_ID NEW_VERSION_ID ERROR_MESSAGE (somente arquivos de erro)
O tipo de recurso FHIR. O ID do recurso FHIR. O ID da versão atual do recurso no momento em que a recuperação foi iniciada. O ID da versão atual do recurso após a recuperação. Se disableResourceVersioning for true ou se a recuperação de um recurso excluir o recurso, ROLLBACK_VERSION_ID e NEW_VERSION_ID vão estar vazios. Somente arquivos de erro. Descreve o motivo pelo qual o recurso FHIR foi preenchido para ser recuperado.

Usar filtros para recuperar recursos FHIR específicos

As seções a seguir descrevem como usar filtros para recuperar recursos FHIR com base em um critério de filtro. Especifique os filtros no objeto RollbackFhirResourceFilteringFields ao enviar uma solicitação fhirStores.rollback.

É possível combinar ou usar filtros individualmente para vários casos de uso, incluindo:

  • Recuperar recursos específicos do FHIR após a exclusão acidental, deixando os outros inalterados.
  • A restauração de um armazenamento FHIR para um estado antes de uma operação de importação específica importar determinados recursos FHIR.

Usar um arquivo de filtro

Por padrão, a PITR recupera todos os recursos FHIR em um armazenamento FHIR. Para recuperar recursos FHIR específicos, especifique os tipos de recursos e os respectivos IDs em um arquivo e faça upload do arquivo para o Cloud Storage. Especifique o local do arquivo no campo inputGcsObject.

Para ler um arquivo de filtro do Cloud Storage, conceda permissões à conta de serviço do Agente de serviço do Cloud Healthcare. Para mais informações, consulte Ler arquivos de filtro do Cloud Storage.

O arquivo de filtro pode ter qualquer extensão. Ele precisa usar o esquema a seguir, com um recurso FHIR por linha:

FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID

Por exemplo, para recuperar um recurso paciente com o ID 8f25b0ac e dois recursos de observação com os IDs d507417e90e e e9950d90e, especifique o seguinte no arquivo de filtro:

Patient/8f25b0ac
Observation/d507417e90e
Observation/e9950d90e

Usar funções personalizadas

A API Cloud Healthcare oferece as funções de filtragem personalizadas a seguir. É possível combinar as funções personalizadas com o campo rollbackTime para aplicar mais um filtro.

tag
Detalhes
Sintaxe da função
tag("system") = "code"
Descrição
Filtra recursos FHIR com base no elemento Meta.tag do recurso.
Argumentos
system
string
Um URL que faz referência a um sistema de código. Para mais informações, consulte Usar códigos em recursos.
code
string
Um valor que identifica um conceito conforme definido pelo sistema de código. Para mais informações, consulte Usar códigos em recursos.
extension_value_ts
Detalhes
Sintaxe da função
extension_value_ts("url")
Descrição
Filtra recursos FHIR com base no valor url em um elemento extension, em que url é um carimbo de data/hora Unix. Compatível com os seguintes operadores de comparação:
  • =
  • !=
  • <
  • >
  • <=
  • >=
Argumentos
url
string
O URL canônico de um recurso StructureDefinition que define uma extensão. Por exemplo, no elemento extension a seguir, o url é http://hl7.org/fhir/StructureDefinition/timezone:

"extension" : [{
  "url" : "http://hl7.org/fhir/StructureDefinition/timezone",
  "valueCode" : "America/New_York"
}]
Para ver mais informações, consulte Como definir extensões.

Filtrar por tipo de recurso FHIR

Para filtrar os recursos FHIR de maneira mais ampla com base apenas no tipo de recurso, especifique os tipos de recursos na matriz types[].

Filtrar por tipo de operação

Para filtrar recursos FHIR que foram modificados por uma transação CREATE, UPDATE ou DELETE, especifique um valor no enum ChangeType.

Por exemplo, para recuperar apenas os recursos FHIR que foram excluídos, especifique o valor DELETE.

Se você especificar CHANGE_TYPE_UNSPECIFIED, ALL ou não especificar um valor, todos os recursos do FHIR serão recuperados.

Excluir recuperações anteriores

Para excluir recuperações anteriores ao recuperar recursos FHIR, defina o campo excludeRollbacks como true. É possível excluir recuperações anteriores se as recuperaçãos funcionaram corretamente e você não quer substituir as alterações. Também é possível executar várias recuperações com carimbos de data/hora sobrepostos.

Pense no seguinte cenário:

  1. Em 1:00, você inicia uma recuperação com o carimbo de data/hora definido como 0:01. Em 2:00, a operação de recuperação exclui os recursos Patient/1 e Patient/2 do paciente no armazenamento FHIR. A operação de recuperação termina às 3:00.
  2. Vários dias depois, você executa uma operação de recuperação com o carimbo de data/hora de recuperação definido como 1:00. Por padrão, executar a operação resultaria no seguinte:

    • Recriação incorreta dos recursos de paciente Patient/1 e Patient/2.
    • Recuperação correta dos recursos FHIR criados ou atualizados após 3:00.

Para excluir a operação de recuperação inicial que excluiu os recursos de paciente Patient/1 e Patient/2 e evitar recriá-los, defina excludeRollbacks como true.

Filtrar usando IDs de operação de longa duração (LRO, na sigla em inglês)

Se os recursos FHIR foram modificados por uma ou mais operações de longa duração (LROs, na sigla em inglês), é possível especificar os IDs da LRO no campo operationIds para recuperar os recursos modificados.

Consulte Como listar LROs para informações sobre como listar e visualizar IDs de LRO em um conjunto de dados da API Cloud Healthcare.

Repetir recursos FHIR que não foram recuperados na produção

Se alguns recursos FHIR falharem em uma recuperação de produção, é possível repetir a recuperação. Use o arquivo de saída de produção gerado para encontrar os recursos FHIR que falharam. Especifique os tipos desses recursos FHIR e os IDs deles em um arquivo de filtro e execute a recuperação novamente.

Toda vez que você executa uma recuperação, ela é idempotente se você usa a mesma configuração em cada solicitação e o carimbo de data/hora está dentro dos últimos 21 dias.

Limitações

  • A PITR não aplica a integridade referencial, independente da configuração disableReferentialIntegrity no armazenamento FHIR. A restauração de apenas alguns recursos FHIR pode deixar o armazenamento FHIR em um estado que viola a integridade referencial.

  • A PITR ignora a validação do perfil FHIR porque os recursos FHIR restaurados foram validados quando foram criados ou atualizados. Se a configuração do perfil de armazenamento FHIR for alterada, a PITR poderá deixar o armazenamento de FHIR em um estado que viole a validação do perfil.

  • Se o valor de rollbackTime preceder o momento em que um recurso FHIR foi excluído no armazenamento FHIR, o armazenamento FHIR precisa ter o enableUpdateCreate ativado ou o recurso não será recuperado.

  • É possível atualizar um armazenamento FHIR ou ler e gravar dados durante uma recuperação, mas talvez você veja resultados inesperados, dependendo do estágio de recuperação. Por exemplo, uma solicitação de leitura pode retornar uma combinação de recursos FHIR recuperados e não recuperados. Se você atualizar um recurso, a recuperação poderá substituir a atualização.

  • A PITR mantém o histórico de recursos do FHIR. Cada recurso restaurado recebe uma nova versão atual, e o histórico dele é mantido.