View a markdown version of this page

Agrupación de recursos del FHIR - AWS HealthLake

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Agrupación de recursos del FHIR

Un FHIR Bundle es un contenedor para una colección de recursos del FHIR. AWS HealthLake AWS HealthLake admite dos tipos de paquetes con diferentes comportamientos de procesamiento.

Batchlos paquetes procesan cada recurso de forma independiente. Si un recurso falla, los recursos restantes aún pueden funcionar correctamente. Cada operación se procesa de forma individual y el procesamiento continúa incluso cuando algunas operaciones fallan. Utilice paquetes por lotes para operaciones masivas en las que el éxito parcial sea aceptable, como cargar varios registros de pacientes no relacionados.

Transactionlos paquetes procesan todos los recursos de forma atómica como una sola unidad. O bien todas las operaciones de recursos se realizan correctamente o no AWS HealthLake se compromete ninguna de ellas. Utilice paquetes de transacciones cuando necesite garantizar la integridad referencial de todos los recursos relacionados, por ejemplo, al crear un paciente con observaciones y afecciones relacionadas en las que todos los datos se deben registrar juntos.

Diferencias entre los paquetes de lotes y de transacciones
Característica Lote Transacción
Modelo de procesamiento Cada operación tiene éxito o falla de forma independiente. Todas las operaciones se realizan correctamente o fallan como una sola unidad atómica.
Administración de errores El procesamiento continúa incluso si las operaciones individuales fallan. Se produce un error en todo el paquete si se produce un error en una sola operación.
Orden de ejecución La orden de ejecución no está garantizada. Las operaciones se procesan en el orden especificado.
Integridad referencial No se aplica en todas las operaciones. Se aplica a los recursos de referencia local del paquete.
Más adecuado para Operaciones masivas en las que el éxito parcial es aceptable. Recursos relacionados que deben crearse o actualizarse de forma conjunta.

Puede agrupar recursos del FHIR del mismo tipo o de tipos diferentes, y estos pueden incluir una combinación de operaciones del FHIR, comocreate,, read updatedelete, y. patch Para obtener información adicional, consulte el paquete de recursos en la documentación del FHIR R4.

A continuación se muestran ejemplos de casos de uso para cada tipo de paquete.

Paquetes por lotes
  • Cargue varios registros de pacientes no relacionados de diferentes centros durante la sincronización de datos nocturna.

  • Cargue de forma masiva registros históricos de medicamentos cuando algunos registros puedan tener problemas de validación.

  • Cargue datos de referencia, como los de organizaciones y profesionales, cuando los errores individuales no afecten a otras entradas.

Paquetes de transacciones
  • Cree un paciente con observaciones y afecciones relacionadas durante el ingreso a un servicio de urgencias, donde todos los datos deben registrarse juntos.

  • Actualice la lista de medicamentos de un paciente y la información relacionada con las alergias, que deben ser coherentes.

  • Registra el encuentro completo con el paciente, las observaciones, los procedimientos y la información de facturación en una sola unidad atómica.

importante

Tanto los paquetes de lotes como los de transacciones utilizan la misma estructura Bundle de recursos. La única diferencia es el valor del type campo.

El siguiente ejemplo muestra un paquete de transacciones con varios tipos de recursos y operaciones.

{ "resourceType": "Bundle", "type": "transaction", "entry": [ { "fullUrl": "urn:uuid:4f6a30fb-cd3c-4ab6-8757-532101f72065", "resource": { "resourceType": "Patient", "id": "new-patient", "active": true, "name": [ { "family": "Johnson", "given": [ "Sarah" ] } ], "gender": "female", "birthDate": "1985-08-12", "telecom": [ { "system": "phone", "value": "555-123-4567", "use": "home" } ] }, "request": { "method": "POST", "url": "Patient" } }, { "fullUrl": "urn:uuid:7f83f473-d8cc-4a8d-86d3-9d9876a3248b", "resource": { "resourceType": "Observation", "id": "blood-pressure", "status": "final", "code": { "coding": [ { "system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel" } ], "text": "Blood pressure panel" }, "subject": { "reference": "urn:uuid:4f6a30fb-cd3c-4ab6-8757-532101f72065" }, "effectiveDateTime": "2023-10-15T09:30:00Z", "component": [ { "code": { "coding": [ { "system": "http://loinc.org", "code": "8480-6", "display": "Systolic blood pressure" } ] }, "valueQuantity": { "value": 120, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]" } }, { "code": { "coding": [ { "system": "http://loinc.org", "code": "8462-4", "display": "Diastolic blood pressure" } ] }, "valueQuantity": { "value": 80, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]" } } ] }, "request": { "method": "POST", "url": "Observation" } }, { "resource": { "resourceType": "Appointment", "id": "appointment-123", "status": "booked", "description": "Annual physical examination", "start": "2023-11-15T09:00:00Z", "end": "2023-11-15T09:30:00Z", "participant": [ { "actor": { "reference": "urn:uuid:4f6a30fb-cd3c-4ab6-8757-532101f72065" }, "status": "accepted" } ] }, "request": { "method": "PUT", "url": "Appointment/appointment-123" } }, { "request": { "method": "DELETE", "url": "MedicationRequest/med-request-456" } } ] }

Agrupar los recursos del FHIR como entidades independientes

Para agrupar los recursos del FHIR como entidades independientes

  1. Coleccionar HealthLake region y datastoreId valorar. Para obtener más información, consulte Obtención de propiedades de los almacenes de datos.

  2. Cree una URL para la solicitud utilizando los valores recopilados para HealthLake region ydatastoreId. No especifique un tipo de recurso FHIR en la URL. Para ver la ruta URL completa en el siguiente ejemplo, desplázate sobre el botón Copiar.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/
  3. Crea un cuerpo JSON para la solicitud especificando cada verbo HTTP como parte de los method elementos. En el siguiente ejemplo, se utiliza una interacción de batch tipos con el Bundle recurso para crear nuevos Patient Medication recursos. Todas las secciones obligatorias se comentan en consecuencia. Para este procedimiento, guarde el archivo comobatch-independent.json.

    { "resourceType": "Bundle", "id": "bundle-batch", "meta": { "lastUpdated": "2014-08-18T01:43:30Z" }, "type": "batch", "entry": [ { "resource": { "resourceType": "Patient", "meta": { "lastUpdated": "2022-06-03T17:53:36.724Z" }, "text": { "status": "generated", "div": "Some narrative" }, "active": true, "name": [ { "use": "official", "family": "Jackson", "given": [ "Mateo", "James" ] } ], "gender": "male", "birthDate": "1974-12-25" }, "request": { "method": "POST", "url": "Patient" } }, { "resource": { "resourceType": "Medication", "id": "med0310", "contained": [ { "resourceType": "Substance", "id": "sub03", "code": { "coding": [ { "system": "http://snomed.info/sct", "code": "55452001", "display": "Oxycodone (substance)" } ] } } ], "code": { "coding": [ { "system": "http://snomed.info/sct", "code": "430127000", "display": "Oral Form Oxycodone (product)" } ] }, "form": { "coding": [ { "system": "http://snomed.info/sct", "code": "385055001", "display": "Tablet dose form (qualifier value)" } ] }, "ingredient": [ { "itemReference": { "reference": "#sub03" }, "strength": { "numerator": { "value": 5, "system": "http://unitsofmeasure.org", "code": "mg" }, "denominator": { "value": 1, "system": "http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm", "code": "TAB" } } } ] }, "request": { "method": "POST", "url": "Medication" } } ] }
  4. Envíe la solicitud . El tipo de Bundle lote FHIR utiliza una POST solicitud con la autorización AWS Signature Version 4 o SMART on FHIR. En el siguiente ejemplo de código, se utiliza la herramienta de línea de curl comandos con fines de demostración.

    SigV4

    Autorización SigV4

    curl --request POST \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/' \ --aws-sigv4 'aws:amz:region:healthlake' \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ --header "x-amz-security-token:$AWS_SESSION_TOKEN" \ --header 'Accept: application/json' \ --data @batch-type.json
    SMART on FHIR

    Ejemplo de autorización SMART on FHIR para el tipo de IdentityProviderConfiguration datos.

    { "AuthorizationStrategy": "SMART_ON_FHIR", "FineGrainedAuthorizationEnabled": true, "IdpLambdaArn": "arn:aws:lambda:your-region:your-account-id:function:your-lambda-name", "Metadata": "{\"issuer\":\"https://ehr.example.com\", \"jwks_uri\":\"https://ehr.example.com/.well-known/jwks.json\",\"authorization_endpoint\":\"https://ehr.example.com/auth/authorize\",\"token_endpoint\":\"https://ehr.token.com/auth/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\",\"foo\"],\"grant_types_supported\":[\"client_credential\",\"foo\"],\"registration_endpoint\":\"https://ehr.example.com/auth/register\",\"scopes_supported\":[\"openId\",\"profile\",\"launch\"],\"response_types_supported\":[\"code\"],\"management_endpoint\":\"https://ehr.example.com/user/manage\",\"introspection_endpoint\":\"https://ehr.example.com/user/introspect\",\"revocation_endpoint\":\"https://ehr.example.com/user/revoke\",\"code_challenge_methods_supported\":[\"S256\"],\"capabilities\":[\"launch-ehr\",\"sso-openid-connect\",\"client-public\",\"permission-v2\"]}" }

    La persona que llama puede asignar permisos en la lambda de autorización. Para obtener más información, consulte Alcances OAuth 2.0.

    El servidor devuelve una respuesta que muestra los Medication recursos Patient y los recursos creados como resultado de la solicitud de tipo de Bundle lote.

Las PUT condicionales en paquetes

AWS HealthLake admite actualizaciones condicionales dentro de paquetes mediante los siguientes parámetros de consulta:

nota

Las PUT condicionales solo se admiten en batch paquetes. Transactionlos paquetes no admiten PUT condicionales.

  • _id(independiente)

  • _iden combinación con una de las siguientes opciones:

    • _tag

    • createdAt

    • _lastUpdated

Al usar PUT condicionales en paquetes, AWS HealthLake evalúa los parámetros de la consulta comparándolos con los recursos existentes y toma medidas en función de los resultados de las coincidencias.

Comportamiento de actualización condicional
Escenario Estado HTTP Acción tomada
Recurso sin identificación proporcionada 201 Creado Crea siempre un nuevo recurso.
Recurso con un nuevo identificador (no coincide) 201 Creado Crea un nuevo recurso con el ID especificado.
Recurso con un ID existente (coincidencia única) 200 OK Actualiza el recurso coincidente.
Recurso con un identificador existente (se ha detectado un conflicto) Conflicto, 409 Devuelve un error. No se realiza ningún cambio.
Recurso con un identificador existente (el identificador no coincide) 400: solicitud maligna Devuelve un error. No se realiza ningún cambio.
Varios recursos cumplen las condiciones Condición previa con error, 412 Devuelve un error. No se realiza ningún cambio.

En el siguiente paquete de ejemplo con una actualización condicional, el Patient recurso con el identificador FHIR solo se 476 actualiza si _lastUpdated=lt2025-04-20 se cumple la condición.

{ "resourceType": "Bundle", "id": "bundle-batch", "meta": { "lastUpdated": "2014-08-18T01:43:30Z" }, "type": "batch", "entry": [ { "resource": { "resourceType": "Patient", "id": "476", "meta": { "lastUpdated": "2022-06-03T17:53:36.724Z" }, "active": true, "name": [ { "use": "official", "family": "Jackson", "given": [ "Mateo", "James" ] } ], "gender": "male", "birthDate": "1974-12-25" }, "request": { "method": "PUT", "url": "Patient?_id=476&_lastUpdated=lt2025-04-20" } }, { "resource": { "resourceType": "Medication", "id": "med0310", "contained": [ { "resourceType": "Substance", "id": "sub03", "code": { "coding": [ { "system": "http://snomed.info/sct", "code": "55452001", "display": "Oxycodone (substance)" } ] } } ], "code": { "coding": [ { "system": "http://snomed.info/sct", "code": "430127000", "display": "Oral Form Oxycodone (product)" } ] }, "form": { "coding": [ { "system": "http://snomed.info/sct", "code": "385055001", "display": "Tablet dose form (qualifier value)" } ] }, "ingredient": [ { "itemReference": { "reference": "#sub03" }, "strength": { "numerator": { "value": 5, "system": "http://unitsofmeasure.org", "code": "mg" }, "denominator": { "value": 1, "system": "http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm", "code": "TAB" } } } ] }, "request": { "method": "POST", "url": "Medication" } } ] }

Agrupar los recursos del FHIR como una sola entidad

Para agrupar los recursos del FHIR como una sola entidad

  1. Coleccionar HealthLake region y datastoreId valorar. Para obtener más información, consulte Obtención de propiedades de los almacenes de datos.

  2. Cree una URL para la solicitud utilizando los valores recopilados para HealthLake region ydatastoreId. Incluya el tipo de recurso FHIR Bundle como parte de la URL. Para ver la ruta URL completa en el siguiente ejemplo, desplázate sobre el botón Copiar.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Bundle
  3. Crea un cuerpo JSON para la solicitud, especificando los recursos del FHIR que quieres agrupar. El siguiente ejemplo agrupa dos Patient recursos. HealthLake Para este procedimiento, guarde el archivo comobatch-single.json.

    { "resourceType": "Bundle", "id": "bundle-minimal", "language": "en-US", "identifier": { "system": "urn:oid:1.2.3.4.5", "value": "28b95815-76ce-457b-b7ae-a972e527db4f" }, "type": "document", "timestamp": "2020-12-11T14:30:00+01:00", "entry": [ { "fullUrl": "urn:uuid:f40b07e3-37e8-48c3-bf1c-ae70fe12dabf", "resource": { "resourceType": "Composition", "id": "f40b07e3-37e8-48c3-bf1c-ae70fe12dabf", "status": "final", "type": { "coding": [ { "system": "http://loinc.org", "code": "60591-5", "display": "Patient summary Document" } ] }, "date": "2020-12-11T14:30:00+01:00", "author": [ { "reference": "urn:uuid:45271f7f-63ab-4946-970f-3daaaa0663ff" } ], "title": "Patient Summary as of December 7, 2020 14:30" } }, { "fullUrl": "urn:uuid:45271f7f-63ab-4946-970f-3daaaa0663ff", "resource": { "resourceType": "Practitioner", "id": "45271f7f-63ab-4946-970f-3daaaa0663ff", "active": true, "name": [ { "family": "Doe", "given": [ "John" ] } ] } } ] }
  4. Envíe la solicitud . El tipo de Bundle documento FHIR utiliza una POST solicitud con el protocolo de AWS firma Signature Version 4. En el siguiente ejemplo de código, se utiliza la herramienta de línea de curl comandos con fines de demostración.

    SigV4

    Autorización SigV4

    curl --request POST \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Bundle' \ --aws-sigv4 'aws:amz:region:healthlake' \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ --header "x-amz-security-token:$AWS_SESSION_TOKEN" \ --header 'Accept: application/json' \ --data @document-type.json
    SMART on FHIR

    Ejemplo de autorización SMART on FHIR para el tipo de IdentityProviderConfiguration datos.

    { "AuthorizationStrategy": "SMART_ON_FHIR", "FineGrainedAuthorizationEnabled": true, "IdpLambdaArn": "arn:aws:lambda:your-region:your-account-id:function:your-lambda-name", "Metadata": "{\"issuer\":\"https://ehr.example.com\", \"jwks_uri\":\"https://ehr.example.com/.well-known/jwks.json\",\"authorization_endpoint\":\"https://ehr.example.com/auth/authorize\",\"token_endpoint\":\"https://ehr.token.com/auth/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\",\"foo\"],\"grant_types_supported\":[\"client_credential\",\"foo\"],\"registration_endpoint\":\"https://ehr.example.com/auth/register\",\"scopes_supported\":[\"openId\",\"profile\",\"launch\"],\"response_types_supported\":[\"code\"],\"management_endpoint\":\"https://ehr.example.com/user/manage\",\"introspection_endpoint\":\"https://ehr.example.com/user/introspect\",\"revocation_endpoint\":\"https://ehr.example.com/user/revoke\",\"code_challenge_methods_supported\":[\"S256\"],\"capabilities\":[\"launch-ehr\",\"sso-openid-connect\",\"client-public\",\"permission-v2\"]}" }

    La persona que llama puede asignar permisos en la lambda de autorización. Para obtener más información, consulte Alcances OAuth 2.0.

    El servidor devuelve una respuesta que muestra dos Patient recursos creados como resultado de la solicitud de tipo de Bundle documento.

Configurar el nivel de validación de los paquetes

Al agrupar los recursos del FHIR, si lo desea, puede especificar un encabezado x-amzn-healthlake-fhir-validation-level HTTP para configurar un nivel de validación para el recurso. Este nivel de validación se establecerá para todas las solicitudes de creación y actualización del paquete. AWS HealthLake actualmente admite los siguientes niveles de validación:

  • strict: Los recursos se validan según el elemento de perfil del recurso o según la especificación R4 si no hay ningún perfil. Este es el nivel de validación predeterminado para AWS HealthLake.

  • structure-only: Los recursos se validan con R4, ignorando los perfiles a los que se hace referencia.

  • minimal: Los recursos se validan mínimamente, ignorando ciertas reglas de R4. Los recursos que no superen las comprobaciones de estructura necesarias se search/analytics actualizarán para incluir una advertencia de auditoría.

Los recursos incluidos con el nivel de validación mínimo se pueden incorporar a un almacén de datos a pesar de no superar la validación necesaria para la indexación de las búsquedas. En este caso, los recursos se actualizarán para incluir una extensión específica de Healthlake que documente dichas fallas, y las entradas de la respuesta del paquete incluirán los recursos de la siguiente manera: OperationOutcome

{ "resourceType": "Bundle", "type": "batch-response", "timestamp": "2025-08-25T22:58:48.846287342Z", "entry": [ { "response": { "status": "201", "location": "Patient/195abc49-ba8e-4c8b-95c2-abc88fef7544/_history/1", "etag": "W/\"1\"", "lastModified": "2025-08-25T22:58:48.801245445Z", "outcome": { "resourceType": "OperationOutcome", "issue": [ { "severity": "error", "code": "processing", "details": { "text": "FHIR resource in payload failed FHIR validation rules." }, "diagnostics": "FHIR resource in payload failed FHIR validation rules." } ] } } } ] }

Además, se incluirá el siguiente encabezado de respuesta HTTP con el valor «true»:

x-amzn-healthlake-validation-issues : true
nota

Tenga en cuenta que es posible que los datos ingeridos que estén mal formados de acuerdo con la especificación R4 no se puedan buscar de la manera esperada si se presentan estos errores.

Soporte limitado para el tipo de paquete «mensaje»

HealthLake proporciona soporte limitado para el tipo de paquete FHIR message mediante un proceso de conversión interno. Esta compatibilidad está diseñada para situaciones en las que los paquetes de mensajes no se pueden formatear en su origen, por ejemplo, cuando se ingieren canales ADT (admisión, alta y transferencia) de sistemas hospitalarios antiguos.

aviso

Esta función requiere la inclusión explícita de AWS cuentas permitidas y no exige la semántica de los mensajes del FHIR R4 ni su integridad referencial. Ponte en contacto con AWS el equipo de soporte para solicitar la habilitación de tu cuenta antes de usar los paquetes de mensajes.

Diferencias clave con respecto al procesamiento de mensajes estándar

  • Paquetes de mensajes (especificación FHIR): la primera entrada debe ser una MessageHeader que haga referencia a otros recursos. Los recursos carecen de request objetos individuales y el MessageHeader evento determina las acciones de procesamiento.

  • HealthLake Procesamiento: convierte los paquetes de mensajes en paquetes por lotes mediante la asignación automática de operaciones PUT a cada entrada de recurso. Los recursos se procesan de forma independiente sin imponer la semántica de los mensajes ni la integridad referencial.

Limitaciones importantes

  • Las reglas de Message-specific procesamiento del FHIR R4 no se aplican

  • No hay integridad transaccional en todos los recursos

  • Inter-resource las referencias no están validadas

  • Requiere una lista explícita de permisos de cuentas

Ejemplo de estructura de paquetes de mensajes

{ "resourceType": "Bundle", "type": "message", "entry": [ { "resource": { "resourceType": "MessageHeader", "eventCoding": { "system": "http://hl7.org/fhir/us/davinci-alerts/CodeSystem/notification-event", "code": "notification-admit" }, "focus": [{"reference": "Encounter/example-id"}] } }, { "resource": {"resourceType": "Patient", "id": "example-id"} }, { "resource": {"resourceType": "Encounter", "id": "example-id"} } ] }
nota

Cada recurso se almacena de forma independiente, como si se hubiera enviado mediante operaciones PUT individuales. Si se requiere una validación completa de la semántica de la mensajería o de la integridad referencial del FHIR, procese previamente los paquetes de mensajes o implemente la validación a nivel de aplicación antes de enviarlos.

Transacciones de paquetes asincrónicas

AWS HealthLake admite el Bundle tipo asincrónico transaction que le permite enviar transacciones con hasta 500 recursos. Cuando envías una transacción asincrónica, la pones en HealthLake cola para su procesamiento e inmediatamente devuelve una URL de sondeo. Puedes usar esta URL para comprobar el estado y recuperar la respuesta. Sigue el patrón de paquetes asíncronos del FHIR.

Cuándo usar transacciones asincrónicas

  • Debes enviar más de 100 recursos (límite sincrónico) en una sola transacción.

  • Quieres evitar bloquear tu solicitud mientras esperas a que finalice el procesamiento de la transacción.

  • Necesita procesar grandes volúmenes de recursos relacionados con un mejor rendimiento.

importante

Los resultados de las encuestas están disponibles durante 90 días después de que se complete la transacción. Transcurrido este período de 90 días, la URL de la encuesta ya no arroja resultados. Diseñe su integración para recuperar y almacenar los resultados en esta ventana.

nota

El Bundle tipo sincrónico transaction sigue admitiendo hasta 100 recursos y es el modo de procesamiento predeterminado. Si envía un Bundle tipo transaction con más de 100 recursos sin el Prefer: respond-async encabezado, HealthLake devuelve un 422 Unprocessable Entity error. Los paquetes con tipos no batch se admiten para el procesamiento asincrónico; solo los Bundle tipos se transaction pueden enviar de forma asincrónica (con un máximo de 500 operaciones).

nota

PATCHlas operaciones y las PUT condicionales no se admiten en las transacciones de paquetes asincrónicas.

Enviar una transacción asincrónica

Para enviar una transacción asincrónica, envíe una POST solicitud al punto final del almacén de datos con el encabezado. Prefer: respond-async El paquete debe tener un tipo. transaction Los lotes con tipo no batch son compatibles con el procesamiento asincrónico de paquetes.

HealthLake realiza las validaciones iniciales del paquete en el momento del envío. Si la validación se realiza correctamente, HealthLake devuelve HTTP 202 Accepted con un encabezado de content-location respuesta que contiene la URL de la encuesta.

Para enviar una transacción de tipo paquete asincrónica

  1. Envíe una POST solicitud al punto final del almacén de HealthLake datos.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/
  2. Crea un cuerpo JSON para la solicitud con el tipo de paquetetransaction. Para este procedimiento, guarde el archivo comoasync-transaction.json.

    { "resourceType": "Bundle", "type": "transaction", "entry": [ { "resource": { "resourceType": "Patient", "active": true, "name": [ { "use": "official", "family": "Smith", "given": ["Jane"] } ], "gender": "female", "birthDate": "1990-01-15" }, "request": { "method": "POST", "url": "Patient" } }, { "resource": { "resourceType": "Observation", "status": "final", "code": { "coding": [ { "system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel" } ] }, "subject": { "reference": "urn:uuid:example-patient-id" } }, "request": { "method": "POST", "url": "Observation" } } ] }
  3. Envíe la solicitud con el Prefer: respond-async encabezado. El tipo de Bundle transacción del FHIR utiliza una POST solicitud con la autorización AWS Signature Version 4 o SMART on FHIR. El siguiente ejemplo de código utiliza la herramienta de línea de curl comandos con fines de demostración.

    SigV4

    Autorización SigV4

    curl --request POST \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/' \ --aws-sigv4 'aws:amz:region:healthlake' \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ --header "x-amz-security-token:$AWS_SESSION_TOKEN" \ --header 'Accept: application/json' \ --header 'Prefer: respond-async' \ --data @async-transaction.json
    SMART on FHIR

    Ejemplo de autorización SMART on FHIR para el tipo de IdentityProviderConfiguration datos.

    { "AuthorizationStrategy": "SMART_ON_FHIR", "FineGrainedAuthorizationEnabled": true, "IdpLambdaArn": "arn:aws:lambda:your-region:your-account-id:function:your-lambda-name", "Metadata": "{\"issuer\":\"https://ehr.example.com\", \"jwks_uri\":\"https://ehr.example.com/.well-known/jwks.json\",\"authorization_endpoint\":\"https://ehr.example.com/auth/authorize\",\"token_endpoint\":\"https://ehr.token.com/auth/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_basic\",\"foo\"],\"grant_types_supported\":[\"client_credential\",\"foo\"],\"registration_endpoint\":\"https://ehr.example.com/auth/register\",\"scopes_supported\":[\"openId\",\"profile\",\"launch\"],\"response_types_supported\":[\"code\"],\"management_endpoint\":\"https://ehr.example.com/user/manage\",\"introspection_endpoint\":\"https://ehr.example.com/user/introspect\",\"revocation_endpoint\":\"https://ehr.example.com/user/revoke\",\"code_challenge_methods_supported\":[\"S256\"],\"capabilities\":[\"launch-ehr\",\"sso-openid-connect\",\"client-public\",\"permission-v2\"]}" }

    La persona que llama puede asignar permisos en la lambda de autorización. Para obtener más información, consulte Alcances OAuth 2.0.

  4. Si el envío se realiza correctamente, el servidor devuelve HTTP 202 Accepted. El encabezado de la content-location respuesta contiene la URL de la encuesta. El cuerpo de la respuesta es un OperationOutcome recurso.

    HTTP/1.1 202 Accepted content-location: https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Transaction/transactionId
    { "resourceType": "OperationOutcome", "issue": [ { "severity": "information", "code": "informational", "diagnostics": "Submitted Asynchronous Bundle Transaction", "location": [ "https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Transaction/transactionId" ] } ] }

Sondeo para conocer el estado de la transacción

Después de enviar una transacción asincrónica, usa la URL de sondeo que aparece en el encabezado de la content-location respuesta para comprobar el estado de la transacción. Envía una GET solicitud a la URL de la encuesta.

nota

En el caso de los almacenes de datos compatibles con SMART en FHIR, el token de autorización debe incluir read permisos sobre el tipo de Transaction recurso para consultar el estado de la transacción. Para obtener más información sobre SMART en los ámbitos del FHIR, consulte. Los osciloscopios OAuth 2.0 SMART on FHIR son compatibles con HealthLake

Envíe una GET solicitud a la URL de la encuesta. En el siguiente ejemplo, se utiliza la herramienta de línea de curl comandos.

SigV4

Autorización SigV4

curl --request GET \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Transaction/transactionId' \ --aws-sigv4 'aws:amz:region:healthlake' \ --user "$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY" \ --header "x-amz-security-token:$AWS_SESSION_TOKEN" \ --header 'Accept: application/json'
SMART on FHIR

Autorización SMART on FHIR. El token de autorización debe incluir read los permisos sobre el tipo Transaction de recurso.

curl --request GET \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Transaction/transactionId' \ --header 'Authorization: Bearer $SMART_ACCESS_TOKEN' \ --header 'Accept: application/json'

En la tabla siguiente se describen las posibles respuestas.

Códigos de respuesta al sondeo
Estado HTTP Significado Cuerpo de respuesta
202: aceptada La transacción está en cola OperationOutcomecon el diagnóstico «ENVIADO»
202: aceptada La transacción se está procesando OperationOutcomecon el diagnóstico «IN_PROGRESS»
200 OK La transacción se completó correctamente Bundlecon tipo transaction-response
4xx/5xx Fallo en la transacción OperationOutcomecon detalles del error

Los siguientes ejemplos muestran cada tipo de respuesta.

Transacción en cola (202)

{ "resourceType": "OperationOutcome", "id": "transactionId", "issue": [ { "severity": "information", "code": "informational", "diagnostics": "SUBMITTED" } ] }
Procesamiento de transacciones (202)

{ "resourceType": "OperationOutcome", "id": "transactionId", "issue": [ { "severity": "information", "code": "informational", "diagnostics": "IN_PROGRESS" } ] }
Transacción completada (200)

{ "resourceType": "Bundle", "type": "transaction-response", "entry": [ { "response": { "status": "201", "location": "Patient/example-id/_history/1", "etag": "W/\"1\"", "lastModified": "2024-01-15T10:30:00.000Z" } }, { "response": { "status": "201", "location": "Observation/example-id/_history/1", "etag": "W/\"1\"", "lastModified": "2024-01-15T10:30:00.000Z" } } ] }
Transacción fallida (4xx/5xx)

{ "resourceType": "OperationOutcome", "issue": [ { "severity": "error", "code": "exception", "diagnostics": "Transaction failed: conflict detected on resource Patient/example-id" } ] }

Procesando el pedido

Los paquetes asincrónicos de este tipo transaction están en cola, pero no se procesan siguiendo un orden de envío estricto. HealthLake optimiza el procesamiento en función de la capacidad disponible y la carga del sistema.

importante

No dependa de que las transacciones se procesen en el orden en que se enviaron. Por ejemplo, si envías la transacción A a las 10:00 a. m. y la transacción B a las 10:01 a. m., la transacción B podría completarse antes que la transacción A. Diseñe su solicitud para:

  • Gestione la finalización de los pedidos pendientes.

  • Usa la URL de sondeo para rastrear cada transacción de forma independiente.

  • Implemente la secuenciación a nivel de aplicación si el orden es importante para su caso de uso.

Cuotas y limitaciones

Las siguientes cuotas y límites de velocidad se aplican a las transacciones asincrónicas.

Cuotas de transacciones asincrónicas
Cuota Valor Ajustable
Máximo de operaciones por transacción asincrónica 500 No
Número máximo de transacciones pendientes por almacén de datos 500
  • Las transacciones asincrónicas comparten los mismos límites de velocidad de API definidos en. Cuotas de servicio

  • La consulta del estado de las transacciones comparte los mismos límites de velocidad de API que las operaciones de lectura (GET) en los recursos del FHIR.

  • Si se alcanza el límite de transacciones pendientes, los envíos posteriores arrojan un error hasta que se completen las transacciones existentes.

Gestión de errores

En el caso de un paquete de «transacciones», todos los recursos del FHIR contenidos en el paquete se procesan como una operación atómica. Todos los recursos de la operación deben realizarse correctamente o no se procesará ninguna operación del paquete.

Los errores se clasifican en dos categorías: los errores de envío, que se HealthLake devuelven de forma sincrónica, y los errores de procesamiento, que se recuperan mediante sondeos.

Errores de envío

HealthLake valida el paquete en el momento del envío y devuelve los errores de forma sincrónica antes de que la transacción pase a la cola. Entre los errores de envío se incluyen los errores de validación de recursos del FHIR no válidos, los tipos de recursos no admitidos, la superación del límite de 500 operaciones y el uso del encabezado con los Prefer: respond-async paquetes por lotes. Si se ha alcanzado el límite de transacciones pendientes del banco de datos, HealthLake devuelve un. ThrottlingException Cuando se produce un error de envío, la transacción no se pondrá en cola.

Errores de procesamiento

Los errores de procesamiento se producen después de que la transacción se haya puesto en cola y se devuelven a través de la URL de sondeo. Estos incluyen los conflictos de transacciones, en los que otra operación modificó un recurso que forma parte de la transacción, y los errores del servidor durante el procesamiento. Cuando se produce un error de procesamiento, no se produce ninguna mutación en los recursos de la transacción. La URL de sondeo devolverá una OperationOutcome con los detalles del error.