View a markdown version of this page

删除 FHIR 资源 - AWS HealthLake

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

删除 FHIR 资源

FHIR delete 交互将现有的 FHIR 资源从 HealthLake数据存储中移除。有关更多信息,请参阅 FHIR R4 RESTful API 文档delete中的内容。

删除 FHIR 资源

  1. 收集 HealthLake region和估datastoreId值。有关更多信息,请参阅 获取数据存储属性。

  2. 确定Resource要删除的 FHIR 类型并收集关联id值。有关更多信息,请参阅 资源类型。

  3. 使用收集的 HealthLake region和值构造请求的 URL datastoreId。还包括 FHIR Resource 类型及其相关id类型。要查看以下示例中的整个 URL 路径,请滚动到 “复制” 按钮上。

    DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Resource/id
  4. 发送 请求。FHIR delete 交互使用AWS 签名版本 4 或经 FHIR 授权的 SMART DELETE 请求。以下curl示例从 HealthLake 数据存储中移除现有 FHIR Patient 资源。要查看整个示例,请滚动到 “复制” 按钮。

    SigV4

    SigV4 授权

    curl --request DELETE \ 'https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Patient/id' \ --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'

    服务器返回 204 HTTP 状态码,确认资源已从 HealthLake 数据存储中删除。如果删除请求失败,您将收到一400系列 HTTP 状态码,说明请求失败的原因。

    SMART on FHIR

    IdentityProviderConfiguration数据类型的 SMART on FHIR 授权示例。

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

    调用者可以在授权 lambda 中分配权限。有关更多信息,请参阅 OAuth 2.0 作用域。

    AWS Console

    1. 登录 HealthLake 控制台上的 “运行查询” 页面。

    2. 在 “查询设置” 部分下,进行以下选择。

    • 数据存储 ID — 选择数据存储 ID 以生成查询字符串。

    • 查询类型 -选择Delete。

    • 资源类型 — 选择要删除的 FHIR 资源类型。

    • 资源 ID — 输入 FHIR 资源 ID。

    3. 选择运行查询。

根据条件删除 FHIR 资源

当您不知道具体的 FHIR 资源 ID 但有其他有关要删除的资源的识别信息时,有条件删除尤其有用。

条件删除允许您根据搜索条件而不是按逻辑 FHIR ID 删除现有资源。当服务器处理删除请求时,它使用标准搜索功能对资源类型执行搜索,以解析请求的单一逻辑 ID。

条件删除的工作原理

服务器的操作取决于它找到多少匹配项:

  1. 无匹配项:服务器尝试进行普通删除并做出相应的响应(不存在的资源为 404 未找到,已删除的资源为 204 无内容)

  2. 一次匹配:服务器对匹配的资源执行普通删除

  3. 多个匹配项:返回 412 前提条件失败错误,表明客户端的标准选择性不够

响应场景

AWS HealthLake 使用以下响应模式处理条件删除操作:

成功的操作

  • 当您的搜索条件成功识别出单个活动资源时,系统将在完成删除后返回 204 No Content,就像标准删除操作一样。

ID-Based 有条件删除

根据id附加参数(createdAt_tag、或_lastUpdated)执行条件删除时:

  • 204 无内容:资源已被删除

  • 404 未找到:资源不存在

  • 409 冲突:ID 匹配但其他参数不匹配

Non-ID-Based 有条件删除

id未提供或使用createdAt、_tag或以外的参数时_lastUpdated:

  • 404 未找到:未找到匹配项

冲突局势

有几种情况会导致 412 前提条件失败的响应:

  • 多个资源与您的搜索条件相匹配(条件不够具体)

  • 将 ETag 标头与一起使用时出现版本冲突 If-Match

  • 在搜索和删除操作之间发生资源更新

成功的条件删除示例

以下示例根据特定条件删除患者资源:

DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Patient?name=peter&birthdate=2000-01-01&phone=1234567890

此请求删除患者资源,其中:

  • 名字是 “彼得”

  • 出生日期是 2000 年 1 月 1 日

  • 电话号码是 1234567890

最佳实践

  1. 使用特定的搜索条件来避免多次匹配并防止 412 错误。

  2. 当需要处理并发修改时,可以考虑使用 ETag 标头进行版本控制。

  3. 适当处理错误响应:

    • 对于 404:优化搜索条件

    • 对于 412:使标准更具体或解决版本冲突

  4. 为高并发环境中的时间冲突做好准备,在这些环境中,搜索和删除操作之间可能会修改资源。

使用 _count 在一个请求中删除多个 FHIR 资源

默认情况下,有条件删除要求您的搜索条件完全匹配一种资源。要在单个请求中删除多个匹配的资源,请添加_count查询参数。当_count存在时, HealthLake 将请求作为批处理操作进行处理。它搜索匹配的资源,将其删除,然后返回 HTTP,其类型200为 FHIRbatch-response,其中包含每个资源Bundle的状态。

  • 搜索参数决定哪些资源匹配。_count设置单个请求中要删除多少匹配资源的上限。

  • _count不能超过数据存储的最大页面大小(默认为 100)。如果您指定的值高于此限制,则 HealthLake 返回400 Bad Request。如果匹配的资源超过了该_count值允许的数量,则使用分页删除剩余的匹配项。有关更多信息,请参阅 搜索参数。

  • 总删除吞吐量受数据存储的写入容量限制。有关您账户的当前限额,请参阅端点和限额。

示例请求

以下请求删除标记的匹配Coverage资源inactive:

DELETE https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/Coverage?_tag=inactive&_count=50

批量响应格式

包含的请求会_count返回 HTTP 200 并带有batch-responseBundle。每个条目都会报告一个匹配资源的结果:

  • 204 无内容:资源已删除。

  • 412 前提条件失败:另一项操作修改了搜索和删除(版本冲突)之间的资源,因此 HealthLake 未将其删除。再次发送有条件删除会运行新的搜索,并且只有在资源仍然符合您的条件时才会删除该资源。由于搜索结果最终是一致的,因此最近修改的资源可能不会立即出现。

  • 403 已禁止:经 FHIR 授权的 SMART 拒绝删除此资源。

与任何 FHIR 搜索一样,匹配和删除资源的顺序遵循基础搜索结果的顺序。除非您在搜索条件中包含该_sort参数,否则搜索并不能保证此顺序。如果您需要分页批量删除的确定顺序,请指定。_sort有关更多信息,请参阅 搜索参数。

在响应中Bundle,同样不能保证入场顺序。使用条目中的location字段将每个条目与其资源进行匹配response,而不是依赖于条目位置。

重要

批量条件删除不是原子的。请求中的某些资源可以删除,而其他资源在同一请求中会返回错误Bundle。务必检查响应中的每个条目状态码,Bundle而不是假设整个请求成功或失败。

重要

当搜索不匹配任何资源时,带的请求会_count返回一个空的 HTTP 200 batch-responseBundle(无条目)。这与不带条件删除不同 _count,后者404 Not Found在没有任何匹配项时返回。

部分成功(版本冲突)

可以在搜索和删除之间修改资源。成功删除的资源返回204;冲突的资源同样Bundle返回412。

{ "resourceType": "Bundle", "type": "batch-response", "entry": [ { "response": { "status": "204", "location": "Coverage/b807f9ff-2872-45df-9325-0b2efe42e554" } }, { "response": { "status": "412", "location": "Coverage/5287b322-d7e5-4688-bd55-022067db4d0f", "outcome": { "resourceType": "OperationOutcome", "issue": [ { "severity": "error", "code": "exception", "diagnostics": "Resource was modified by another operation. Retry the request." } ] } } } ] }

使用分页删除更多匹配项

单个请求最多删除一页匹配项。如果还剩下更多匹配的资源,则响应将Bundle包含一个link带next关系和一个 URL。向该网址发送 HTTP DELETE 请求以删除下一页,然后重复此操作,直到响应中不再包含next链接。必须使用该next链接DELETE(与原始请求相同的方法),而不是GET。

{ "resourceType": "Bundle", "type": "batch-response", "link": [ { "relation": "next", "url": "https://healthlake.us-east-1.amazonaws.com/...<page_token>" } ], "entry": [ { "response": { "status": "204", "location": "Patient/4aeffdc9-6ac5-46ff-be10-bf8bd74dfecc" } } ] }

SMART on FHIR 授权行为

  • 删除权限不足:如果调用者可以搜索但缺少删除权限,则请求仍会返回200并且受影响的资源以403条目形式显示在Bundle(这些资源不会删除任何内容)。

  • read/search 权限不足:如果调用者无法运行基础搜索,则无论删除权限如何,整个请求都会在根级别失败,并显示OperationOutcome(不Bundle返回)。

  • IAM 授权:IAM 在请求级别评估权限,而不是按资源进行权限评估。调用主体必须获得执行删除和搜索操作的授权(例如,healthlake:DeleteResource以及适用的搜索操作,因为该操作会运行搜索来查找匹配项)。未经授权的委托人被拒绝了整个请求。

有关在 FHIR 授权上配置 SMART 的更多信息,请参阅SMART on FHIR。

服务配额如何适用

批量条件删除没有自己的服务配额。每个请求使用与其执行的搜索和删除交互相同的现有 HealthLake 配额,因此单个请求会消耗多个配额单位:

  • 一次搜索:为了解析匹配的资源,每个请求都执行搜索并消耗搜索(读取)容量,就像标准的 FHIR 搜索一样。

  • 每个匹配的资源一次删除:每个被删除的资源消耗删除(写入)容量,与单个删除相同。删除 N 个资源的请求消耗一次搜索和 N 次删除。

  • 每个请求的资源:每个请求最多删除一页匹配项(默认页面大小为 100)。要删除更多匹配项,请使用分页。

吞吐量受数据存储的写入容量控制。要在账户的配额限制内管理吞吐量,要么发出更多_count值较小的请求,要么使用更窄的搜索范围和更大的_count值。有关您账户当前的搜索和写入容量限制,请参阅端点和限额。

注意事项

  • _count必须是正整数。通过验证返回非整数或超出范围400 Bad Request的值。OperationOutcome当时_count=1,响应仍然是 batch-responseBundle,而不是有条件_count删除时返回的单一资源响应。

  • 不支持将If-Match标头与一起使用_count。包含两个退货的请求400 Bad Request。

  • Bundle请求内部不支持批量条件删除。

  • 只有成功删除的资源才会计量。以412或403状态返回的资源不计入计量。