🏥

2023/7/25 GAのAWS HealthImagingをCloudFormation(& CDK)とマネコンで作成してみた。

2023/09/29に公開

2023年7月25日AWS HealthImagingがGA

https://aws.amazon.com/jp/about-aws/whats-new/2023/07/general-availability-aws-healthimaging/

2023年9月21日、CloudFormationのリソースタイプとしても「AWS::HealthImaging::Datastore」の対応を発表されました。

https://docs.aws.amazon.com/healthimaging/latest/devguide/what-is.html

早速作成してみたいと思います。
2023年9月29日現在の対応リージョンは、以下のようです。


マネコンで作成してみる



左サイドカラムから「Data Store」を選択したのと同じ画面になります。








「Data Store」画面に戻ってみます。以下のように表示が確認できます。


CloudFormationで作成してみる

現在、HealthImagingに関するリソースタイプは前述の「AWS::HealthImaging::Datastore」のみのようです。

以下がドキュメントです。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthimaging-datastore.html

sample.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  HealthImagingDatastore:
    Type: AWS::HealthImaging::Datastore
    Properties: 
      DatastoreName: sampleDataStore
      # KmsKeyArn: !Ref # 指定が必要な場合は AWS::KMS::Keyを指定。
      # Tags: # 必要な場合は設定。
# ========================================= #
Outputs:
  CreatedAt:
    Value: !GetAtt HealthImagingDatastore.CreatedAt
    Description: The timestamp when the data store was created.

  DatastoreArn:
    Value: !GetAtt HealthImagingDatastore.DatastoreArn
    Description: The Amazon Resource Name (ARN) for the data store.

  DatastoreId:
    Value: !GetAtt HealthImagingDatastore.CreatedAt
    Description: The data store identifier.

  DatastoreStatus:
    Value: !GetAtt HealthImagingDatastore.CreatedAt
    Description: The data store status.

  UpdatedAt:
    Value: !GetAtt HealthImagingDatastore.CreatedAt
    Description: The timestamp when the data store was last updated.

無事作成されました。

CloudFormationコンソールに戻って確認出来た「出力」が以下となります。

2023年9月29日時点ではこの先の作業について、CloudFormationからは不可という事になるかと思います。


DICOMデータをインポートする

DICOMとは、CTやMRI、CRなどで撮影した医用画像のフォーマットと、それらを扱う医用画像機器間の通信プロトコルを定義した標準規格である。

https://ja.wikipedia.org/wiki/DICOM

S3Bucketを作成してフォルダ(厳密にはpurefix)を2つ作成しました。

以下サイトが恐らく過去の勉強会用の資料として入手可能状態にされているサンプルデータをお借りします。
https://www.jira-net.or.jp/dicom/dicom_data_01_02.html

ここには乗せませんが、ファイルをダブルクリックしてみた所、
私の環境ですとphotoshopが開き以下のような写真が表示されました。
(勿論DICOMなので単なる胸部レントゲン写真という訳ではないです。)

https://programming-surgeon.com/imageanalysis/what-is-dicom/

S3(sourceData)に保存します。



「許可の詳細を表示」をクリックするとモーダルが表示されます。

上下それぞれの内容以下に畳みます。

許可
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<S3_import_source>",
                "arn:aws:s3:::<S3_output_destination>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<S3_import_source>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::<S3_output_destination>/*"
            ]
        }
    ]
}
Trust relationship
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "medical-imaging.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:SourceAccount": "<aws_account_id>"
                },
                "ForAllValues:ArnEquals": {
                    "aws:SourceArn": "<datastore_arn>"
                }
            }
        }
    ]
}






ここではあえてぼかしていますが、患者名やID、性別といったデータも保存されました。


例えばCDKを使っても...

CDKで以下のように作成する事は可能かと思いますが、やはりS3BucketにDICOMを入れる所までは出来ても、データをインポートするのはCFnやCDKでは不可になるかと思われます。

import * as cdk from 'aws-cdk-lib';
import * as constructs from 'constructs';
import { aws_healthimaging as healthimaging } from 'aws-cdk-lib';
import { aws_s3 as S3 } from 'aws-cdk-lib';
import { aws_s3_deployment as S3Deployment } from 'aws-cdk-lib';
// ===================================================================== //
export class TestStack extends cdk.Stack {
  constructor(scope: constructs.Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);
    // --------------------------------------------------------------------- //
    const cfnDatastore = new healthimaging.CfnDatastore(this, 'CfnDatastore', {
      datastoreName: 'cdkDatastore',
    });
    // --------------------------------------------------------------------- //
    const bucket = new S3.Bucket(this, 'MyBucket', {
      bucketName: `test-bucket-${this.account}-${this.region}`,
    });
    // --------------------------------------------------------------------- //
    new S3Deployment.BucketDeployment(this, 'JsonBucketDeployment', {
      destinationKeyPrefix:'sourceData',
      sources: [S3Deployment.Source.asset('./assets/dicom')],
      destinationBucket: bucket,
    })
    // --------------------------------------------------------------------- //
  }
}

以上でした。

有難うございました。

Discussion