View a markdown version of this page

Regroupement des ressources FHIR - AWS HealthLake

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Regroupement des ressources FHIR

Un FHIR Bundle est un conteneur contenant une collection de ressources FHIR. AWS HealthLake AWS HealthLake prend en charge deux types de bundles avec des comportements de traitement différents.

Batchles bundles traitent chaque ressource indépendamment. Si l'une des ressources échoue, les ressources restantes peuvent toujours réussir. Chaque opération est traitée individuellement et le traitement se poursuit même en cas d'échec de certaines opérations. Utilisez des lots pour les opérations groupées où un succès partiel est acceptable, comme le téléchargement de plusieurs dossiers de patients indépendants.

Transactionles bundles traitent toutes les ressources de manière atomique comme une seule unité. Soit toutes les opérations sur les ressources réussissent, soit aucune d' AWS HealthLake entre elles n'est validée. Utilisez des ensembles de transactions lorsque vous avez besoin de garantir l'intégrité référentielle des ressources connexes, par exemple pour créer un patient présentant des observations et des affections connexes où toutes les données doivent être enregistrées ensemble.

Différences entre les lots et les ensembles de transactions
Fonctionnalité Par lots Transaction
Modèle de traitement Chaque opération réussit ou échoue indépendamment. Toutes les opérations réussissent ou échouent en tant qu'unité atomique unique.
Gestion des défaillances Le traitement se poursuit même en cas d'échec des opérations individuelles. L'ensemble échoue en cas d'échec d'une seule opération.
Ordre d'exécution L'ordre d'exécution n'est pas garanti. Les opérations sont traitées dans l'ordre indiqué.
Intégrité référentielle Non appliqué dans toutes les opérations. Appliqué pour les ressources référencées localement au sein du bundle.
Utiliser en priorité pour Opérations groupées pour lesquelles un succès partiel est acceptable. Ressources connexes qui doivent être créées ou mises à jour ensemble.

Vous pouvez regrouper des ressources FHIR de types identiques ou différents, et elles peuvent inclure une combinaison d'opérations FHIR, telles quecreate,, read updatedelete, et. patch Pour plus d'informations, consultez le pack de ressources dans la documentation du FHIR R4.

Voici des exemples de cas d'utilisation pour chaque type de bundle.

Packs Batch
  • Téléchargez plusieurs dossiers de patients indépendants provenant de différents établissements lors de la synchronisation nocturne des données.

  • Téléchargez en masse l'historique des médicaments lorsque certains dossiers peuvent présenter des problèmes de validation.

  • Chargez des données de référence, telles que les organisations et les professionnels, où les défaillances individuelles n'affectent pas les autres entrées.

Packs de transactions
  • Créez un patient présentant des observations et des affections connexes lors d'une admission au service des urgences, où toutes les données doivent être enregistrées ensemble.

  • Mettez à jour la liste des médicaments d'un patient et les informations connexes sur les allergies qui doivent rester cohérentes.

  • Enregistrez une rencontre complète avec le patient, les observations, les procédures et les informations de facturation dans une seule unité atomique.

Important

Les ensembles de lots et de transactions utilisent la même structure de Bundle ressources. La seule différence réside dans la valeur du type champ.

L'exemple suivant montre un ensemble de transactions comprenant plusieurs types de ressources et opérations.

{ "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" } } ] }

Regrouper les ressources du FHIR en tant qu'entités indépendantes

Regrouper les ressources FHIR en tant qu'entités indépendantes

  1. Collectez HealthLake region et datastoreId valorisez. Pour de plus amples informations, veuillez consulter Obtenir les propriétés du magasin de données.

  2. Créez une URL pour la demande en utilisant les valeurs collectées pour HealthLake region etdatastoreId. Ne spécifiez pas de type de ressource FHIR dans l'URL. Pour afficher le chemin complet de l'URL dans l'exemple suivant, faites défiler le curseur sur le bouton Copier.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/
  3. Construisez un corps JSON pour la demande, en spécifiant chaque verbe HTTP comme faisant partie des method éléments. L'exemple suivant utilise une interaction batch de type avec la Bundle ressource pour créer de nouvelles Medication ressources Patient et. Toutes les sections requises sont commentées en conséquence. Dans le cadre de cette procédure, enregistrez le fichier sousbatch-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. Envoyez la demande . Le type de Bundle lot FHIR utilise une POST demande avec AWS signature version 4 ou SMART sur autorisation FHIR. L'exemple de code suivant utilise l'outil de ligne de curl commande à des fins de démonstration.

    SigV4

    Autorisation 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

    Exemple d'autorisation SMART sur FHIR pour le type de IdentityProviderConfigurationdonnées.

    { "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\"]}" }

    L'appelant peut attribuer des autorisations dans le lambda d'autorisation. Pour de plus amples informations, veuillez consulter OAuth Éscopes 2.0.

    Le serveur renvoie une réponse indiquant les Medication ressources Patient et créées à la suite de la demande de type de Bundle lot.

Conditionnel PUTs en lots

AWS HealthLake prend en charge les mises à jour conditionnelles au sein des bundles à l'aide des paramètres de requête suivants :

  • _id(autonome)

  • _iden combinaison avec l'un des éléments suivants :

    • _tag

    • _createdAt

    • _lastUpdated

Lorsque vous utilisez le conditionnel PUTs dans les bundles, vous AWS HealthLake évaluez les paramètres de requête par rapport aux ressources existantes et prenez des mesures en fonction des résultats du match.

Comportement des mises à jour
Scénario Statut HTTP Mesures prises
Ressource sans identifiant fourni 201 créés Crée toujours une nouvelle ressource.
Ressource avec un nouvel identifiant (aucune correspondance) 201 créés Crée une nouvelle ressource avec l'ID spécifié.
Ressource avec identifiant existant (correspondance unique) 200 OK Met à jour la ressource correspondante.
Ressource avec identifiant existant (conflit détecté) 409 – Conflit Renvoie une erreur. Aucune modification n'est apportée.
Ressource avec ID existant (ID non concordant) 400 Requête erronée Renvoie une erreur. Aucune modification n'est apportée.
Plusieurs ressources correspondent aux conditions 412 – Échec de condition préalable Renvoie une erreur. Aucune modification n'est apportée.

Dans l'exemple de bundle suivant avec une mise à jour conditionnelle, la Patient ressource avec un identifiant FHIR est mise 476 à jour uniquement si la condition _lastUpdated=lt2025-04-20 est remplie.

{ "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" } } ] }

Regroupement des ressources FHIR en une seule entité

Regrouper les ressources FHIR en une seule entité

  1. Collectez HealthLake region et datastoreId valorisez. Pour de plus amples informations, veuillez consulter Obtenir les propriétés du magasin de données.

  2. Créez une URL pour la demande en utilisant les valeurs collectées pour HealthLake region etdatastoreId. Incluez le type Bundle de ressource FHIR dans l'URL. Pour afficher le chemin complet de l'URL dans l'exemple suivant, faites défiler le curseur sur le bouton Copier.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Bundle
  3. Construisez un corps JSON pour la demande, en spécifiant les ressources FHIR à regrouper. L'exemple suivant regroupe deux Patient ressources dans HealthLake. Dans le cadre de cette procédure, enregistrez le fichier sousbatch-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. Envoyez la demande . Le type de Bundle document FHIR utilise une POST demande avec le protocole de AWS signature Signature Version 4. L'exemple de code suivant utilise l'outil de ligne de curl commande à des fins de démonstration.

    SigV4

    Autorisation 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

    Exemple d'autorisation SMART sur FHIR pour le type de IdentityProviderConfigurationdonnées.

    { "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\"]}" }

    L'appelant peut attribuer des autorisations dans le lambda d'autorisation. Pour de plus amples informations, veuillez consulter OAuth Éscopes 2.0.

    Le serveur renvoie une réponse indiquant deux Patient ressources créées suite à la demande de type de Bundle document.

Configuration du niveau de validation pour les bundles

Lorsque vous regroupez des ressources FHIR, vous pouvez éventuellement spécifier un en-tête x-amzn-healthlake-fhir-validation-level HTTP pour configurer un niveau de validation pour la ressource. Ce niveau de validation sera défini pour toutes les demandes de création et de mise à jour du bundle. AWS HealthLake prend actuellement en charge les niveaux de validation suivants :

  • strict: Les ressources sont validées en fonction de l'élément de profil de la ressource ou de la spécification R4 si aucun profil n'est présent. Il s'agit du niveau de validation par défaut pour AWS HealthLake.

  • structure-only: Les ressources sont validées par rapport à R4, en ignorant les profils référencés.

  • minimal: Les ressources sont validées de manière minimale, sans tenir compte de certaines règles R4. Les ressources qui échouent aux vérifications de structure requises search/analytics seront mises à jour pour inclure un avertissement d'audit.

Les ressources groupées avec le niveau de validation minimal peuvent être ingérées dans une banque de données malgré l'échec de la validation requise pour l'indexation des recherches. Dans ce cas, les ressources seront mises à jour pour inclure une extension spécifique à Healthlake afin de documenter ces échecs, et les entrées de la réponse du bundle incluront les OperationOutcome ressources suivantes :

{ "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." } ] } } } ] }

En outre, l'en-tête de réponse HTTP suivant sera inclus avec la valeur « true » :

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

Notez que les données ingérées qui sont mal formées conformément à la spécification R4 peuvent ne pas être consultables comme prévu si ces erreurs sont présentes.

Support limité pour le type « message » de type Bundle

HealthLake fournit un support limité pour le type de bundle FHIR message par le biais d'un processus de conversion interne. Cette prise en charge est conçue pour les scénarios dans lesquels les ensembles de messages ne peuvent pas être reformatés à la source, tels que l'ingestion de flux ADT (admission, sortie, transfert) provenant des anciens systèmes hospitaliers.

Avertissement

Cette fonctionnalité nécessite une liste explicite des AWS comptes autorisés et n'applique pas la sémantique des messages FHIR R4 ni l'intégrité référentielle. Contactez AWS le Support pour demander l'activation de votre compte avant d'utiliser des ensembles de messages.

Principales différences par rapport au traitement standard des messages

  • Ensembles de messages (spécification FHIR) : La première entrée doit être une MessageHeader qui fait référence à d'autres ressources. Les ressources ne disposent pas request d'objets individuels, et l' MessageHeader événement détermine les actions de traitement.

  • HealthLake Traitement : convertit les ensembles de messages en ensembles par lots en affectant automatiquement des opérations PUT à chaque entrée de ressource. Les ressources sont traitées indépendamment sans appliquer la sémantique des messages ou l'intégrité référentielle.

Limitations importantes

  • FHIR R4 Les règles de traitement spécifiques aux messages ne sont pas appliquées

  • Aucune intégrité transactionnelle entre les ressources

  • Les références inter-ressources ne sont pas validées

  • Nécessite une liste explicite des comptes autorisés

Exemple de structure de bundle de messages

{ "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"} } ] }
Note

Chaque ressource est stockée indépendamment, comme si elle était soumise via des opérations PUT individuelles. Si une sémantique complète de la messagerie FHIR ou une validation de l'intégrité référentielle sont requises, prétraitez les ensembles de messages ou implémentez une validation au niveau de l'application avant de les soumettre.

Transactions groupées asynchrones

AWS HealthLake prend en charge le Bundle type asynchrone transaction qui vous permet de soumettre des transactions avec un maximum de 500 ressources. Lorsque vous soumettez une transaction asynchrone, mettez-la en HealthLake file d'attente pour traitement et renvoyez immédiatement une URL d'interrogation. Vous pouvez utiliser cette URL pour vérifier le statut et récupérer la réponse. Cela suit le modèle de bundle asynchrone FHIR.

Quand utiliser les transactions asynchrones

  • Vous devez soumettre plus de 100 ressources (limite synchrone) en une seule transaction.

  • Vous voulez éviter de bloquer votre application en attendant la fin du traitement de la transaction.

  • Vous devez traiter de gros volumes de ressources connexes avec un meilleur débit.

Important

Les résultats du sondage sont disponibles pendant 90 jours après la fin de la transaction. Après cette période de 90 jours, l'URL du sondage ne renvoie plus de résultats. Concevez votre intégration pour récupérer et stocker les résultats dans cette fenêtre.

Note

transactionLe Bundle type synchrone continue de prendre en charge jusqu'à 100 ressources et constitue le mode de traitement par défaut. Si vous soumettez un Bundle type transaction contenant plus de 100 ressources sans Prefer: respond-async en-tête, HealthLake renvoie une 422 Unprocessable Entity erreur. Les ensembles avec type ne batch sont pas pris en charge pour le traitement asynchrone : seul le Bundle type transaction peut être soumis de manière asynchrone (avec un maximum de 500 opérations).

Soumission d'une transaction asynchrone

Pour soumettre une transaction asynchrone, envoyez une POST demande au point de terminaison du magasin de données avec l'Prefer: respond-asyncen-tête. Le bundle doit avoir un typetransaction. Les ensembles avec type ne batch sont pas pris en charge pour le traitement asynchrone des ensembles.

HealthLake effectue les validations initiales du bundle au moment de la soumission. Si la validation aboutit, HealthLake renvoie HTTP 202 Accepted avec un en-tête de content-location réponse contenant l'URL d'interrogation.

Pour soumettre un type asynchrone Bundle transaction

  1. Envoyez une POST demande au point de terminaison du magasin de HealthLake données.

    POST https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/
  2. Construisez un corps JSON pour la demande avec le type de bundletransaction. Dans le cadre de cette procédure, enregistrez le fichier sousasync-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. Envoyez la demande avec l'Prefer: respond-asyncen-tête. Le type de Bundle transaction FHIR utilise une POST demande avec AWS signature version 4 ou une autorisation SMART on FHIR. L'exemple de code suivant utilise l'outil de ligne de curl commande à des fins de démonstration.

    SigV4

    Autorisation 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

    Exemple d'autorisation SMART sur FHIR pour le type de IdentityProviderConfigurationdonnées.

    { "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\"]}" }

    L'appelant peut attribuer des autorisations dans le lambda d'autorisation. Pour de plus amples informations, veuillez consulter OAuth Éscopes 2.0.

  4. En cas de soumission réussie, le serveur renvoie HTTP 202 Accepted. L'en-tête de content-location réponse contient l'URL du sondage. L'organisme de réponse est une OperationOutcome ressource.

    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" ] } ] }

Sondage de l'état de la transaction

Après avoir soumis une transaction asynchrone, utilisez l'URL de sondage figurant dans l'en-tête de content-location réponse pour vérifier le statut de la transaction. Envoyez une GET demande à l'URL du sondage.

Note

Pour les magasins de données compatibles SMART sur FHIR, le jeton d'autorisation doit inclure read des autorisations sur le type de Transaction ressource pour demander l'état de la transaction. Pour plus d'informations sur SMART sur les oscilloscopes FHIR, consultez. SMART sur les oscilloscopes FHIR OAuth 2.0 pris en charge par HealthLake

Envoyez une GET demande à l'URL du sondage. L'exemple suivant utilise l'outil de ligne de curl commande.

SigV4

Autorisation 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

Autorisation SMART sur FHIR. Le jeton d'autorisation doit inclure read des autorisations sur le type de Transaction ressource.

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

Le tableau suivant décrit les réponses possibles.

Codes de réponse aux sondages
Statut HTTP Signification Corps de la réponse
202  Accepté La transaction est en file d'attente OperationOutcomeavec diagnostic « SOUMIS »
202  Accepté La transaction est en cours de traitement OperationOutcomeavec diagnostic « IN_PROGRESS »
200 OK Transaction terminée avec succès Bundleavec type transaction-response
4xx/5xx Échec de la transaction OperationOutcomeavec les détails de l'erreur

Les exemples suivants montrent chaque type de réponse.

Transaction en file d'attente (202)

{ "resourceType": "OperationOutcome", "id": "transactionId", "issue": [ { "severity": "information", "code": "informational", "diagnostics": "SUBMITTED" } ] }
Traitement des transactions (202)

{ "resourceType": "OperationOutcome", "id": "transactionId", "issue": [ { "severity": "information", "code": "informational", "diagnostics": "IN_PROGRESS" } ] }
Transaction terminée (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" } } ] }
Échec de la transaction (4xx/5xx)

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

Commande en cours

Les ensembles de type asynchrone sont mis en file d'attente mais ne transaction sont pas traités dans un ordre de soumission strict. HealthLake optimise le traitement en fonction de la capacité disponible et de la charge du système.

Important

Ne vous fiez pas au traitement des transactions dans l'ordre dans lequel elles ont été soumises. Par exemple, si vous soumettez la transaction A à 10 h 00 et la transaction B à 10 h 01, la transaction B peut être terminée avant la transaction A. Concevez votre application pour :

  • Terminez out-of-order la manipulation.

  • Utilisez l'URL du sondage pour suivre chaque transaction indépendamment.

  • Mettez en œuvre le séquençage au niveau de l'application si la commande est importante pour votre cas d'utilisation.

Quotas et régulation

Les quotas et limites de taux suivants s'appliquent aux transactions asynchrones.

Quotas de transactions asynchrones
Quota Value Ajustable
Nombre maximum d'opérations par transaction asynchrone 500 Non
Nombre maximum de transactions en attente par magasin de données 500 Oui
  • Les transactions asynchrones partagent les mêmes limites de débit d'API définies ci-dessous. Quotas de service

  • L'interrogation du statut des transactions partage les mêmes limites de débit d'API que les opérations read (GET) sur les ressources FHIR.

  • Si la limite de transactions en attente est atteinte, les soumissions suivantes renvoient une erreur jusqu'à ce que les transactions existantes soient terminées.

Gestion des erreurs

Pour un bundle « transactionnel », toutes les ressources FHIR contenues dans le bundle sont traitées comme une opération atomique. Toutes les ressources de l'opération doivent réussir, sinon aucune opération du bundle n'est traitée.

Les erreurs se répartissent en deux catégories : les erreurs de soumission HealthLake renvoyées de manière synchrone et les erreurs de traitement que vous détectez par le biais d'un sondage.

Erreurs de soumission

HealthLake valide le bundle au moment de l'envoi et renvoie les erreurs de manière synchrone avant que la transaction ne soit mise en file d'attente. Les erreurs de soumission incluent des erreurs de validation des ressources FHIR non valides, des types de ressources non pris en charge, le dépassement de la limite de 500 opérations et l'utilisation de l'Prefer: respond-asyncen-tête avec des ensembles de lots. Si la limite de transactions en attente pour le magasin de données a été atteinte, HealthLake renvoie ThrottlingException a. Lorsqu'une erreur de soumission se produit, la transaction ne sera pas mise en file d'attente.

Erreurs de traitement

Des erreurs de traitement se produisent une fois que la transaction a été mise en file d'attente et sont renvoyées via l'URL d'interrogation. Il s'agit notamment des conflits de transactions, lorsqu'une autre opération a modifié une ressource faisant partie de la transaction, et des erreurs de serveur pendant le traitement. Lorsqu'une erreur de traitement se produit, aucune mutation de ressource n'est effectuée pour les ressources de la transaction. L'URL du sondage renverra un OperationOutcome contenant les détails de l'erreur.