在我的previous article中,我写了一个关于回调模式,其AWS步骤功能在HealthLake的出口骨架上构建。尽管我在回调部分上使用了代码,但我觉得我没有给予方程式的Healthlake侧。因此,本文是调整。使用AWS HealthLake管理出口。
什么是Healthlake
AWS HealthLake是一项符合HIPAA资格的服务,可提供FHIR API,可帮助医疗保健和生命科学公司在几分钟内安全地存储,转换,交易和分析健康数据,以对患者和人群级别的时间顺序排列。 -AWS
我的话是HealthLake是一个符合FHIR的数据库,它为开发人员提供了一组强大的API,以构建以患者为中心的应用程序。您可以使用HealthLake来构建交易应用程序,分析大量数据,存储结构化和半结构化信息并构建分析和报告。
使用HealthLake建造时,我发现它适合两个地方之一。
- 作为您的医疗保健申请的交易中心。它是高度耐心的,非常可扩展,并且包含用于使用每个资源的API。此外,它为FHIR功能提供了智能,使其成为在。 之上构建应用程序的不错的选择。
- 作为Lakehouse风格体系结构中许多外部和内部系统的聚合点,用于互操作性和报告。当您拥有具有各种数据库的分布式系统时,您需要在一个位置重新汇聚的数据。 Healthlake做到了。或者,如果您从各种外部来源获取数据,那么HealthLake也可以做到这一点。我写了关于这样做with Serverless的文章。
AWS HealthLake出口
在June 2023之前,AWS Heathlake中的出口仅在控制台或通过CLI命令中支持。随着这些新的批量API的发布,用于管理出口,它允许像我在回调文章中显示的一样工作流程。
此功能解锁了许多不同的用例,但是我看到的最大两个用例是:
- 在HealthLake中建立CDC功能
- 逐步导出数据以执行分析或其他数据分析。
在我展示将其在您的环境中成为可能的一切之前,还有两个关于出口的注释。 API提供了几个不错的选择来控制您要导出的内容。
首先,以患者为中心的出口,您可以在URL中提供该信息,而HealthLake将导出与患者资源有关的所有记录。因此,在您的数据集中,事物与fhir参考,订阅者和其他内容相关。
第二,通过使用afafe afare,HealthLake将仅导出这些记录更改了>=
,因为参数。
有关出口的更多阅读,here's the documentation
执行导出
使用AWS HealthLake使用出口需要进行设置。在以下各节中,我将说明所有需要配置的内容,然后我们将研究如何执行导出。
设置导出
为我们的导出准备的第一步是建立一个可以访问HealthLake DataStore的角色,除了运行和描述导出的操作。执行此操作的CDK代码片段如下:
const manageExportPolicy = new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: [props.datastore.attrDatastoreArn],
actions: [
"healthlake:StartFHIRExportJobWithPost",
"healthlake:DescribeFHIRExportJobWithGet",
"healthlake:CancelFHIRExportJobWithDelete",
"healthlake:StartFHIRExportJob",
],
}),
new iam.PolicyStatement({
actions: [
"s3:ListBucket",
"s3:GetBucketPublicAccessBlock",
"s3:GetEncryptionConfiguration",
],
effect: iam.Effect.ALLOW,
resources: [`${props.bucket.bucketArn}`],
}),
new iam.PolicyStatement({
actions: ["s3:PutObject"],
effect: iam.Effect.ALLOW,
resources: [`${props.bucket.bucketArn}/*`],
}),
new iam.PolicyStatement({
actions: ["kms:DescribeKey", "kms:GenerateDataKey*"],
effect: iam.Effect.ALLOW,
resources: [props.key.keyArn],
}),
],
});
this._role = new iam.Role(scope, "HealthLakeExportRole", {
roleName: "healthlake-cdc-export-role",
assumedBy: new iam.PrincipalWithConditions(assumedBy, {
StringEquals: {
"aws:SourceAccount": props.accountId,
},
ArnEquals: {
"aws:SourceArn": props.datastore.attrDatastoreArn,
},
}),
inlinePolicies: {
healthlakePolicy: manageExportPolicy,
},
});
上面的好一点,所以让我们谈谈一秒钟。
这些新动作与AWS HealthLake出口专门相关。
actions: [
"healthlake:StartFHIRExportJobWithPost",
"healthlake:DescribeFHIRExportJobWithGet",
"healthlake:CancelFHIRExportJobWithDelete",
"healthlake:StartFHIRExportJob",
],
角色的其他部分包裹在S3和KMS周围。这很重要,因为导出将将其结果写入您选择的S3存储桶/钥匙。并且该执行的角色将需要对这些事情许可。
角色的最后一部分是我要通过信任策略限制访问权限,以便仅我想要的帐户和我选择的数据存储以进行进一步限制。这只是好习惯。
运行导出
要使用AWS HealthLake演示出口,我将使用一个简单的API调用,并向您展示卷曲请求。文章的底部将是我在回调文章中使用的完整存储库的链接,因此您也可以参考。
curl --location 'https://healthlake.us-west-2.amazonaws.com/datastore/<datastoreid>/r4/$export?_since=2023-07-18T00%3A00%3A00.461Z' \
--header 'Content-Type: application/fhir+json' \
--header 'Prefer: respond-async' \
--header 'X-Amz-Content-Sha256: beaead3198f7da1e70d03ab969765e0821b24fc913697e929e726aeaebf0eba3' \
--header 'X-Amz-Date: 20230826T132701Z' \
--data '{
"JobName": "<whatever you want>",
"OutputDataConfig": {
"S3Configuration": {
"S3Uri": "s3://<your-s3-bucket>",
"KmsKeyId": "arn:aws:kms:us-west-2:<account-id>:key/<key-id>"
}
},
"DataAccessRoleArn": "arn:aws:iam::<account-id>:role/healthlake-export-role"
}'
出于明显的原因,我遗漏了“授权”标头。但是要注意的有意义的事情。
- 标题:
Prefer: respond-async
- 标题:
Content-Type: application/fhir+json
您将有效载荷传递到邮政请求中也是特定的。您需要提供:
- s3uri-这是要转储结果的存储桶/键。您在构建角色时使用了此
- kmskeyid-这是用于S3存储桶的加密密钥,并且必须具有此功能
- dataAccessrolearn-在上述代码中构建的角色。
运行请求时,将返回以下输出。
{
"datastoreId": "<your datastoreid>",
"jobStatus": "SUBMITTED",
"jobId": "<jobId>"
}
监视导出
AWS HealthLake出口是异步操作。您将其发布到API中,然后将获得一个可以检查工作进度的JobID。
API提供了一个get请求,使您可以描述您正在询问的工作。
curl --location 'https://healthlake.us-west-2.amazonaws.com/datastore/<datastoreid>/r4/export/<jobId>' \
--header 'X-Amz-Date: 20230826T134903Z' \
记住,从上一篇文章中,您一次只能有1个作业,但您总是可以回去检查旧的工作。我找不到有关工作历史记录多长时间的信息,但我通常不会回头,所以我没有注意到。
对描述电话的响应将看起来像这样:
{
"exportJobProperties": {
"jobId": "<jobId>",
"jobName": "2023-07-19 15:06:49 +0000 UTC",
"jobStatus": "COMPLETED",
"submitTime": "Aug 26, 2023 1:46:56 PM",
"endTime": "Aug 26, 2023 1:48:25 PM",
"datastoreId": "<datastoreId>",
"outputDataConfig": {
"s3Configuration": {
"s3Uri": "s3://<bucket/key>/<datastoreId>-FHIR_EXPORT-<jobId>/",
"kmsKeyId": "arn:aws:kms:us-west-2:<accountId>:key/<keyId>"
}
},
"dataAccessRoleArn": "arn:aws:iam::<accountId>:role/healthlake-cdc-export-role"
},
"transactionTime": "2023-08-26T13:49:03.424Z",
"request": "https://healthlake.us-west-2.amazonaws.com/datastore/<datastoreId>/r4/$export?_type&_since=2023-07-18T00:00:00.461Z&_outputFormat=application/fhir+ndjson",
"requiresAccessToken": false,
"output": [
{
"type": "ResourceType",
"url": "s3://<bucket/key>/<datastoreId>-FHIR_EXPORT-<jobId>/ResourceType/ResourceType-1022280015944103279-3-0.ndjson"
}
],
"error": []
}
我会分解那个有效载荷。
首先,您会看到“ Jobproperties”,突出了您通过帖子传递的内容。它确实包括有关作业本身的一些其他信息。运行时,状态,工作ID和作业名称。
其他信息描述了实际请求,包括完整的URL。
最后,您会得到一个“输出”对象。这是NDJSON文件及其资源类型的列表以及S3中的文件的完整URL。这很重要,因为如果您想对这些文件做某事,则可以。
关于NDJSON的快速注释。我第一次研究文件的输出时,我有点震惊,因为它不是文件中的单个记录。我想那应该不震惊我,但确实如此。 ndjson是“ newline划界JSON”,这意味着您在由\r\n
或\n
分隔的文件中具有多个记录。4
S3中的输出看起来如下:
包起来
完成了有关Callback的讨论以及支持它的AWS中的基础HealthLake出口。我已经成为Healthlake的忠实拥护者,并认为它适合医疗保健中的严重挑战。数据汇总和互操作性。
通过利用AWS的这些新API,您可以利用可以支持各种工作负载的出口功能。我希望您对一切都如何融合有了更好的了解。如果您想挖掘所有内容的全部来源,here is the GitHub repository
享受!和快乐的建筑!