0 フォロワー · 32 投稿

このタグは、分析およびビジネスインテリジェンスソリューション、視覚化、KPI、その他のビジネスメトリック管理の開発に関する議論に関連しています。

記事 Toshihiko Minamoto · 11月 11, 2025 8m read

BroadSea - InterSystems OMOP を使用したコア OHDSI のウォークスルー

DatabaseConnector が InterSystems IRIS をサポートするようになったため、これまでの旅は、ヘルスケアデータからの大規模な分析から価値を引き出すことを目的とした強力なオープンソースアプリOHDSI エコシステムへとつながりました。良い出発点となるのは、Atlas、R、Hades などのコア OHDSI テクノロジーをローカルまたは選択した専用インスタンスで使用できるようにする OHDSI/Broadsea ソリューションです。ここでは、Broadsea ソリューションと InterSystems OMOP Cloud Service と連携させるようにする方法を説明します。OHDSI/Croadsea リポジトリでこの手順を実行できることは、OHDSI ツールに `iris` ダイアレクトを含めるという前進の証明となります。  

ISC(https://github.com/isc-krakshith/InterSystems-Broadsea)ではこれをよりシームレスにするための取り組みが行われていますが、焦りと体験版の失効が近づいていることを考慮すれば、このウォークスルーでも同じ結果にたどり着けます。

クローン

まず、github.com/OHDSI/Broadsea リポジトリをローカルにクローンして、要件を確認しましょう。

OHDSI/Broadsea from github.com

git clone https://github.com/OHDSI/Broadsea.git
cd Broadsea

ℹ Windows ユーザーへの注意事項

Broadsea のコンテナーには、secrets ファイルの CTRL 文字に関する問題があります。この問題を緩和するために、クローンの後に、以下を行ってください。

git add --renormalize .
git config --global core.autocrlf false
dos2unix secrets/webapi/

変更

リポジトリはカスタマイズ性に非常に優れていますが、要点に到達するまでに、回避しなければならないことがいくつかありました(私はせっかちなんです)。

`.env` ファイルでは、WebAPI に新しい IRIS を含められるように GitHub の最新ビルドを使用する必要があります。それを行うには、次の環境変数をここに示すとおりに変更します。

- WEBAPI_GITHUB_URL="https://github.com/OHDSI/WebAPI.git#rc-2.13.0"
+ WEBAPI_GITHUB_URL="https://github.com/OHDSI/WebAPI.git"

次に、リポジトリ内の compose/ohdsi-webapi.yml に注目し、いくつか変更を加える必要があります。

以下のように、JAVA_OPTS にクラスパスとSSLConfig.properties を追加してSpring の環境変数を追加します。

    environment:
      + JAVA_OPTS: "-Dcom.intersystems.SSLConfigFile=/tmp/SSLConfig.properties"
      CLASSPATH: ":/var/lib/ohdsi/webapi/lib/additional/broadsea_mounted.jar"
      DATASOURCE_DRIVERCLASSNAME: org.postgresql.Driver
      DATASOURCE_URL: ${WEBAPI_DATASOURCE_URL}

また、コンテナーを特権に設定し、read_only を false にして、設定後の作業を少し楽にしました。

InterSystems JDBC ドライバーの取得

webapi プロファイルには、リポジトリ内の `jdbc/none.jar` にサードパーティドライバーをダウンロードして組み込むためのメカニズムが組み込まれています。そこで、リポジトリのルートから次のコマンドを実行して、Maven から最新の iris ドライバーを取得します。この、@Stefan Wittmann のちょっとしたハリー・ポッターの魔法を使えば、いつでも最新バージョンを得ることができます。

cat << 'EOF' > pom.xml
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.sandbox</groupId>
  <artifactId>pull-artifacts</artifactId>
  <version>1</version>
  <dependencies>
    <dependency>
        <groupId>com.intersystems</groupId>
        <artifactId>intersystems-jdbc</artifactId>
        <version>[3.10.3,4.0.0)</version>
    </dependency>
  </dependencies>
</project>
EOF
mvn dependency:copy-dependencies -DoutputDirectory=.
cp intersystems-jdbc-3.10.3.jar jdbc/none.jar

プロビジョニング

次の Docker Compose プロファイル文字列を使用すると、Broadsea をプロビジョニングできます。ここで注意しておくことは、ohdsi/webapi コンテナーが 1 年以内にビルドされたものではなく、IRIS の優れた機能が組み込まれていないため、`webapi-from-git` プロファイルを使用していることです。

BroadSea を起動するために、リポジトリで次の Compose プロファイルを実行します。

docker-compose --env-file .env --profile webapi-from-git --profile content --profile hades --profile atlasdb --profile atlas-from-image up -d

休憩

一休みして、コンテナーにソリューションを考えてもらいましょう。

では、traefik ルーターを通じて localhost に移動すると、BroadSear Application 起動ポータルが表示されます。

次に、IRIS を Hades と Atlas の中に置いて、OHDSI 軍団に加わりましょう。

構成後

BroadSea が起動して実行しているので、InterSystems OMOP Cloud サービスへの接続を追加して起動しましょう。実行する内容とその作用をわかりやすく説明するために、この作業を分割して、最後のティザーに構成後のスクリプトを含めます。

InterSystems OMOP デプロイメントから詳細を取得し、それらを変数として設定します。これにはエンドポイント URL、ユーザー/パスワード、説明、証明書が含まれます。

export IRIS_USER="SQLAdmin"
export IRIS_PASS="REDACTED"
export IRIS_JDBC="jdbc:IRIS://k8s-0a6bc2ca-a2668ebb-2be01ed66b-df29055c4af0630d.elb.us-east-2.amazonaws.com:443/USER/:::true"
export IRIS_DESCRIPTION="InterSystems OMOP Stage"
cat << 'EOF' > certificateSQLaaS.pem
-----BEGIN CERTIFICATE-----
HBLABLAHBLAHBLA
-----END CERTIFICATE-----
EOF

次のブロックは、Altas で使用できるようにソースを AtlasDB に追加します。

cat << EOF > 200_populate_iris_source_daimon.sql
INSERT INTO webapi.source( source_id, source_name, source_key, source_connection, source_dialect, username, password)
VALUES (2, '$IRIS_DESCRIPTION', 'IRIS', '$IRIS_JDBC', 'iris', '$IRIS_USER', '$IRIS_PASS');
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (4, 2, 0, 'OMOPCDM54', 0);
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (5, 2, 1, 'OMOPCDM54', 10);
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (6, 2, 2, 'OMOPCDM54_RESULTS', 0);
EOF

docker cp 200_populate_iris_source_daimon.sql broadsea-atlasdb:/docker-entrypoint-initdb.d/200_populate_iris_source_daimon.sql
docker-compose exec broadsea-atlasdb psql -U postgres -f "/docker-entrypoint-initdb.d/200_populate_iris_source_daimon.sql"

次のステップでは、Hades に証明書を追加し、適切な SSLConfig.properties に着地するようにします。

docker cp certificateSQLaaS.pem broadsea-hades:/home/ohdsi/
docker cp SSLConfigHades.properties broadsea-hades:/home/ohdsi/SSLConfig.properties

docker-compose exec broadsea-hades bash -c "/usr/bin/keytool -importcert -file /home/ohdsi/certificateSQLaaS.pem -keystore /home/ohdsi/keystore.jks -alias IRIScert -storepass changeit -noprompt"

InterSystems OMOP デプロイメントへの TLS 接続用に Web API を構成する手順に進み、次のコマンドを実行してキーストアを生成し、WebAPI コンテナーでリフレッシュ API を実行してソースをアクティブ化します。

docker exec ohdsi-webapi bash -c "keytool -importcert -file /tmp/certificateSQLaaS.pem -alias IRIScert2 -keystore /tmp/keystore.jks -storepass changeit -noprompt"
wget http://127.0.0.1/WebAPI/source/refresh/

おそらく、最も侵襲的な構成後の手順は、コンテナー内に 2 つの TLS/SSL 依存関係ファイルを作成することです。前の手順には SSLProperties.config が必要であり、証明書も `/tmp` フォルダーに手動で貼り付ける必要があります。

docker exec --user root -it ohdsi-webapi bash
cat > /tmp/certificateSQLaaS.pem
-----BEGIN CERTIFICATE-----
HBLABLAHBLAHBLA
-----END CERTIFICATE-----
<CTRL-D>

cat > /tmp/SSLConfig.properties
trustStore=/tmp/keystore.jks
trustStorePassword=changeit
<CTRL-D>

このコンテナーで `docker cp` またはボリュームマウントを動作させることができた方は、お知らせください。  

最後に、ドライバーを Hades に追加し、http://127.0.0.1/hades で Hades に移動して RStudio で更新を実行します。

これによってシステムのファンが稼働し、多少時間がかかりますがすべて完了すると、RStudio を使って Hades 内の DatabaseConnector パッケージからドライバーを取得できるでしょう。

library(DatabaseConnector)
downloadJdbcDrivers("iris", pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"), method = "auto")

👣🔫 IRIS ドライバーの取得に OHDSI ツールを使用し、WebAPI については Compose サービスを使用して手動でアップロードし、Hades を通じて DatabaseConnector パッケージを使用したことに気付くでしょう。 これはこれらのコンポーネントのバージョンによって異なる可能性があります。 同期を維持する場合は、ドライバーの OHDSI DatabaseConnector ツールの使用を省略して、代わりに cp して一致するようにすることができます。

docker cp intersystems-jdbc-3.10.3.jar broadsea-hades:/opt/hades/jdbc_drivers/

スモーク

Hades

Hades が InterSystems OMOP デプロイメントに接続できるかを確認してみましょう。

cd <- DatabaseConnector::createConnectionDetails(dbms = "iris", connectionString = "jdbc:IRIS://k8s-0a6bc2ca-adb040ad-c7bf2ee7c6-e6b05ee242f76bf2.elb.us-east-1.amazonaws.com:443/USER/:::true", user = "SQLAdmin", port = "443", password = "REDACTED", pathToDriver = "./jars")
conn <- connect(cd)
querySql(conn, "SELECT TOP 3 * FROM OMOPCDM54.care_site")

うまくいきました。

Atlas

次に、Atlas に進み、http://127.0.0.1 で InterSystems OMOP デプロイメントに繋がるかを確認します。

すぐに構成セクションに移動し、語彙とレコード件数をデフォルトに設定します。

次に、プロファイルセクションで「InterSystems OMOP Stage」オプションを選択し、既知の医療従事者 ID を選択します。

うまくいきました。

検索画面に移り、医療に関する内容を検索します。ここでは、「lung(肺)」について InterSystems OMOP デプロイメントを検索しています。

うまくいきました。

postconfiguration.sh

export IRIS_USER="SQLAdmin"
export IRIS_PASS="REDACTED"
export IRIS_JDBC="jdbc:IRIS://k8s-0a6bc2ca-a2668ebb-2be01ed66b-df29055c4af0630d.elb.us-east-2.amazonaws.com:443/USER/:::true"
export IRIS_DESCRIPTION="InterSystems OMOP Stage"
cat << 'EOF' > certificateSQLaaS.pem
-----BEGIN CERTIFICATE-----
HBLABLAHBLAHBLA
-----END CERTIFICATE-----
EOF
cat << EOF > 200_populate_iris_source_daimon.sql
INSERT INTO webapi.source( source_id, source_name, source_key, source_connection, source_dialect, username, password)
VALUES (2, '$IRIS_DESCRIPTION', 'IRIS', '$IRIS_JDBC', 'iris', '$IRIS_USER', '$IRIS_PASS');
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (4, 2, 0, 'OMOPCDM54', 0);
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (5, 2, 1, 'OMOPCDM54', 10);
INSERT INTO webapi.source_daimon( source_daimon_id, source_id, daimon_type, table_qualifier, priority) VALUES (6, 2, 2, 'OMOPCDM54_RESULTS', 0);
EOF
docker cp 200_populate_iris_source_daimon.sql broadsea-atlasdb:/docker-entrypoint-initdb.d/200_populate_iris_source_daimon.sql
docker-compose exec broadsea-atlasdb psql -U postgres -f "/docker-entrypoint-initdb.d/200_populate_iris_source_daimon.sql"
docker cp certificateSQLaaS.pem broadsea-hades:/home/ohdsi/
docker cp SSLConfigHades.properties broadsea-hades:/home/ohdsi/SSLConfig.properties
docker-compose exec broadsea-hades bash -c "/usr/bin/keytool -importcert -file /home/ohdsi/certificateSQLaaS.pem -keystore /home/ohdsi/keystore.jks -alias IRIScert -storepass changeit -noprompt"
docker exec ohdsi-webapi bash -c "keytool -importcert -file /tmp/certificateSQLaaS.pem -alias IRIScert2 -keystore /tmp/keystore.jks -storepass changeit -noprompt"
wget http://127.0.0.1/WebAPI/source/refresh/

BroadSea 対 InterSystems OMOP サーバーおよび OHDSI コミュニティへようこそ!

0
0 8
記事 Toshihiko Minamoto · 8月 21, 2025 5m read

Hades DatabaseConnector 6.4.0 が IRIS に対応しました!

OHDSI は OHDSI Hades プロジェクトにおいて、IRIS を DatabaseConnector 6.4.0サポートされるプラットフォームおよびダイアレクトとして正式に発表しました! 🎉 この成果を披露し、InterSystems IRIS で OMOP CDM 5.4 を作成してみましょう。


TLS - InterSystems Cloud Document を運用(Helath Connect Cloud または同等)

IRIS Cloud Document ワークロードを実行しており、クラウドポータルと RStudio で最小限のステップで OMOPCDM54 データベースをなんとか作成しました。


システム

証明書をどのようにシステムにインポートするかに関係なく、インポートはここで行って、InterSystems Cloud Document デプロイメントに接続する必要があります。私はソリューション全体で次のスクリプトを緩く使用しています。ポータルからダウンロードした証明書を貼り付けると、証明書が自動的にインポートされます。

 
import_iris_certificate.sh
#!/bin/bash

cat << 'EOF' > /usr/local/share/ca-certificates/cloudsql-gar2.crt
-----BEGIN CERTIFICATE-----
PEM FROM CLOUD DEPLOYMENT HERE
-----END CERTIFICATE-----
EOF

update-ca-certificates

PEM_FILE="/etc/ssl/certs/cloudsql-gar2pem" PASSWORD="changeit" JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") KEYSTORE="$JAVA_HOME/lib/security/cacerts" CERTS=$(grep 'END CERTIFICATE'$PEM_FILE| wc -l) echo$KEYSTORE# To process multiple certs with keytool, you need to extract# each one from the PEM file and import it into the Java KeyStore.for N in $(seq 0 $(($CERTS - 1))); do ALIAS="$(basename $PEM_FILE)-$N"echo"Adding to keystore with alias:$ALIAS" cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }" | keytool -noprompt -import -trustcacerts
-alias$ALIAS -keystore $KEYSTORE -storepass $PASSWORDdone

クラウドポータル

これはリスナー経由でも別の方法で実行できますが、クラウドポータルで実行できることを強調するために、SQL クエリツールを使用できます。


RStudio

次のステップは RStudio です。ここでは、多少のセットアップを行えば、ほとんどの作業は OHDSI パッケージが行います。

install.packages("devtools")
devtools::install_github("OHDSI/CommonDataModel")
install.packages("DatabaseConnector")
install.packages("SqlRender")
Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = "/home/sween/Desktop/OMOP/iris-omop-extdb/jars")
library(DatabaseConnector)
downloadJdbcDrivers("iris")


RStudio に戻る

iris ダイアレクト(OHDSI ツールに含まれました)が実際に含まれているかを確認できます。

CommonDataModel::listSupportedDialects()

実際に IRIS が存在しています。


実はここまで進む準備はできていましたが、まず最初に、作成された ddl をダンプして確認し、どこかにチェックインしたいと考えていました。これは、ddl を「ドライ ラン」方式でダンプします。

CommonDataModel::buildRelease(cdmVersions = "5.4",
                              targetDialects = "iris",
                              outputfolder = "./ddl/iris/")

出力フォルダを見てみましょう。

次に、InterSystems Cloud Document インスタンスをターゲットにし、実際に OMOP データベースを作成しましょう。これは、接続、次に実行の 2 つのステップで行います。
接続

cd <- DatabaseConnector::createConnectionDetails(dbms = "iris",
                                                 connectionString = "jdbc:IRIS://k8s-0a6bc2ca-a096b3cb-578f6ec1b7-8b0e928263a4990a.elb.us-east-2.amazonaws.com:443/USER/:::true",
                                                 user = "SQLAdmin",
                                                 port = "443",
                                                 password = "PASSWORD",
                                                 pathToDriver = "./jars",
)

実行

CommonDataModel::executeDdl(connectionDetails = cd,
                            cdmVersion = "5.4",
                            cdmDatabaseSchema = "OMOPCDM54"
                            )

すべてが順調に進めば、RStudio にエラーは報告されません

InterSystems Cloud Document デプロイメントで作業を確認すると、結果は空ですが、そこにあります!

👣🔫 警告です。これについては OMOP の旅でもう一度お話しします。IRIS の CDM では、「DOMAIN」テーブルと名前の衝突のようなものがあることに注意してください。上のスクリーンショットを見ると、DOMAIN がすべて大文字になっているのがわかります。これは、domain が InterSystems SQL Workloads のキーワードであるためです。したがって、テーブルに対する操作が存在する場合は、そのテーブル名を引用符で囲む必要があることに注意してください。

for table in cdmtables:
    try:
        if table == "domain":
            sql = f'(select * from OMOPCDM54."{table}") AS temp_table;'else:
            sql = f'(select * from OMOPCDM54.{table}) AS temp_table;'

 

開発者(IRIS を使用しているため、TLS などの実装のオーバーヘッドを気にしてはいられません)

ちょっと急いでおり、セキュリティは他の人の仕事であるため、ローカルの IRIS Community、Eval、コンテナー、または POD に OMOP データベースが必要です。 ほとんどの手順は上記のように新しい接続文字列の外部に適用され、SMP を通じてスキーマが作成されます。

次にもう一度 RStudio で、開発者インスタンスをポイントします。

cd <- DatabaseConnector::createConnectionDetails(dbms = "iris",
                                                 connectionString =
"jdbc:IRIS://192.168.1.162:1972/USER",
                                                 user = "_SYSTEM",
                                                 port = "1972",
                                                 password = "SYS",
                                                 pathToDriver = "./jars",
)

CommonDataModel::executeDdl(connectionDetails = cd, cdmVersion = "5.4", cdmDatabaseSchema = "OMOPCDM54" )

懐かしい資格情報で接続しています...

つぎに、SMP を再読み込みし、OMOPCDM54 スキーマを展開します。

成功です!

🙌 🎉 
素晴らしい作業でした。この取り組みに関与していただいた皆さんにお礼を申し上げます!

0
0 29
記事 Toshihiko Minamoto · 7月 22, 2025 9m read


OMOP Odyssey - InterSystems OMOP、クラウドサービス(トロイ編)

InterSystems OMOP クラウドサービスの期限切れ間近のトライアル版を通じた OHDSI(「オデッセイ」と読む)コミュニティに対する実装者のアプローチ
InterSystems OMOP とは?

InterSystems OMOP は、InterSystems クラウドサービスポータルを介して HealtheShare サービスとして提供されており、HL7® FHIR® データを Observational Medical Outcomes Partnership(OMOP)共通データモデル(CDM)に変換します。 InterSystems OMOP は S3 バケットに格納されている FHIR データを参照し、自動的に変換処理を行って、そのデータを OMOP CDM 形式でクラウドホスト型リポジトリに送信します。 するとユーザーは、ATLAS や HADES などの外部の Observational Health Data Sciences and Informatics(OHDSI)ツールと新しいタブに開く JDBC などのデータベースドライバーを併用して、データの分析タスクを実行できるようになります。

要約: S3 にホストされた FHIR Bulk Export データを OMOP CDM に変換し、クラウドホスト型の IRIS または postgres 構成の任意のデータベースに変換します。

ここでは、上記の「フルコース」を試して、最新の強力なツールと OHDSI コミュニティのアプリケーションの驚くべきエコシステムに囲まれた実装を最初から最後まで実行します。あちらこちらでドキュメントを使いまわさないようにし、その過程で地雷 👣 🔫 を紹介します。

素敵なものはバケットから生まれる

初めてサービスをプロビジョニングし、作成ダイアログにアクセスして入り口でS3の情報を尋ねられると、すぐに鶏と卵の状況にあるように感じられるかもしれません。これをできる限りうまく偽装して後で更新することも、変換用に Amazon S3 バケットをどのようにプロビジョニングするかを理解した上で、落ち着いたアプローチをとることも可能です。これは、データを共有するためにほとんどのクラウド型データソリューションに実装されている最新のアプローチです。ソースの場所を自分でプロビジョニングして、サービスにその場所と対話するためのアクセスを許可します。

  • バケットと初期ポリシースタックのプロビジョニング
  • サービスのデプロイメントの作成
  • デプロイメントに制約されたバケットポリシーの更新

コンソールをクリックして終了するか、サンプルスタックでこれを行うことができます。

 
s3-omop-fhir-stack.yaml
---AWSTemplateFormatVersion:'2010-09-09'Description:AWSCloudformationStackthatwillcreatetheS3BucketandPolicyfortheOMOPServerParameters:  BucketName:    Description:ThenameofthebuckettousetouploadFHIRBundlesforTransformation.    Type:String    AllowedPattern:"^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$"  PolicyfromOMOPConfiguration:    Description:ThenameofthebuckettousetouploadFHIRBundlesforTransformation.    Default:"arn:aws:iam::1234567890:role/skipper-deployment-*-Role"    Type:StringResources:  OMOPFHIRTransactionBucket:    Type:AWS::S3::Bucket    Properties:      BucketName:!Sub${BucketName}      PublicAccessBlockConfiguration:        BlockPublicAcls:true        BlockPublicPolicy:true        IgnorePublicAcls:true        RestrictPublicBuckets:true  OMOPBucketPolicy:    Type:AWS::S3::BucketPolicy    Properties:      Bucket:!RefOMOPFHIRTransactionBucket      PolicyDocument:        Version:"2012-10-17"        Statement:          - Effect:Allow            Principal:              AWS:                -!Sub${PolicyfromOMOPConfiguration}            Action:              -"s3:GetObject"              -"s3:GetBucketLocation"              -"s3:ListBucket"            Resource:              -!Sub"arn:aws:s3:::${BucketName}"# Bucket itself              -!Sub"arn:aws:s3:::${BucketName}/*"# FHIR Objects within the bucket

 

スタックは任意の方法で作成できます。1 つの方法として AWS CLI を使用できます。

aws cloudformation create-stack --stack-name omopfhir --template-body s3-omop-fhir-bucket.yaml --parameters ParameterKey=BucketName,ParameterValue=omop-fhir

バケットに、プロビジョニングと FHIR 取り込み用のソースフォルダで使用する初期キーを作成します。

aws s3api put-object --bucket omop-fhir --key Transactions/in --profile pidtoo
aws s3api put-object --bucket omop-fhir --key termz --profile pidtoo

これで、次のようにしてサービスをプロビジョニングするように設定できるはずです。arn を要求するフィールドに注意してください。説明では名前を要求しているにもかかわらず、実際にはバケットの arn を要求しています... 小さな 👣🔫 がここにあります。

デプロイメントが作成されたら、「FHIR から OMOP へのパイプライン」内にある「構成」ナビゲーション項目に移動し、ポリシーをクリップボードにコピーします。そこにある指示に従って、これを現在のポリシーに組み込むか、ロールの値を取得してスタックを更新します。

aws cloudformation update-stack --stack-name omopfhir --template-body s3-omop-fhir-bucket.yaml --parameters ParameterKey=PolicyfromOMOPConfiguration,ParameterValue="arn:aws:iam::1234567890:role/skipper-deployment-4a358965ec38ba179ebeeeeeeeeeee-Role"

いずれにしても、ソースバケットのアクセス許可には、このようなポリシーが表示されるはずです... (アカウント番号、ロールは不明瞭です)

 
 推奨ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
    {
      "Principal": {
        "AWS": "arn:aws:iam::123456789099:role/skipper-deployment-33e46da9bf8464bbe5d1411111-Role"
      },
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::omop-fhir",
        "arn:aws:s3:::omop-fhir/*"
      ],
      "Sid": "IRIS Cloud Bucket Access"
    }
    ]
}

 

私は、ルートアカウントを開くことを許可しながらもバケットを制限する、よりオープンなポリシーを使用しました。こうすることで、1 つのバケット(または複数のバケット)で複数のデプロイメントをサポートできます。あまりお勧めできませんが、IAC の目的で単一のポリシーで複数の環境をサポートするための参考としての 2 番目の例です。

 
ルートアカウント
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111:root",  ### Entire accounts(3)
                    "arn:aws:iam::222:root",
                    "arn:aws:iam::333:root"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::omop-fhir",
                "arn:aws:s3:::omop-fhir/*",
                "arn:aws:s3:::omop-fhir2",
                "arn:aws:s3:::omop-fhir2/*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::111:role/skipper-deployment-*-Role",
                        "arn:aws:iam::222:role/skipper-deployment-*-Role",
                        "arn:aws:iam::333:role/skipper-deployment-*-Role"
                    ]
                }
            }
        }
    ]
}

 

これが変換のソースです。では、ターゲットである OMOP データベースに移りましょう。


OMOP の紹介

もう 1 つのデプロイメントである「IRIS 上の OMOP」を簡単に見ながら共通データモデルをご紹介します。

OMOP(Observational Medical Outcomes Partnership)データベースは、複数のソースをサポートするために途方もない複雑さを、CDM と呼ばれる共通データモデルにまとめる方法を示す記念碑的なものです。コミュニティ外部のさらに詳しい説明は、コピペコンテンツ(またはさらに酷い生成コンテンツ)になりますが、このコミュニティのドキュメントは本当によくできています。

「SQL クエリツール」ナビゲーションに移動すると、InterSystems の共通データモデルの実装を確認できます。これは、OHDSI コミュニティのよく知られた OMOP スキーマの図の横に表示されます。

この作業はここまでです。変換目的のみでサービスを使用するためのもう 1 つのオプションを調べてみましょう。

BYODB(所有データベースの持ち込み)

前回プロビジョニングした際に、データベースを無料で入手しましたが、別のデータベースをターゲットにする場合は、この記事を書いた時点でサービスが Postgres 構成への変換もサポートしたため、確実に行えます。このために、Amazon RDS を介して外部データベースを操作し、サービスに接続する方法を説明します。


計算


ここにフラグを立てて、もう 1 つの 👣🔫 に注意を喚起しようと思います。独自のデータベースを持ち込む場合、サービスに合わせてデータベースのサイズを決定する際に「Biggie Smalls」と呼んでいます。InterSystems は、データベース側に対する変換側のサイズ設定を非常に適切に行うため、変換パフォーマンスの速度は書き込み先の SQL インスタンスに依存するという事実を考慮し、それに応じて行う必要があります。一部の人にとっては当たり前のことかもしれませんが、RDS、Google Cloud SQL などを安く利用​​したため、OMOP データベースへの FHIR バンドルの永続時間に影響が出ました。これを目撃したときに、指摘しておこうと思いました。

そうは言っても、私はまったく逆のことをしています。Jeff Bezos に可能な限り最小限の金額を渡し、db.t4g.micro postgres RDS インスタンスを使用しています。

これを公開して、データベースに対応するリージョンの証明書バンドルのダウンロードに移ります。 .pem 形式であることを確認してください。
次に、データベースとの対話方法に関係なく、データベースインスタンスに接続し、DATABASE と SCHEMA を作成します。


OMOP CDM 5.4 のロード

では、OHDSI コミュニティの友人たちの協力を得て、OHDSI ツールを使用して、OMOP 共通データ モデル スキーマを含む RStudio バージョン 5.4 でサポートされているスキーマをプロビジョニングしましょう。

install.packages("devtools")
devtools::install_github("OHDSI/CommonDataModel")
install.packages("DatabaseConnector")
install.packages("SqlRender")
Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = "/home/sween/Desktop/OMOP/iris-omop-extdb/jars")
library(DatabaseConnector)
downloadJdbcDrivers("postgresql")

必要なものが揃ったので、postgres インスタンスに接続し、上記でプロビジョニングした OMOPCDM54 にテーブルを作成しました。
接続

cd <- DatabaseConnector::createConnectionDetails(dbms = "postgresql",
                                                 server = "extrdp-ops.biggie-smalls.us-east-2.rds.amazonaws.com/OMOPCDM54",
                                                 user = "postgres",
                                                 password = "REDACTED",
                                                 pathToDriver = "./jars"
                                                 )


作成

CommonDataModel::executeDdl(connectionDetails = cd,
                            cdmVersion = "5.4",
                            cdmDatabaseSchema = "omopcdm54"
                            )

「赤い海」を除けば、正しく実行できたことでしょう。

では、作業内容を確認しましょう。サービスとの使用に適した外部の postgres OMOP データベースがあるはずです。


OMOP Cloud Service の構成

ソースもあり、ターゲットもあります。では、サービスを構成したこれらを繋ぎ合わせ、FHIR から外部データベースへの変換パイプラインを完成させましょう。

InterSystems OMOP Cloud Service の準備が完了しました!
OMOP の旅はまだまだ続きます...

0
0 37