์ด ํํ ๋ฆฌ์ผ์์๋ Minimal Lower Layer Protocol(MLLP)์ ์ฌ์ฉํ์ฌ TCP/IP ์ฐ๊ฒฐ์ ํตํด HL7v2 ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ์ฆ๋ช ์๊ฐ MLLP ์ด๋ฏธ์ง์ ์๋ช ํ๋๋ก ํ๋ ค๋ฉด ์๋ช ๋ MLLP ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ TCP/IP ์ฐ๊ฒฐ๋ก HL7v2 ๋ฉ์์ง ์ ์ก์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
์ด ํํ ๋ฆฌ์ผ์์๋ ๋ค์ ํ๊ฒฝ์์ GitHub์ ํธ์คํ ๋ ์คํ์์ค MLLP ์ด๋ํฐ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ด๋ฅผ ์ค๋ช ํฉ๋๋ค.
- ๋ก์ปฌ/์จํ๋ ๋ฏธ์ค
- Cloud VPN์ด ์๋ GKE์ ์ปจํ ์ด๋
- Cloud VPN์ด ์๋ GKE์ ์ปจํ ์ด๋
๋ชฉํ
์ด ํํ ๋ฆฌ์ผ์ ์๋ฃํ๊ณ ๋๋ฉด ๋ค์์ ์์ ์ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
- Cloud Healthcare API๋ฅผ ์ฌ์ฉํ์ฌ MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ๋ก ๋น๋ํ๊ณ ๊ตฌ์ฑํ๊ณ HL7v2 ์ ์ฅ์๋ก์ HL7v2 ๋ฉ์์ง ์ ์ก์ ํ ์คํธํฉ๋๋ค.
- MLLP ์ด๋ํฐ๋ฅผ GKE์ ๋ฐฐํฌํ๊ณ Compute Engine VM ์ธ์คํด์ค์์ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
- '์จํ๋ ๋ฏธ์ค' ์ธ์คํด์ค์ MLLP ์ด๋ํฐ ๊ฐ์ ์ฐ๊ฒฐ์ ๋ณดํธํ๋ VPN์ ๊ตฌ์ฑํ๊ณ '์จํ๋ ๋ฏธ์ค' ์ธ์คํด์ค์์ HL7v2 ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.
๋น์ฉ
์ด ๋ฌธ์์์๋ ๋น์ฉ์ด ์ฒญ๊ตฌ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ Google Cloud๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Cloud Healthcare API
- Google Kubernetes Engine
- Compute Engine
- Cloud VPN
- Pub/Sub
ํ๋ก์ ํธ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ์์ ๋น์ฉ์ ์ฐ์ถํ๋ ค๋ฉด ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
์ด ํํ ๋ฆฌ์ผ์ ์์ํ๊ธฐ ์ ์ MLLP ๋ฐ Google Cloud MLLP ์ด๋ํฐ๋ฅผ ๊ฒํ ํ์ฌ Minimal Lower Layer Protocol(MLLP)์ ๋ํ ๊ฐ๋ ๋ฌธ์๋ฅผ ์์งํ์ธ์. ๊ฐ๋ ๋ฌธ์๋ MLLP ๊ฐ์, ๊ด๋ฆฌ ์์คํ ์ด MLLP ์ฐ๊ฒฐ์ ํตํด Cloud Healthcare API์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ, MLLP ๋ณด์์ ๊ธฐ๋ณธ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค.
MLLP ์ด๋ํฐ๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋จผ์ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ง๋ค๊ณ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ํ์ํ API๋ฅผ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Healthcare API, Google Kubernetes Engine, Container Registry, and Pub/Sub APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Healthcare API, Google Kubernetes Engine, Container Registry, and Pub/Sub APIs.
- Kubernetes Engine API ๋ฐ ๊ด๋ จ ์๋น์ค๊ฐ ์ฌ์ฉ ์ค์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ ธ ์ ํ
์ด ํํ ๋ฆฌ์ผ์ ์๋ฃํ๋ ค๋ฉด Cloud Shell ๋๋ ๋ก์ปฌ ์ ธ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
Cloud Shell์ Google Cloud์์ ํธ์คํ
๋๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์
ธ ํ๊ฒฝ์
๋๋ค. Cloud Shell์๋ gcloud CLI ๋ฐ kubectl
๋๊ตฌ๊ฐ ์ฌ์ ์ค์น๋์ด ์์ต๋๋ค. gcloud CLI๋ Google Cloud์ ๊ธฐ๋ณธ ๋ช
๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. kubectl
๋ GKE ํด๋ฌ์คํฐ์์ ๋ช
๋ น์ด๋ฅผ ์คํํ๊ธฐ ์ํ ๋ช
๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ก์ปฌ ์ ธ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ gcloud CLI๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
Cloud Shell์ ์ด๊ฑฐ๋ ๋ก์ปฌ ์ ธ์ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
Cloud Shell
Cloud Shell์ ์์ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
Google Cloud ์ฝ์๋ก ์ด๋ํฉ๋๋ค.
์ฝ์์ ์ค๋ฅธ์ชฝ ์๋จ์์ Activate Google Cloud Shell(Google Cloud Shell ํ์ฑํ) ๋ฒํผ(
)์ ํด๋ฆญํฉ๋๋ค.
Cloud Shell ์ธ์
์ด ์ฝ์ ์๋์ชฝ ํ๋ ์ ์์์ ์ด๋ฆฝ๋๋ค. ์ด ์
ธ์ ์ฌ์ฉํ์ฌ gcloud
๋ฐ kubectl
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
๋ก์ปฌ ์ ธ
gcloud CLI ๋ฐ kubectl
๋๊ตฌ๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
- Google Cloud CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
๋ก์ปฌ์์ ์ด๋ํฐ๋ฅผ ํ ์คํธํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ๋จ๊ณ๋ฅผ ์๋ฃํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ฐ์ดํฐ ์ธํธ ๋ง๋ค๊ธฐ๋ฅผ ๊ณ์ ์งํํ ์ ์์ต๋๋ค. GKE์ ์ด๋ํฐ๋ฅผ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ
kubectl
๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ค์นํฉ๋๋ค.gcloud components install kubectl
๋ฐ์ดํฐ ์ธํธ ๋ง๋ค๊ธฐ
Cloud Healthcare API ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ง ๋ง๋ค์ง ์์๋ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ญ๋๋ค.
์ฝ์
- Google Cloud ์ฝ์์์ ๋ฐ์ดํฐ ์ธํธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ธํธ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
-
์ด๋ฆ ํ๋์ ๋ฐ์ดํฐ ์ธํธ์ ์๋ณ์๋ฅผ ์
๋ ฅํฉ๋๋ค. ๋ฐ์ดํฐ ์ธํธ ID์๋ ๋ค์์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- ํด๋น ์์น์ ๊ณ ์ ID
- ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ 1~256์์ ์ ๋์ฝ๋ ๋ฌธ์์ด:
- ์ซ์
- ํธ์ง
- ๋ฐ์ค
- ๋์
- ๋ง์นจํ
-
์์น ์ ํ ์น์
์์ ๋ค์ ์์น ์ ํ ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค.
- ๋ฆฌ์ : ๋ฐ์ดํฐ ์ธํธ๊ฐ Google Cloud ๋ฆฌ์ ํ๋ ๋ด์ ์๊ตฌ์ ์ผ๋ก ์์ต๋๋ค. ์ ํํ ํ ๋ฆฌ์ ํ๋์ ์์น๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ์ ํํฉ๋๋ค.
- ๋ฉํฐ ๋ฆฌ์ : ๋ฐ์ดํฐ ์ธํธ๊ฐ ์ฌ๋ฌ Google Cloud ๋ฆฌ์ ์ ๊ฑธ์ณ ์๋ ํ๋์ ์์น ๋ด์ ์๊ตฌ์ ์ผ๋ก ์์ต๋๋ค. ์ ํํ ํ ๋ฉํฐ ๋ฆฌ์ ํ๋์ ๋ฉํฐ ๋ฆฌ์ ์์น๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ์ ํํฉ๋๋ค.
- ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ฐ์ดํฐ ์ธํธ ๋ชฉ๋ก์ ํ์๋ฉ๋๋ค.
gcloud
๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ค๋ ค๋ฉด gcloud healthcare datasets create
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud healthcare datasets create DATASET_ID \ --location=LOCATION
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
Create request issued for: [DATASET_ID] Waiting for operation [OPERATION_ID] to complete...done. Created dataset [DATASET_ID].
Pub/Sub ์ฃผ์ ๋ฐ ๊ตฌ๋ ๋ง๋ค๊ธฐ
๋ฉ์์ง๊ฐ ์์ฑ๋๊ฑฐ๋ ์์ง๋ ๋ ์๋ฆผ์ ๋ฐ์ผ๋ ค๋ฉด HL7v2 ์ ์ฅ์์ Pub/Sub ์ฃผ์ ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Pub/Sub ์๋ฆผ ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
์ฃผ์ ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
์ฝ์
Google Cloud ์ฝ์์์ Pub/Sub ์ฃผ์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์ฃผ์ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
URI์ ํจ๊ป ์ฃผ์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
projects/PROJECT_ID/topics/TOPIC_NAME
์ฌ๊ธฐ์ PROJECT_ID๋ Google Cloud ํ๋ก์ ํธ ID์ ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
์ฃผ์ ๋ฅผ ๋ง๋ค๋ ค๋ฉด gcloud pubsub topics create
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud pubsub topics create projects/PROJECT_ID/topics/TOPIC_NAME
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
Created topic [projects/PROJECT_ID/topics/TOPIC_NAME].
๊ตฌ๋ ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฝ์
Google Cloud ์ฝ์์์ Pub/Sub ์ฃผ์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
ํ๋ก์ ํธ ์ฃผ์ ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ตฌ๋ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ตฌ๋ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
projects/PROJECT_ID/subscriptions/SUBSCRIPTION_NAME
์ ์ก ์ ํ์ ๊ฐ์ ธ์ค๊ธฐ๋ก ์ค์ ํ ๋ค์ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
๊ตฌ๋
์ ๋ง๋ค๋ ค๋ฉด gcloud pubsub subscriptions create
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud pubsub subscriptions create SUBSCRIPTION_NAME \ --topic=projects/PROJECT_ID/topics/TOPIC_NAME
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
Created subscription [projects/PROJECT_ID/subscriptions/SUBSCRIPTION_NAME].
Pub/Sub ์ฃผ์ ๋ก ๊ตฌ์ฑ๋ HL7v2 ์ ์ฅ์๋ฅผ ๋ง๋ค๊ธฐ
HL7v2 ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ Pub/Sub ์ฃผ์ ๋ก ๊ตฌ์ฑํฉ๋๋ค. HL7v2 ์ ์ฅ์๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ฐ์ดํฐ ์ธํธ๊ฐ ์ด๋ฏธ ์์ฑ๋ ์ํ์ฌ์ผ ํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ HL7v2 ์ ์ฅ์ ๋ฐ Pub/Sub ์ฃผ์ ์ ๋์ผํ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Pub/Sub ์ฃผ์ ๋ก ๊ตฌ์ฑ๋ HL7v2 ์ ์ฅ์๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
curl
curl -X POST \ --data "{ 'notificationConfigs': [ { 'pubsubTopic': 'projects/PROJECT_ID/topics/PUBSUB_TOPIC', 'filter': '' } ] }" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID", "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC" } ] }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body "{ 'notificationConfigs': [ { 'pubsubTopic': 'projects/PROJECT_ID/topics/PUBSUB_TOPIC', 'filter': '' } ] }" ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID", "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC" } ] }
Pub/Sub ๊ถํ ๊ตฌ์ฑ
HL7v2 ๋ฉ์์ง๊ฐ ์์ฑ๋๊ฑฐ๋ ์์ง๋ ๋ Pub/Sub์ ์๋ฆผ์ ๋ณด๋ด๋ ค๋ฉด Cloud Healthcare API์์ Pub/Sub ๊ถํ์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด ๋จ๊ณ๋ ํ๋ก์ ํธ๋ณ๋ก ํ ๋ฒ ์ํํด์ผ ํฉ๋๋ค.
ํ๋ก์ ํธ์ ์๋น์ค ๊ณ์ ์ ํ์ํ pubsub.publisher
์ญํ ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฝ์
Google Cloud ์ฝ์์ IAM ํ์ด์ง์์ Healthcare ์๋น์ค ์์ด์ ํธ ์ญํ ์ด ๊ด๋ จ ํ๋ก์ ํธ ์๋น์ค ๊ณ์ ์ ์ญํ ์ด์ ํ์๋๋์ง ํ์ธํฉ๋๋ค. ๊ณ์ ์ด๋ฆ์ service-PROJECT_NUMBER@gcp-sa-healthcare.iam.gserviceaccount.com์ ๋๋ค. PROJECT_NUMBER ์ฐพ๊ธฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ ์๋ณ์ ์ฐธ์กฐํ์ธ์.
์ญํ ๊ณผ ์ผ์นํ๋ ์์ ์ด์์ ์ฐํ ์์ด์ฝ์ ํด๋ฆญํฉ๋๋ค. ๊ถํ ์์ ์ฐฝ์ด ์ด๋ฆฝ๋๋ค.
๋ค๋ฅธ ์ญํ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ ๋ค์ Pub/Sub ๊ฒ์์ ์ญํ ์ ๊ฒ์ํฉ๋๋ค.
์ญํ ์ ์ ํํ๊ณ ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
pubsub.publisher
์ญํ ์ด ์๋น์ค ๊ณ์ ์ ์ถ๊ฐ๋ฉ๋๋ค.
gcloud
์๋น์ค ๊ณ์ ๊ถํ์ ์ถ๊ฐํ๋ ค๋ฉด gcloud projects add-iam-policy-binding
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค. PROJECT_ID ๋ฐ PROJECT_NUMBER ์ฐพ๊ธฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ ์๋ณ์ ์ฐธ์กฐํ์ธ์.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-healthcare.iam.gserviceaccount.com \ --role=roles/pubsub.publisher
์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
MLLP ์ด๋ํฐ๋ Container Registry์ ์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง์ ์คํ ์ด์ง๋ ์ปจํ ์ด๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
์ต์ ๋ฒ์ ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker pull gcr.io/cloud-healthcare-containers/mllp-adapter:latest
MLLP ์ด๋ํฐ ๋ก์ปฌ ํ ์คํธ
์ด๋ํฐ๋ฅผ ๋ก์ปฌ๋ก ํ ์คํธํ ๋๋ ์์ ์, ๊ฒ์์ ๋๋ ๋ ๋ค๋ก ์คํ๋๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์์ ์ ๋ฐ ๊ฒ์์ ๊ตฌ์ฑ์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ํฐ๊ฐ ์์ ์๋ก ์คํ๋ ๋๋ ์ธ๋ถ ์์ค๋ก๋ถํฐ HL7v2 ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ๋ฉ์์ง๋ฅผ HL7v2 ์ ์ฅ์์ ์์งํ๋๋ก
messages.ingest
๋ฅผ ํธ์ถํ์ฌ, Pub/Sub ์๋ฆผ์ ๋ง๋ญ๋๋ค. ์ด ์๋ฆผ์ HL7v2 ์ ์ฅ์์ Pub/Sub ์ฃผ์ ๋ฅผ ๊ตฌ๋ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ ์ก๋ฉ๋๋ค. - ์ด๋ํฐ๊ฐ ๊ฒ์์๋ก ์คํ๋ ๋๋
messages.create
๋๋messages.ingest
๋ฅผ ์ฌ์ฉํ์ฌ HL7v2 ์ ์ฅ์์ ์์ฑ๋์๊ฑฐ๋ ์์ง๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ฆฌ์จํฉ๋๋ค. ๋ฉ์์ง๊ฐ ์์ฑ๋ ๋ค์์๋ Pub/Sub ์๋ฆผ์ด ์ด๋ํฐ๋ก ์ ์ก๋๊ณ ์ด๋ํฐ๊ฐ ๋ฉ์์ง๋ฅผ ์ธ๋ถ ์์ ์์ ๊ฒ์ํฉ๋๋ค.
๋ค์ ์น์ ์์๋ ์ด๋ํฐ๊ฐ ์์ ์ ๋๋ ๊ฒ์์ ์ญํ ์ ํ๋๋ก ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ก์ปฌ ๋จธ์ ์์ MLLP ์ด๋ํฐ๋ฅผ ์คํํ ์ ์๋ค๋ ๊ฒ์ ํ์ธํ ํ์๋ Google Kubernetes Engine์ MLLP ์ด๋ํฐ ๋ฐฐํฌ์ ๊ดํ ๋ค์ ์น์ ์ ๊ณ์ ์ํํ ์ ์์ต๋๋ค.
๋ก์ปฌ์์ MLLP ์ด๋ํฐ๋ฅผ ์์ ์๋ก ํ ์คํธ
์ด๋ํฐ๋ ์ธ๋ถ ์์ค(์: ๊ด๋ฆฌ ์ผํฐ)์์ HL7v2 ๋ฉ์์ง๋ฅผ ์์ ํ๋ฉด messages.ingest
๋ฅผ ํธ์ถํ๊ณ HL7v2 ๋ฉ์์ง๋ฅผ ๊ตฌ์ฑ๋ HL7v2 ์ ์ฅ์์ ์์งํฉ๋๋ค. ์ด๋ํฐ์ ์์ค ์ฝ๋์์ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ํฐ๋ฅผ ์์ ์๋ก ๋ก์ปฌ์์ ํ ์คํธํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋จธ์ ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker run \ --network=host \ -v ~/.config:/root/.config \ gcr.io/cloud-healthcare-containers/mllp-adapter \ /usr/mllp_adapter/mllp_adapter \ --hl7_v2_project_id=PROJECT_ID \ --hl7_v2_location_id=LOCATION \ --hl7_v2_dataset_id=DATASET_ID \ --hl7_v2_store_id=HL7V2_STORE_ID \ --export_stats=false \ --receiver_ip=0.0.0.0 \ --port=2575 \ --api_addr_prefix=https://healthcare.googleapis.com:443/v1 \ --logtostderr
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT_ID๋ HL7v2 ์ ์ฅ์๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION์ HL7v2 ์ ์ฅ์๊ฐ ์๋ ๋ฆฌ์ ์ ๋๋ค.
- DATASET_ID๋ HL7v2 ์ ์ฅ์์ ์์ ๋ฐ์ดํฐ ์ธํธ ID์ ๋๋ค.
- HL7V2_STORE_ID๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ผ HL7v2 ์ ์ฅ์์ ID์ ๋๋ค.
์ด์ ๋ช ๋ น์ด๋ฅผ ์คํํ ํ ์ด๋ํฐ๋ ๋ค์๊ณผ ์ ์ฌํ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ํฌํธ 2575์ 127.0.0.1 IP ์ฃผ์์์ ๋ก์ปฌ ๋จธ์ ์์ ์คํ๋๊ธฐ ์์ํฉ๋๋ค.
I0000 00:00:00.000000 1 healthapiclient.go:171] Dialing connection to https://healthcare.googleapis.com:443/v1 I0000 00:00:00.000000 1 mllp_adapter.go:89] Either --pubsub_project_id or --pubsub_subscription is not provided, notifications of the new messages are not read and no outgoing messages will be sent to the target MLLP address.
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ๋ฌธ์ ํด๊ฒฐ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
Mac OS๋ฅผ ์ฌ์ฉ ์ค์ด๊ณ ์ด์ ๋ช ๋ น์ด๊ฐ
Connection refused
์ค๋ฅ์ ํจ๊ป ์คํจํ๋ ๊ฒฝ์ฐ ๋ก์ปฌ ์คํ ๋ Connection refused ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.์ด์ ๋ช ๋ น์ด๊ฐ
healthapiclient.NewHL7V2Client: oauth2google.DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
์ค๋ฅ์ ํจ๊ป ์คํจํ๋ ๊ฒฝ์ฐ ๋ก์ปฌ์์ ์คํํ ๋could not find default credentials
์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.๋ค๋ฅธ ์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ฆ ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด๋ํฐ๊ฐ ํฌ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ก ์คํ๋๋ ๋์ ํ ์คํธ๋ฅผ ๊ณ์ํ๋ ค๋ฉด ๋ก์ปฌ ๋จธ์ ์์ ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
์ ํฐ๋ฏธ๋์์ Netcat์ ์ค์นํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-sample.txt
ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ๋ก์ปฌ ๋จธ์ ์ ์ ์ฅํฉ๋๋ค.HL7v2 ๋ฉ์์ง๋ฅผ ์ด๋ํฐ๋ก ์ ์กํ๋ ค๋ฉด ํ์ผ์ ๋ค์ด๋ก๋ํ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. MLLP ์ด๋ํฐ๊ฐ ๋ก์ปฌ ๋จธ์ ์์ ํฌํธ 2575๋ก ๋ฆฌ์จํ๊ณ ์์ต๋๋ค. ์ด ๋ช ๋ น์ด๋ MLLP ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.
Linux
echo -n -e "\x0b$(cat hl7v2-mllp-sample.txt)\x1c\x0d" | nc -q1 localhost 2575 | less
๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์์ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋๋ฉด ์ด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
^KMSH|^~\&|TO_APP|TO_FACILITY|FROM_APP|FROM_FACILITY|19700101010000||ACK|c507a97e-438d-44b0-b236-ea95e5ecbbfb|P|2.5^MMSA|AA|20150503223000^\
์ด ์ถ๋ ฅ์ HL7v2 ์ ์ฅ์๊ฐ
AA
(Application Accept
) ์๋ต ์ ํ์ผ๋ก ์๋ตํ์์ ๋ํ๋ ๋๋ค. ์ฆ, ๋ฉ์์ง๊ฐ ๊ฒ์ฆ๋๊ณ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋ฉ๋๋ค.์ด๋ํฐ๋ฅผ ์คํํ ํฐ๋ฏธ๋์ ์ด์ด ๋ฉ์์ง๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ก๋์๋์ง ํ์ธํ ์๋ ์์ต๋๋ค. ์ถ๋ ฅ์ ๋ค์ ์ํ๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
I0000 00:00:00.000000 1 healthapiclient.go:171] Dialing connection to https://healthcare.googleapis.com:443/v1 I0000 00:00:00.000000 1 mllp_adapter.go:89] Either --pubsub_project_id or --pubsub_subscription is not provided, notifications of the new messages are not read and no outgoing messages will be sent to the target MLLP address. I0213 00:00:00.000000 1 healthapiclient.go:190] Sending message of size 319. I0213 00:00:00.000000 1 healthapiclient.go:223] Message was successfully sent.
๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์์ ์ ์ฅ๋๋ฏ๋ก
messages.list
๋ฅผ ํธ์ถํ์ฌ ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.curl
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Get ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
๋ก์ปฌ์์ MLLP ์ด๋ํฐ๋ฅผ ๊ฒ์์๋ก ํ ์คํธ
์ด๋ํฐ๋ฅผ ๊ฒ์์๋ก ํ
์คํธํ ๋๋ messages.create
๋๋ messages.ingest
๋ฅผ ํธ์ถํ๊ณ ๋ฉ์์ง ํ์ผ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ก ์ ๊ณตํ์ฌ ๋ฉ์์ง๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ํฐ๊ฐ messages.create
๋ฐ messages.ingest
๋ฅผ ํตํด ์ ์ก๋ Pub/Sub ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ํ์ธํฉ๋๋ค.
์ด๋ํฐ๊ฐ Pub/Sub ๋ฉ์์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ธ์ถํ๊ณ ์ ์กํ๋ฉด ์๋ฆผ์ด ํ์๋ฉ๋๋ค. ์ด๋ํฐ๊ฐ Pub/Sub ๊ตฌ๋ ์์ด๋ฏ๋ก ์ด๋ฌํ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ํ์ธํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ํฐ๋ก ๊ตฌ์ฑํ Pub/Sub ๊ตฌ๋ ์ ๋ฉ์์ง ํ์์ ์ญ์ ๋ฉ๋๋ค.
Pub/Sub ๊ตฌ๋ ์์ ๊ฐ์ ธ์ค๊ณ ๋ฉ์์ง๊ฐ ๊ฒ์๋์๋์ง ๋ณ๋๋ก ํ์ธํ๋ ค๋ฉด ์ด์ ์ ๋ง๋ ์ฃผ์ ์ ํ ๋น๋ ๋ ๋ฒ์งธ Pub/Sub ๊ตฌ๋ ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ ๋ฒ์งธ ๊ตฌ๋ ์ผ๋ก ์ ์ก๋ ๋ฉ์์ง๋ ์ด๋ํฐ์์ ์๋์ผ๋ก ํ์ธ๋์ง ์๊ณ ๊ณ์ ์ ์ง๋๋ฏ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ด์ ์ ๋ง๋ ์ฃผ์ ์ ํ ๋น๋ ๋ ๋ฒ์งธ Pub/Sub ๊ตฌ๋ ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฝ์
Google Cloud ์ฝ์์์ Pub/Sub ์ฃผ์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
ํ๋ก์ ํธ ์ฃผ์ ๋ฅผ ํด๋ฆญํฉ๋๋ค. ์ต์ด ๊ตฌ๋ ์ ๋ง๋ค ๋ ์ฌ์ฉํ ์ฃผ์ ์ ๋๋ค.
๊ตฌ๋ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ตฌ๋ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
projects/PROJECT_ID/subscriptions/SECOND_SUBSCRIPTION_NAME
์ ์ก ์ ํ์ ๊ฐ์ ธ์ค๊ธฐ๋ก ์ค์ ํฉ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
์ด์ ์ ๋ง๋ ์ฃผ์ ์ ํ ๋น๋ ๋ ๋ฒ์งธ Pub/Sub ๊ตฌ๋
์ ๋ง๋ค๋ ค๋ฉด gcloud pubsub subscriptions create
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud pubsub subscriptions create SECOND_SUBSCRIPTION_NAME --topic=projects/PROJECT_ID/topics/TOPIC_NAME
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
Created subscription [projects/PROJECT_ID/subscriptions/SECOND_SUBSCRIPTION_NAME].
์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ๊ฒ์์๋ก ํ ์คํธํ๋ ค๋ฉด ์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋จธ์ ์์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
Netcat์ ์ค์นํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-ack-sample.txt
ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ๋ก์ปฌ ๋จธ์ ์ ์ ์ฅํฉ๋๋ค. ์ด ํ์ผ์๋ ๋ฉ์์ง ๊ฒ์๋ฅผ ์๋ํ ๋ ์ด๋ํฐ์ ์๋ต์ผ๋ก ํ์ํ ACK ๋ฉ์์ง๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.Netcat์ด ํฌํธ 2525์์ ๋ค์ด์ค๋ ์ฐ๊ฒฐ์ ์์ ๋๊ธฐํ๊ฒ ๋ง๋ค๋ ค๋ฉด ํ์ผ์ ๋ค์ด๋ก๋ํ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
Linux
echo -n -e "\x0b$(cat hl7v2-mllp-ack-sample.txt)\x1c\x0d" | nc -q1 -lv -p 2525 | less
Netcat์ ์์ํ ํ ๋ค์ ์ํ๊ณผ ๋น์ทํ ์ถ๋ ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
listening on [any] 2525 ...
Netcat์ ํฌ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ก ์คํ๋๋ฏ๋ก ํ ์คํธ๋ฅผ ๊ณ์ํ๋ ค๋ฉด ๋ก์ปฌ ๋จธ์ ์์ ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
์ด๋ํฐ๋ฅผ ์์ํ๋ ค๋ฉด ์ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker run \ --network=host \ gcr.io/cloud-healthcare-containers/mllp-adapter \ /usr/mllp_adapter/mllp_adapter \ --hl7_v2_project_id=PROJECT_ID \ --hl7_v2_location_id=LOCATION \ --hl7_v2_dataset_id=DATASET_ID \ --hl7_v2_store_id=HL7V2_STORE_ID \ --export_stats=false \ --receiver_ip=127.0.0.1 --port 2575 \ --mllp_addr=127.0.0.1:2525 \ --pubsub_project_id=PROJECT_ID \ --pubsub_subscription=PUBSUB_SUBSCRIPTION \ --api_addr_prefix=https://healthcare.googleapis.com:443/v1 \ --logtostderr
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT_ID๋ HL7v2 ์ ์ฅ์๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION์ HL7v2 ์ ์ฅ์๊ฐ ์๋ ๋ฆฌ์ ์ ๋๋ค.
- DATASET_ID๋ HL7v2 ์ ์ฅ์์ ์์ ๋ฐ์ดํฐ ์ธํธ ID์ ๋๋ค.
- HL7V2_STORE_ID๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ผ HL7v2 ์ ์ฅ์์ ID์ ๋๋ค.
- PROJECT_ID๋ Pub/Sub ์ฃผ์ ๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- PUBSUB_SUBSCRIPTION์ Pub/Sub ์ฃผ์ ์ ์ฐ๊ฒฐ๋์ด ๋ง๋ ์ฒซ ๋ฒ์งธ ๊ตฌ๋ ์ด๋ฆ์ ๋๋ค. ์ด๋ํฐ๋ ์ด ๊ตฌ๋ ์ ๋ฉ์์ง๋ฅผ ์๋นํ๊ณ ์๋์ผ๋ก ํ์ธํ๋ฏ๋ก ์ฃผ์ ์ ๊ฒ์๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ ค๋ฉด ์ด์ ์ ๋ง๋ ๋ ๋ฒ์งธ ๊ตฌ๋ ์์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
์ด์ ๋ช ๋ น์ด๋ฅผ ์คํํ ํ ์ด๋ํฐ๋ ํฌํธ 2575์ 127.0.0.1 IP ์ฃผ์์์ ๋ก์ปฌ ๋จธ์ ์์ ์คํ๋๊ธฐ ์์ํฉ๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ๋ฌธ์ ํด๊ฒฐ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
Mac OS๋ฅผ ์ฌ์ฉ ์ค์ด๊ณ ์ด์ ๋ช ๋ น์ด๊ฐ
Connection refused
์ค๋ฅ์ ํจ๊ป ์คํจํ๋ ๊ฒฝ์ฐ ๋ก์ปฌ ์คํ ๋ Connection refused ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.์ด์ ๋ช ๋ น์ด๊ฐ
healthapiclient.NewHL7V2Client: oauth2google.DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
์ค๋ฅ์ ํจ๊ป ์คํจํ๋ ๊ฒฝ์ฐ ๋ก์ปฌ์์ ์คํํ ๋could not find default credentials
์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.๋ค๋ฅธ ์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ฆ ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด๋ํฐ๋ ํฌ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ก ์คํ๋๋ฏ๋ก ํ ์คํธ๋ฅผ ๊ณ์ํ๋ ค๋ฉด ๋ก์ปฌ ๋จธ์ ์์ ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
hl7v2-sample.json
ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ๋ก์ปฌ ๋จธ์ ์ ์ ์ฅํฉ๋๋ค. ํ์ผ์ ๋ค์ด๋ก๋ํ ๋๋ ํฐ๋ฆฌ์์messages.create
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋ง๋ญ๋๋ค.curl
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์
curl
์ ์ฌ์ฉํ๋POST
์์ฒญ๊ณผhl7v2-sample.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data-binary @hl7v2-sample.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZfEF8QXwyMDE4MDEwMTAwMDAwMHx8VFlQRV5BfDIwMTgwMTAxMDAwMDAwfFR8MC4wfHx8QUF8fDAwfEFTQ0lJDUVWTnxBMDB8MjAxODAxMDEwNDAwMDANUElEfHwxNAExMTFeXl5eTVJOfDExMTExMTExXl5eXk1STn4xMTExMTExMTExXl5eXk9SR05NQlI=", "sendFacility": "SEND_FACILITY", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
PowerShell
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์ Windows PowerShell์ ์ฌ์ฉํ๋
POST
์์ฒญ๊ณผhl7v2-sample.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile hl7v2-sample.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZfEF8QXwyMDE4MDEwMTAwMDAwMHx8VFlQRV5BfDIwMTgwMTAxMDAwMDAwfFR8MC4wfHx8QUF8fDAwfEFTQ0lJDUVWTnxBMDB8MjAxODAxMDEwNDAwMDANUElEfHwxNAExMTFeXl5eTVJOfDExMTExMTExXl5eXk1STn4xMTExMTExMTExXl5eXk9SR05NQlI=", "sendFacility": "SEND_FACILITY", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
๋ฉ์์ง๋ฅผ ๋ง๋ ํ MLLP ์ด๋ํฐ์์ ๋ค์๊ณผ ๋น์ทํ ์๋ต์ ๋ฐํํฉ๋๋ค.
I0214 00:00:00.000000 1 healthapiclient.go:244] Started to fetch message from the Cloud Healthcare API HL7V2 Store I0214 00:00:00.000000 1 healthapiclient.go:283] Message was successfully fetched from the Cloud Healthcare API HL7V2 Store.
Netcat์ ์คํํ ํฐ๋ฏธ๋์ ๋ค์ ์ํ๊ณผ ๋น์ทํ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค. ์ด ์ถ๋ ฅ์ ๋ฉ์์ง๊ฐ ๊ฒ์๋์์์ ๋ํ๋ ๋๋ค.
connect to [127.0.0.1] from localhost [127.0.0.1] 39522 ^KMSH|^~\&|A|SEND_FACILITY|A|A|20180101000000||TYPE^A|20180101000000|T|0.0|||AA||00|ASCII^MEVN|A00|20180101040000^MPID||14^A111^^^^MRN|11111111^^^^MRN~1111111111^^^^ORGNMBR^\
์ด ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ง๋ค ๋ ๋ฐ์ ์๋ต์
data
ํ๋์ ์๋ ๊ฐ์ ํด๋นํฉ๋๋ค. ์ด ๊ฐ์hl7v2-sample.json
ํ์ผ์data
๊ฐ๊ณผ ๋์ผํฉ๋๋ค.์ด๋ํฐ๊ฐ Pub/Sub ์ฃผ์ ์ ๊ฒ์ํ ๋ฉ์์ง๋ฅผ ๋ณด๋ ค๋ฉด ์์ฑํ ๋ ๋ฒ์งธ Pub/Sub ๊ตฌ๋ ์์
gcloud pubsub subscriptions pull
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud pubsub subscriptions pull --auto-ack SECOND_SUBSCRIPTION
์ด ๋ช ๋ น์ด๋ ์์ฑ๋ HL7v2 ๋ฉ์์ง์ ๋ํด ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค. ๋ฉ์์ง๊ฐ Pub/Sub์ ๊ฒ์๋์์์ ๋ํ๋ด๋
ATTRIBUTES
์ด์publish=true
๊ฐ์ ํ์ธํฉ๋๋ค.โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ | DATA | MESSAGE_ID | ATTRIBUTES | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------| | projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/HL7V2_MESSAGE_ID | 123456789012345 | msgType=ADT | | | | publish=true | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ
๋ค๋ฅธ ์ธ๋ถ ์์ ์์ ๋ฉ์์ง ๊ฒ์
์ฌ๋ฌ Pub/Sub ์ฃผ์ ๋ก HL7v2 ์ ์ฅ์๋ฅผ ๊ตฌ์ฑํ๊ณ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์๋ก ๋ค๋ฅธ Pub/Sub ์ฃผ์ ๋ก ์๋ฆผ์ ์ ์กํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ํ ๊ฐ Pub/Sub ์ฃผ์ ์ ๋ํด MLLP ์ด๋ํฐ๋ฅผ ์คํํ์ฌ ์๋ก ๋ค๋ฅธ ์ธ๋ถ ์์ ์์ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ฌ๋ฌ Pub/Sub ์ฃผ์ ์ ๊ฐ ์ฃผ์ ์ ๋ํ ํํฐ๋ก HL7v2 ์ ์ฅ์๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
Pub/Sub ์ฃผ์ ๋ฅผ 2๊ฐ ๋ง๋ค๊ณ ๊ฐ ์ฃผ์ ์ ๋ํด ํ๋์ ๊ตฌ๋ ์ ๋ง๋ญ๋๋ค. ์์ธํ ๋ด์ฉ์ Pub/Sub ์ฃผ์ ๋ฐ ๊ตฌ๋ ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
curl
curl -X PATCH \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data "{ 'notificationConfigs': [ { 'pubsubTopic': 'projects/PROJECT_ID/topics/PUBSUB_TOPIC', 'filter' : 'sendFacility=\"SEND_FACILITY_1\"' }, { 'pubsubTopic': 'projects/PROJECT_ID/topics/SECOND_PUBSUB_TOPIC', 'filter': 'sendFacility=\"SEND_FACILITY_2\"' } ] }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID?updateMask=notificationConfigs"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID", "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", "filter": "sendFacility=\"SEND_FACILITY_1\"" }, { "pubsubTopic": "projects/PROJECT_ID/topics/SECOND_PUBSUB_TOPIC", "filter": "sendFacility=\"SEND_FACILITY_2\"" } ] }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Patch ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body "{ 'notificationConfigs': [ { 'pubsubTopic' : 'projects/PROJECT_ID/topics/PUBSUB_TOPIC', 'filter': 'sendFacility=\"SEND_FACILITY_1\"' }, { 'pubsubTopic' : 'projects/PROJECT_ID/topics/SECOND_PUBSUB_TOPIC', 'filter' : 'sendFacility=\"SEND_FACILITY_2\"' } ] }" ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores?hl7V2StoreId=HL7V2_STORE_ID?updateMask=notificationConfigs" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID", "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", "filter": "sendFacility=\"SEND_FACILITY_1\"" }, { "pubsubTopic": "projects/PROJECT_ID/topics/SECOND_PUBSUB_TOPIC", "filter": "sendFacility=\"SEND_FACILITY_2\"" } ] }
๋ฉ์์ง ๋ผ์ฐํ ํ ์คํธ
๋ฉ์์ง ๋ผ์ฐํ ์ ํ ์คํธํ๋ ค๋ฉด ๋ค์ ์น์ ์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฒซ ๋ฒ์งธ ์์ ์ ๋ฐ ์ด๋ํฐ ๊ตฌ์ฑ ๋ฐ ์์
์ฒซ ๋ฒ์งธ ์์ ์์ ์ด๋ํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋จธ์ ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Netcat์ ์ค์นํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-ack-sample.txt
๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์๋ค๋ฉด ๋ค์ด๋ก๋ํฉ๋๋ค. ํ์ผ์๋ ์ด๋ํฐ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ ๋ ์๋ต์ผ๋ก ์ฌ์ฉ๋๋ACK
๋ฉ์์ง๊ฐ ํฌํจ๋ฉ๋๋ค.์ฒซ ๋ฒ์งธ ์์ ์์ ๋ํด ํฌํธ 2525๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
Linux
echo -n -e "\x0b$(cat hl7v2-mllp-ack-sample.txt)\x1c\x0d" | nc -q1 -lv -p 2525 | less
Netcat ํ๋ก์ธ์ค๊ฐ ์์๋๋ฉด ๋ค์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
listening on [any] 2525 ...
์ฒซ ๋ฒ์งธ ์ด๋ํฐ๋ฅผ ์์ํ๋ ค๋ฉด ์ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker run \ --network=host \ gcr.io/cloud-healthcare-containers/mllp-adapter \ /usr/mllp_adapter/mllp_adapter \ --hl7_v2_project_id=PROJECT_ID \ --hl7_v2_location_id=LOCATION \ --hl7_v2_dataset_id=DATASET_ID \ --hl7_v2_store_id=HL7V2_STORE_ID \ --export_stats=false \ --receiver_ip=127.0.0.1 --port 2575 \ --mllp_addr=127.0.0.1:2525 \ --pubsub_project_id=PROJECT_ID \ --pubsub_subscription=PUBSUB_SUBSCRIPTION \ --api_addr_prefix=https://healthcare.googleapis.com:443/v1 \ --logtostderr
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT_ID๋ HL7v2 ์ ์ฅ์๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION์ HL7v2 ์ ์ฅ์๊ฐ ์๋ ๋ฆฌ์ ์ ๋๋ค.
- DATASET_ID๋ HL7v2 ์ ์ฅ์์ ์์ ๋ฐ์ดํฐ ์ธํธ ID์ ๋๋ค.
- HL7V2_STORE_ID๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ผ HL7v2 ์ ์ฅ์์ ID์ ๋๋ค.
- PROJECT_ID๋ Pub/Sub ์ฃผ์ ๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- PUBSUB_SUBSCRIPTION์ ์ฒซ ๋ฒ์งธ Pub/Sub ์ฃผ์ ์ ์ฐ๊ฒฐ๋ ์ฒซ ๋ฒ์งธ ๊ตฌ๋ ์ ์ด๋ฆ์ ๋๋ค. ์ด๋ํฐ๋ ์ด ๊ตฌ๋ ์ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํ์ธํฉ๋๋ค.
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ ํ ์ด๋ํฐ๋ 127.0.0.1:2575์์ ๋ก์ปฌ ๋จธ์ ์์ ์คํ๋ฉ๋๋ค. ํฌํธ 2525์ ์ฒซ ๋ฒ์งธ ์ธ๋ถ ์์ ์์ ์ ๋ฉ์์ง๋ฅผ ๊ฒ์ํฉ๋๋ค.
๋ ๋ฒ์งธ ์์ ์ ๋ฐ ์ด๋ํฐ ๊ตฌ์ฑ ๋ฐ ์์
๋ ๋ฒ์งธ ์์ ์์ ์ด๋ํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฌ์ ๋น๋๋ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋จธ์ ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Netcat์ ์ค์นํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-ack-sample.txt
๋ฅผ ๋ค์ด๋ก๋ํ์ง ์์๋ค๋ฉด ๋ค์ด๋ก๋ํฉ๋๋ค. ํ์ผ์๋ ์ด๋ํฐ๊ฐ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ ๋ ์๋ต์ผ๋ก ์ฌ์ฉ๋๋ACK
๋ฉ์์ง๊ฐ ํฌํจ๋ฉ๋๋ค.๋ ๋ฒ์งธ ์์ ์์ ๋ํด ํฌํธ 2526์ ์ค์ ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
Linux
echo -n -e "\x0b$(cat hl7v2-mllp-ack-sample.txt)\x1c\x0d" | nc -q1 -lv -p 2526 | less
Netcat ํ๋ก์ธ์ค๊ฐ ์์๋๋ฉด ๋ค์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
listening on [any] 2526 ...
๋ ๋ฒ์งธ ์ด๋ํฐ๋ฅผ ์์ํ๋ ค๋ฉด ์ ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
docker run \ --network=host \ gcr.io/cloud-healthcare-containers/mllp-adapter \ /usr/mllp_adapter/mllp_adapter \ --hl7_v2_project_id=PROJECT_ID \ --hl7_v2_location_id=LOCATION \ --hl7_v2_dataset_id=DATASET_ID \ --hl7_v2_store_id=HL7V2_STORE_ID \ --export_stats=false \ --receiver_ip=127.0.0.1 --port 2576 \ --mllp_addr=127.0.0.1:2526 \ --pubsub_project_id=PROJECT_ID \ --pubsub_subscription=SECOND_PUBSUB_SUBSCRIPTION \ --api_addr_prefix=https://healthcare.googleapis.com:443/v1 \ --logtostderr
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT_ID๋ HL7v2 ์ ์ฅ์๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION์ HL7v2 ์ ์ฅ์๊ฐ ์๋ ๋ฆฌ์ ์ ๋๋ค.
- DATASET_ID๋ HL7v2 ์ ์ฅ์์ ์์ ๋ฐ์ดํฐ ์ธํธ ID์ ๋๋ค.
- HL7V2_STORE_ID๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ผ HL7v2 ์ ์ฅ์์ ID์ ๋๋ค.
- PROJECT_ID๋ Pub/Sub ์ฃผ์ ๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- SECOND_PUBSUB_SUBSCRIPTION์ ๋ ๋ฒ์งธ Pub/Sub ์ฃผ์ ์ ์ฐ๊ฒฐ๋ ๋ ๋ฒ์งธ ๊ตฌ๋ ์ ์ด๋ฆ์ ๋๋ค. ์ด๋ํฐ๋ ์ด ๊ตฌ๋ ์ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํ์ธํฉ๋๋ค.
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ ํ ์ด๋ํฐ๋ ๋ก์ปฌ ๋จธ์ ์์ ํฌํธ 127.0.0.1:2576 IP ์ฃผ์๋ก ์คํ๋๊ธฐ ์์ํฉ๋๋ค. ํฌํธ 2526์ผ๋ก ๋ ๋ฒ์งธ ์ธ๋ถ ์์ ์์ ์ ๋ฉ์์ง๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ์์ ๋ฉ์์ง ๊ฒ์
์ฒซ ๋ฒ์งธ ์ธ๋ถ ์์ ์์๋ง ๊ฒ์๋๋ ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
hl7v2-sample1.json
์ ๋ค์ด๋ก๋ํฉ๋๋ค.hl7v2-sample1.json
์ ๋ค์ด๋ก๋ํ ๋๋ ํฐ๋ฆฌ์์messages.create
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋ง๋ญ๋๋ค.curl
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์
curl
์ ์ฌ์ฉํ๋POST
์์ฒญ๊ณผhl7v2-sample1.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data-binary @hl7v2-sample1.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZXzF8QXxBfDIwMTgwMTAxMDAwMDAwfHxUWVBFXkF8MjAxODAxMDEwMDAwMDB8VHwwLjB8fHxBQXx8MDB8QVNDSUkNRVZOfEEwMHwyMDE4MDEwMTA0MDAwMA1QSUR8fDE0ATExMV5eXl5NUk58MTExMTExMTFeXl5eTVJOfjExMTExMTExMTFeXl5eT1JHTk1CUg==", "sendFacility": "SEND_FACILITY_1", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
PowerShell
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์ Windows PowerShell์ ์ฌ์ฉํ๋
POST
์์ฒญ๊ณผhl7v2-sample1.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile hl7v2-sample1.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZXzF8QXxBfDIwMTgwMTAxMDAwMDAwfHxUWVBFXkF8MjAxODAxMDEwMDAwMDB8VHwwLjB8fHxBQXx8MDB8QVNDSUkNRVZOfEEwMHwyMDE4MDEwMTA0MDAwMA1QSUR8fDE0ATExMV5eXl5NUk58MTExMTExMTFeXl5eTVJOfjExMTExMTExMTFeXl5eT1JHTk1CUg==", "sendFacility": "SEND_FACILITY_1", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
์ด ์๋ต์์
sendFacility
๋SEND_FACILITY_1
๋ก ์ค์ ๋๋ฏ๋ก, Pub/Sub ์๋ฆผ์ด ์ฒซ ๋ฒ์งธ Pub/Sub ์ฃผ์ ๋ก๋ง ์ ์ก๋ฉ๋๋ค. ๋ฉ์์ง๋ฅผ ๋ง๋ ํ ์ฒซ ๋ฒ์งธ MLLP ์ด๋ํฐ๊ฐ ๋ค์ ์๋ต์ ๋ฐํํฉ๋๋ค.I0214 00:00:00.000000 1 healthapiclient.go:266] Started to fetch message. I0214 00:00:00.000000 1 healthapiclient.go:283] Message was successfully fetched.
๋ ๋ฒ์งธ Pub/Sub ์ฃผ์ ๋ก ์๋ฆผ์ด ์ ์ก๋๊ธฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฒ์งธ MLLP ์ด๋ํฐ๋ ์๋ต์ ๋ฐํํ์ง ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ Netcat ํ๋ก์ธ์ค๋ฅผ ์คํํ ํฐ๋ฏธ๋์ ๋ค์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค. ์ด ์ถ๋ ฅ์ ๋ฉ์์ง๊ฐ ๊ฒ์๋์์์ ๋ํ๋ ๋๋ค.
connect to [127.0.0.1] from localhost [127.0.0.1] 39522 ^KMSH|^~\&|A|SEND_FACILITY_1|A|A|20180101000000||TYPE^A|20180101000000|T|0.0|||AA||00|ASCII^MEVN|A00|20180101040000^MPID||14^A111^^^^MRN|11111111^^^^MRN~1111111111^^^^ORGNMBR^\
์ด ์ถ๋ ฅ์ ๋ฉ์์ง๋ฅผ ๋ง๋ค ๋ ์์ ๋ ์๋ต์
data
ํ๋์ ์๋ ๊ฐ์ ํด๋นํฉ๋๋ค. ์ด ๊ฐ์hl7v2-sample1.json
ํ์ผ์data
๊ฐ๊ณผ ๋์ผํฉ๋๋ค.
๋ ๋ฒ์งธ ์์ ์์ ๋ฉ์์ง ๊ฒ์
๋ ๋ฒ์งธ ์ธ๋ถ ์์ ์์๋ง ๊ฒ์๋๋ ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
๋ก์ปฌ ๋จธ์ ์์ ์ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
๋ ๋ฒ์งธ ์ธ๋ถ ์์ ์์๊ฒ๋ง ๊ฒ์๋๋ ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
hl7v2-sample2.json
์ ๋ค์ด๋ก๋ํ์ธ์.hl7v2-sample2.json
์ ๋ค์ด๋ก๋ํ ๋๋ ํฐ๋ฆฌ์์messages.create
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋ง๋ญ๋๋ค.curl
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์
curl
์ ์ฌ์ฉํ๋POST
์์ฒญ๊ณผhl7v2-sample2.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.curl -X POST \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ --data-binary @hl7v2-sample2.json \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZXzJ8QXxBfDIwMTgwMTAxMDAwMDAwfHxUWVBFXkF8MjAxODAxMDEwMDAwMDB8VHwwLjB8fHxBQXx8MDB8QVNDSUkNRVZOfEEwMHwyMDE4MDEwMTA0MDAwMA1QSUR8fDE0ATExMV5eXl5NUk58MTExMTExMTFeXl5eTVJOfjExMTExMTExMTFeXl5eT1JHTk1CUg==", "sendFacility": "SEND_FACILITY_2", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
PowerShell
HL7v2 ๋ฉ์์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด
POST
์์ฒญ์ ์ํํ๊ณ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.- ์์ ๋ฐ์ดํฐ ์ธํธ์ ์ด๋ฆ
- HL7v2 ์ ์ฅ์์ ์ด๋ฆ
- ๋ฉ์์ง
- ์ก์ธ์ค ํ ํฐ
๋ค์ ์ํ์ Windows PowerShell์ ์ฌ์ฉํ๋
POST
์์ฒญ๊ณผhl7v2-sample2.json
์ด๋ผ๋ ์ํ JSON ํ์ผ์ ๋ณด์ฌ์ค๋๋ค.$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Post ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -InFile hl7v2-sample2.json ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๊ฐ JSON ํ์์ผ๋ก ์๋ต์ ๋ฐํํฉ๋๋ค.
{ "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID", "data": "TVNIfF5+XCZ8QXxTRU5EX0ZBQ0lMSVRZXzJ8QXxBfDIwMTgwMTAxMDAwMDAwfHxUWVBFXkF8MjAxODAxMDEwMDAwMDB8VHwwLjB8fHxBQXx8MDB8QVNDSUkNRVZOfEEwMHwyMDE4MDEwMTA0MDAwMA1QSUR8fDE0ATExMV5eXl5NUk58MTExMTExMTFeXl5eTVJOfjExMTExMTExMTFeXl5eT1JHTk1CUg==", "sendFacility": "SEND_FACILITY_2", "sendTime": "2018-01-01T00:00:00Z", "messageType": "TYPE", "createTime": "1970-01-01T00:00:00Z", "patientIds": [ { "value": "14\u0001111", "type": "MRN" }, { "value": "11111111", "type": "MRN" }, { "value": "1111111111", "type": "ORGNMBR" } ] }
sendFacility๊ฐ
SEND_FACILITY_2
์ด๋ฏ๋ก, Pub/Sub ์๋ฆผ์ด ๋ ๋ฒ์งธ Pub/Sub ์ฃผ์ ๋ก๋ง ์ ์ก๋ฉ๋๋ค. ๋ฉ์์ง๋ฅผ ๋ง๋ ํ ์ฒซ ๋ฒ์งธ MLLP ์ด๋ํฐ๋ ์๋ต์ ๋ฐํํ์ง ์์ง๋ง, ๋ ๋ฒ์งธ MLLP ์ด๋ํฐ๊ฐ ๋ค์ ์๋ต์ ๋ฐํํฉ๋๋ค.I0214 00:00:00.000000 1 healthapiclient.go:266] Started to fetch message. I0214 00:00:00.000000 1 healthapiclient.go:283] Message was successfully fetched.
๋ ๋ฒ์งธ Netcat ํ๋ก์ธ์ค๋ฅผ ์คํํ ํฐ๋ฏธ๋์ ๋ค์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค. ์ด ์ถ๋ ฅ์ ๋ฉ์์ง๊ฐ ๊ฒ์๋์์์ ๋ํ๋ ๋๋ค.
connect to [127.0.0.1] from localhost [127.0.0.1] 39522 ^KMSH|^~\&|A|SEND_FACILITY_2|A|A|20180101000000||TYPE^A|20180101000000|T|0.0|||AA||00|ASCII^MEVN|A00|20180101040000^MPID||14^A111^^^^MRN|11111111^^^^MRN~1111111111^^^^ORGNMBR^\
์ด ์ถ๋ ฅ์ ๋ฉ์์ง๋ฅผ ๋ง๋ค ๋ ์์ ๋ ์๋ต์
data
ํ๋์ ์๋ ๊ฐ์ ํด๋นํฉ๋๋ค. ์ด ๊ฐ์hl7v2-sample2.json
ํ์ผ์data
๊ฐ๊ณผ ๋์ผํฉ๋๋ค.
Google Kubernetes Engine์ MLLP ์ด๋ํฐ ๋ฐฐํฌ
๊ด๋ฆฌ ์ผํฐ์์ MLLP๋ฅผ ํตํด HL7v2 ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ Google Cloud์ ๋ฐฐํฌ๋ ์ด๋ํฐ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ์ฌ Cloud Healthcare API๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
MLLP ์ด๋ํฐ๋ GKE ํด๋ฌ์คํฐ์์ ์คํ ์ดํธ๋ฆฌ์ค(Stateless) ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์คํ๋ฉ๋๋ค. GKE ํด๋ฌ์คํฐ๋ ์ปจํ ์ด๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ๊ด๋ฆฌํ VM ์ธ์คํด์ค ๊ทธ๋ฃน์ ๋๋ค. ์คํ ์ดํธ๋ฆฌ์ค(Stateless) ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ํด๋ฌ์คํฐ ๋๋ ์๊ตฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ์ง ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ๋์ ๋ฐ์ดํฐ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ์ง๋๋ฏ๋ก, ์คํ ์ดํธ๋ฆฌ์ค(Stateless) ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅ์ฑ์ด ๋ ๋ฐ์ด๋ฉ๋๋ค.
GKE๋ ๋ฐฐํฌ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ดํธ๋ฆฌ์ค(Stateless) ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ์ผ์ ๋น๊ณ ์ ํฌ๋๋ก ๋ฐฐํฌํฉ๋๋ค. ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ํฌ๋ ์, ์คํํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ฒ์ , ๋ผ๋ฒจ์ ์ง์ ํ ํฌ๋ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๋ฐฐํฌ์ ํฌ๋ ์ฌ์์ ์ ๋ฐ์ดํธํ์ฌ ์ํ๋ ์ํ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ด๋ํฐ๋ฅผ ๋ฐฐํฌํ๋ ๋์์ ๋ด๋ถ ๋ถํ ๋ถ์ฐ์ ์ฌ์ฉํ์ฌ ์ด๋ํฐ๋ฅผ Cloud Healthcare API์ ์ฐ๊ฒฐํ ์ ์๋ ์๋น์ค ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
GKE๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ํ ์๋ ๋ฐฉ์์ ๋ฐฐ์ธ ์ ์๋ GKE ๋น ๋ฅธ ์์์ ์๋ฃํด์ผ ํฉ๋๋ค.
GKE ์๋น์ค ๊ณ์ ์ Pub/Sub API ๊ถํ ์ถ๊ฐ
์๋น์ค ๊ณ์ ์ผ๋ก Cloud Platform์ ์ธ์ฆ์ ๋ํ GKE ๋ฌธ์์ ์ค๋ช ๋ ๋๋ก ์ปจํ ์ด๋ ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋๋ Compute Engine ์ธ์คํด์ค์ ๋๋ค. ๋ฐ๋ผ์ MLLP ์ด๋ํฐ๋ ์ปจํ ์ด๋ ํด๋ฌ์คํฐ์์ ์คํ๋๋ฉด ๋ฐฐํฌ๋ Compute Engine ์ธ์คํด์ค์ ๋ฒ์๋ฅผ ์๋์ผ๋ก ์์ํฉ๋๋ค.
Google Cloud๋ 'Compute Engine ๊ธฐ๋ณธ ์๋น์ค ๊ณ์ '์ด๋ผ๋ ์๋น์ค ๊ณ์ ์ ์๋์ผ๋ก ๋ง๋ค๊ณ ์ด ์๋น์ค ๊ณ์ ์ GKE๊ฐ ๋ง๋ ๋ ธ๋์ ์ฐ๊ฒฐํฉ๋๋ค. ํ๋ก์ ํธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๊ธฐ๋ณธ ์๋น์ค ๊ณ์ ์ ๋ค๋ฅธ Cloud Platform API๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ถํ์ด ํฌํจ๋๊ฑฐ๋ ํฌํจ๋์ง ์์ ์ ์์ต๋๋ค. GKE๋ ๋ํ ์ผ๋ถ ์ ํ๋ ์ก์ธ์ค ๋ฒ์๋ฅผ Compute Engine ์ธ์คํด์ค์ ํ ๋นํฉ๋๋ค.
์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ ์๋น์ค ๊ณ์ ์ ๊ถํ์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ Compute Engine ์ธ์คํด์ค์ ์ถ๊ฐ ์ก์ธ์ค ๋ฒ์๋ฅผ ํ ๋นํ์ฌ GKE์์ ์คํ๋๋ ํฌ๋์์ ๋ค๋ฅธ Google Cloud ์๋น์ค(์: Pub/Sub)์ ์ธ์ฆ์ ์ํํ์ง ๋ง์ธ์. ๋์ ์์ฒด ์๋น์ค ๊ณ์ ์ ๋ง๋์ธ์.
ํ์ํ Pub/Sub ๊ถํ์ ์ปจํ ์ด๋ ํด๋ฌ์คํฐ์ ๋ถ์ฌํด์ผ ํ์ง๋ง Cloud Monitoring์ ์ธก์ ํญ๋ชฉ์ ์ธ ์ ์๋ ๊ถํ๋ ๋ถ์ฌํ ์ ์์ต๋๋ค.
์ปจํ ์ด๋ ํด๋ฌ์คํฐ์ ํ์ํ ๋ฒ์๋ง ํฌํจํ๋ ์ ์๋น์ค ๊ณ์ ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
์ฝ์
์๋น์ค ๊ณ์ ์ ๋ง๋ญ๋๋ค.
Google Cloud ์ฝ์์์ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
์๋น์ค ๊ณ์ ์ด๋ฆ ํ๋์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค. Google Cloud ์ฝ์์ ์ด ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค ๊ณ์ ID ํ๋๋ฅผ ์ฑ์๋๋ค.
์ ํ์ฌํญ: ์๋น์ค ๊ณ์ ์ค๋ช ํ๋์ ์ค๋ช ์ ์ ๋ ฅํฉ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ญํ ์ ํ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ชจ๋ ์ญํ ์์ Pub/Sub > Pub/Sub ๊ตฌ๋ ์๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ค๋ฅธ ์ญํ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ ๋ค์ ์ญํ ์ ํ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ชจ๋ ์ญํ ์์ Cloud Healthcare > Healthcare HL7v2 ๋ฉ์์ง ์์ง์ ํด๋ฆญํฉ๋๋ค.
์ ํ์ฌํญ: ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ๋ค๋ฅธ ์ญํ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ ๋ค์ ์ญํ ์ ํ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ชจ๋ ์ญํ ์์ ๋ชจ๋ํฐ๋ง > ๋ชจ๋ํฐ๋ง ์ธก์ ํญ๋ชฉ ์์ฑ์๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ณ์์ ํด๋ฆญํฉ๋๋ค.
์๋ฃ๋ฅผ ํด๋ฆญํ์ฌ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ๋ฅผ ๋ง์นฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ซ์ง ๋ง์ธ์. ๋ค์ ์ ์ฐจ์์ ์ด ์ฐฝ์ ์ฌ์ฉํฉ๋๋ค.
gcloud
์๋น์ค ๊ณ์ ์ ๋ง๋ค๊ธฐ ์ํด
gcloud iam service-accounts create
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
์๋น์ค ๊ณ์ ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
Created service account SERVICE_ACCOUNT_NAME.
์๋น์ค ๊ณ์ ์ ๊ฐ ์ญํ ์ ๋ถ์ฌํ๊ธฐ ์ํด
gcloud projects add-iam-policy-binding
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/pubsub.subscriber gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/healthcare.hl7V2Ingest gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.metricWriter
์ถ๋ ฅ์ ์ ๋ฐ์ดํธ๋ ์ ์ฑ ์ด ํฌํจ๋ฉ๋๋ค.
bindings: - members: - user:SERVICE_ACCOUNT_NAME role: roles/pubsub.publisher - members: - user:SERVICE_ACCOUNT_NAME roles/healthcare.hl7V2Ingest - members: - user:SERVICE_ACCOUNT_NAME roles/monitoring.metricWriter etag: ETAG version: 1
ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ
GKE์์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด gcloud container clusters create
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud container clusters create mllp-adapter \ --zone=COMPUTE_ZONE \ --service-account CLIENT_EMAIL
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- COMPUTE_ZONE์ ํด๋ฌ์คํฐ๊ฐ ๋ฐฐํฌ๋ ์์ญ์
๋๋ค. ์์ญ์ ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ๋ ๋๋ต์ ์ธ ๋ฆฌ์ ์ ์์น์
๋๋ค. ์๋ฅผ ๋ค์ด
us-west1-a
๋us-west
๋ฆฌ์ ์ ์๋ ํ ์์ญ์ ๋๋ค.gcloud config set compute/zone
์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์์ญ์ ์ค์ ํ ๊ฒฝ์ฐ ์ด ํ๋๊ทธ์ ๊ฐ์ด ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ ์ํฉ๋๋ค. - CLIENT_EMAIL์ ์ฌ์ฉํ ์๋น์ค ๊ณ์ ์ ์๋ณ์์ ๋๋ค. SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.comํ์์ ์ฌ์ฉํฉ๋๋ค.
๋ช ๋ น์ด๊ฐ ๋ค์ ์ํ๊ณผ ๋น์ทํ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
Creating cluster mllp-adapter in COMPUTE_ZONE... Cluster is being configured... Cluster is being deployed... Cluster is being health-checked... Cluster is being health-checked (master is healthy)...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/COMPUTE_ZONE/clusters/mllp-adapter]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/COMPUTE_ZONE/mllp-adapter?project=PROJECT_ID kubeconfig entry generated for mllp-adapter. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS mllp-adapter COMPUTE_ZONE 1.11.7-gke.4 203.0.113.1 n1-standard-1 1.11.7-gke.4 3 RUNNING
ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ ํ GKE๋ 3๊ฐ์ Compute Engine VM ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ๋ค์ ๋ช ๋ น์ด๋ก ์ธ์คํด์ค๋ฅผ ๋์ดํ์ฌ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
gcloud compute instances list
๋ฐฐํฌ ๊ตฌ์ฑ
GKE์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก YAML ํ์ผ์ธ ๋ฐฐํฌ ๋งค๋ํ์คํธ ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ์ ์์ฑ์ ์ ์ํฉ๋๋ค. ์ํ์ ๋ฐฐํฌ ๋ง๋ค๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ณ๋์ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ฝํ ์ธ ๊ฐ ํฌํจ๋
mllp_adapter.yaml
์ด๋ผ๋ ๋ฐฐํฌ ๋งค๋ํ์คํธ ํ์ผ์ ๋ง๋ญ๋๋ค.
apiVersion: apps/v1 kind: Deployment metadata: name: mllp-adapter-deployment spec: replicas: 1 selector: matchLabels: app: mllp-adapter template: metadata: labels: app: mllp-adapter spec: containers: - name: mllp-adapter imagePullPolicy: Always image: gcr.io/cloud-healthcare-containers/mllp-adapter ports: - containerPort: 2575 protocol: TCP name: "port" command: - "/usr/mllp_adapter/mllp_adapter" - "--port=2575" - "--hl7_v2_project_id=PROJECT_ID" - "--hl7_v2_location_id=LOCATION" - "--hl7_v2_dataset_id=DATASET_ID" - "--hl7_v2_store_id=HL7V2_STORE_ID" - "--api_addr_prefix=https://healthcare.googleapis.com:443/v1" - "--logtostderr" - "--receiver_ip=0.0.0.0"
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PROJECT_ID๋ HL7v2 ์ ์ฅ์๊ฐ ํฌํจ๋ Google Cloud ํ๋ก์ ํธ์ ID์ ๋๋ค.
- LOCATION์ HL7v2 ์ ์ฅ์๊ฐ ์๋ ๋ฆฌ์ ์ ๋๋ค.
- DATASET_ID๋ HL7v2 ์ ์ฅ์์ ์์ ๋ฐ์ดํฐ ์ธํธ ID์ ๋๋ค.
- HL7V2_STORE_ID๋ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ผ HL7v2 ์ ์ฅ์์ ID์ ๋๋ค.
๋ฐฐํฌ์๋ ๋ค์ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค.
spec: replicas:
๋ ๋ฐฐํฌ์์ ๊ด๋ฆฌํ๋ ๋ณต์ ๋ ํฌ๋ ์์ ๋๋ค.spec: template: metadata: labels:
๋ ๋ฐฐํฌ์์ ํฌ๋ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๋ ๊ฐ ํฌ๋์ ์ง์ ๋ ๋ผ๋ฒจ์ ๋๋ค.spec: template: spec:
์ ๊ฐ ํฌ๋์ ์คํ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ํฌ๋ ์ฌ์์ ๋๋ค.spec: containers
์๋ ๊ฐ ํฌ๋์์ ์คํํ ์ปจํ ์ด๋์ ์ด๋ฆ๊ณผ ์คํํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ฐฐํฌ ์ฌ์์ ๋ํ ์์ธํ ๋ด์ฉ์ Deployment API ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
์๋น์ค ๊ตฌ์ฑ
ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ (์: ๊ด๋ฆฌ ์ผํฐ)์์ MLLP ์ด๋ํฐ์ ์ก์ธ์คํ ์ ์๊ฒ ํ๋ ค๋ฉด ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
VPN์ ๊ตฌ์ฑํ์ง ์์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ VPC ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ๋์ผํ Google Cloud ๋ฆฌ์ ์ ์๋ ๊ฒฝ์ฐ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ํตํด MLLP ์ด๋ํฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋์ผํ ๋ฆฌ์ ๋ฐ ๋์ผํ VPC ๋คํธ์ํฌ์ Compute Engine VM ์ธ์คํด์ค์์ ์ด๋ํฐ์ ์ก์ธ์คํ ์ ์๋๋ก ํ๊ธฐ ์ํด ํด๋ฌ์คํฐ์ ์๋น์ค ๋ฆฌ์์ค์ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฐฐํฌ ๋งค๋ํ์คํธ ํ์ผ์ ๋ง๋ ๋๋ ํฐ๋ฆฌ์์ ํ
์คํธ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ฝํ
์ธ ๊ฐ ํฌํจ๋ mllp_adapter_service.yaml
์ด๋ผ๋ ์๋น์ค ๋งค๋ํ์คํธ ํ์ผ์ ๋ง๋ญ๋๋ค. ์ด ํ์ผ์ ๋ด๋ถ ๋ถํ ๋ถ์ฐ์ ๊ตฌ์ฑ์ ์ค๋ช
ํฉ๋๋ค.
apiVersion: v1
kind: Service
metadata:
name: mllp-adapter-service
annotations:
cloud.google.com/load-balancer-type: "Internal"
spec:
type: LoadBalancer
ports:
- name: port
port: 2575
targetPort: 2575
protocol: TCP
selector:
app: mllp-adapter
์ด ์๋น์ค์๋ ๋ค์ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค.
metadata: name:
์ ์๋น์ค์ ๋ํด ์ ํํ๋ ์ด๋ฆ์ ๋๋ค. ์ฌ๊ธฐ์์๋mllp-adapter-service
์ ๋๋ค.metadata: annotations:
๋ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ๊ตฌ์ฑํ๋๋ก ์ง์ ํ๋ ์ฃผ์์ ๋๋ค.spec: type:
์ ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ ํ์ ๋๋ค.ports: port:
๋ ์๋น์ค๊ฐ ๋์ผํ ํด๋ฌ์คํฐ์ ์๋ ๋ค๋ฅธ ์๋น์ค๋ก๋ถํฐ ํธ๋ํฝ์ ์์ ํ ์ ์๋ ํฌํธ๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.2575
์ ๊ธฐ๋ณธ MLLP ํฌํธ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.ports: targetPort:
๋ ์๋น์ค๊ฐ ์คํ๋๋ ๊ฐ ํฌ๋์ ํฌํธ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.spec: selector: app:
๋ ์๋น์ค๊ฐ ํ๊ฒํ ํ๋ ํฌ๋๋ฅผ ์ง์ ํฉ๋๋ค.
clusterIP
ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ ๋ถ์ฐ๊ธฐ์ IP ์ฃผ์๋ฅผ ์ง์ ํ ์ ์์ง๋ง ๋ถํ ๋ถ์ฐ๊ธฐ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๋ ์์ฒด IP ์ฃผ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ง๊ธ์ ํด๋ฌ์คํฐ๊ฐ ์ด ํํ ๋ฆฌ์ผ์ ๋ท๋ถ๋ถ์์ ์ฌ์ฉํ๋ IP ์ฃผ์๋ฅผ ์์ฑํ๋๋ก ํฉ๋๋ค.
๋ด๋ถ ๋ถํ ๋ถ์ฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ GKE ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋น์ค ์ฌ์์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋น์ค API ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
๋ฐฐํฌ ์ค๋น
GKE ํด๋ฌ์คํฐ์ ์ด๋ํฐ๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด mllp_adapter.yaml
๋ฐฐํฌ ๋งค๋ํ์คํธ ํ์ผ์ด ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl apply -f mllp_adapter.yaml
์ด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
deployment.extensions "mllp-adapter-deployment" created
๋ฐฐํฌ ๊ฒ์ฌ
๋ฐฐํฌ๋ฅผ ๋ง๋ ํ kubectl
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋ฅผ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
๋ฐฐํฌ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
kubectl describe deployment mllp-adapter
๋ฐฐํฌ์์ ๋ง๋ ํฌ๋๋ฅผ ๋์ดํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get pods -l app=mllp-adapter
์์ฑ๋ ํฌ๋์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
kubectl describe pod POD_NAME
๋ฐฐํฌ์ ์ฑ๊ณตํ๋ฉด ์ด์ ๋ช ๋ น์ด์ ์ถ๋ ฅ ์ค ๋ง์ง๋ง ๋ถ๋ถ์ ๋ค์ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 1m default-scheduler Successfully assigned default/mllp-adapter-deployment-85b46f8-zxw68 to gke-mllp-adapter-default-pool-9c42852d-95sn
Normal Pulling 1m kubelet, gke-mllp-adapter-default-pool-9c42852d-95sn pulling image "gcr.io/cloud-healthcare-containers/mllp-adapter"
Normal Pulled 1m kubelet, gke-mllp-adapter-default-pool-9c42852d-95sn Successfully pulled image "gcr.io/cloud-healthcare-containers/mllp-adapter"
Normal Created 1m kubelet, gke-mllp-adapter-default-pool-9c42852d-95sn Created container
Normal Started 1m kubelet, gke-mllp-adapter-default-pool-9c42852d-95sn Started container
์๋น์ค ๋ฐฐํฌ ๋ฐ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ ๋ง๋ค๊ธฐ
๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด mllp_adapter_service.yaml
์๋น์ค ๋งค๋ํ์คํธ ํ์ผ์ด ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl apply -f mllp_adapter_service.yaml
์ด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
service "mllp-adapter-service" created
์๋น์ค ๊ฒ์ฌ
์๋น์ค๋ฅผ ๋ง๋ ํ ์๋น์ค๊ฐ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฒ์ฌํฉ๋๋ค.
๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ์กฐ์ฌํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.
kubectl describe service mllp-adapter-service
๋ช ๋ น์ด์ ์ถ๋ ฅ์ ๋ค์ ์ํ๊ณผ ์ ์ฌํฉ๋๋ค.
Name: mllp-adapter-service
Namespace: default
Labels: <none>
Annotations: cloud.google.com/load-balancer-type=Internal
kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"cloud.google.com/load-balancer-type":"Internal"},"name":"mllp-adapter-service","namespa...
Selector: app=mllp-adapter
Type: LoadBalancer
IP: 203.0.113.1
LoadBalancer Ingress: 203.0.113.1
Port: port 2575/TCP
TargetPort: 2575/TCP
NodePort: port 30660/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EnsuringLoadBalancer 1m service-controller Ensuring load balancer
Normal EnsuredLoadBalancer 1m service-controller Ensured load balancer
LoadBalancer Ingress
IP ์ฃผ์๊ฐ ์ฑ์์ง๋ ๋ฐ ์ต๋ 1๋ถ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๋ค์ ๋จ๊ณ์์ ์ด IP ์ฃผ์์ 2575
ํฌํธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์๋น์ค์ ์ก์ธ์คํฉ๋๋ค.
Compute Engine VM ๋ง๋ค๊ธฐ ๋ฐ ๋ฉ์์ง ์ ์ก
์ด ํํ ๋ฆฌ์ผ ์๋ถ๋ถ์์ MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ํ ์คํธํ๊ณ HL7v2 ๋ฉ์์ง๋ฅผ HL7v2 ์ ์ฅ์๋ก ๋ณด๋์ง๋ง ์ด์ Compute Engine VM์์ GKE์์ ์คํ๋๋ MLLP ์ด๋ํฐ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ ์ธ์คํด์ค์์ GKE ํด๋ฌ์คํฐ๋ก ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ์ธ์คํด์ค์ ๊ธฐ์กด ์ธ์คํด์ค๊ฐ ๋์ผํ ๋ฆฌ์ ์ ์๊ณ ๋์ผํ VPC ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด ์น์ ๋์์๋ Pub/Sub ์ฃผ์ ์ ๊ฒ์๋ ์๋ฆผ๊ณผ HL7v2 ์ ์ฅ์์ HL7v2 ๋ฉ์์ง๊ฐ ๋์ด๋ฉ๋๋ค. Compute Engine VM ์ธ์คํด์ค์๋ ์ด๋ฌํ ์์ ์ ์ํํ ์ ์๋ ๊ถํ์ด ๋ถ์ฌ๋์ด ์์ด์ผ ํฉ๋๋ค. ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ํ์ํ ๊ถํ์ผ๋ก ์ ์๋น์ค ๊ณ์ ์ ๋ง๋ญ๋๋ค.
์ฝ์
์๋น์ค ๊ณ์ ์ ๋ง๋ญ๋๋ค.
Google Cloud ์ฝ์์์ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
์๋น์ค ๊ณ์ ์ด๋ฆ ํ๋์ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค. Google Cloud ์ฝ์์ ์ด ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค ๊ณ์ ID ํ๋๋ฅผ ์ฑ์๋๋ค.
์ ํ์ฌํญ: ์๋น์ค ๊ณ์ ์ค๋ช ํ๋์ ์ค๋ช ์ ์ ๋ ฅํฉ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ญํ ์ ํ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ชจ๋ ์ญํ ์์ Pub/Sub > Pub/Sub ๊ตฌ๋ ์๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ค๋ฅธ ์ญํ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ ๋ค์ ์ญํ ์ ํ ํ๋๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ชจ๋ ์ญํ ์์ Cloud Healthcare > Healthcare HL7v2 ๋ฉ์์ง ์๋น์๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ณ์์ ํด๋ฆญํฉ๋๋ค.
์๋ฃ๋ฅผ ํด๋ฆญํ์ฌ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ๋ฅผ ๋ง์นฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ซ์ง ๋ง์ธ์. ๋ค์ ์ ์ฐจ์์ ์ด ์ฐฝ์ ์ฌ์ฉํฉ๋๋ค.
gcloud
์๋น์ค ๊ณ์ ์ ๋ง๋ค๊ธฐ ์ํด
gcloud iam service-accounts create
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
์๋น์ค ๊ณ์ ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
Created service account SERVICE_ACCOUNT_NAME.
์๋น์ค ๊ณ์ ์ ๊ฐ ์ญํ ์ ๋ถ์ฌํ๊ธฐ ์ํด
gcloud projects add-iam-policy-binding
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/pubsub.publisher gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/healthcare.hl7V2Consumer
์ถ๋ ฅ์ ์ ๋ฐ์ดํธ๋ ์ ์ฑ ์ด ํฌํจ๋ฉ๋๋ค.
bindings: - members: - user:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com role: roles/pubsub.publisher - members: - user:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com roles/healthcare.hl7V2Consumer etag: ETAG version: 1
๋ค์ ๋จ๊ณ๋ Compute Engine์์ Linux ๊ฐ์ ๋จธ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ฝ์
Google Cloud Console์์ VM ์ธ์คํด์ค ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์ธ์คํด์ค ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค ๋ ์ ํํ ์์ญ๊ณผ ์ผ์นํ๋ ์ธ์คํด์ค์ ๋ฆฌ์ ๋ฐ ์์ญ์ ์ ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค ๋ COMPUTE_ZONE์
us-central1-a
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ธ์คํด์ค ์์ฑ ํ๋ฉด์์ ๋ฆฌ์ ์us-central1 (Iowa)
๋ฅผ, ์์ญ์us-central1-a
๋ฅผ ์ ํํฉ๋๋ค.๋ถํ ๋์คํฌ ์น์ ์์ ๋ณ๊ฒฝ์ ํด๋ฆญํ์ฌ ๋ถํ ๋์คํฌ ๊ตฌ์ฑ์ ์์ํฉ๋๋ค.
๊ณต๊ฐ ์ด๋ฏธ์ง ํญ์์ Debian ์ด์์ฒด์ ๋ฒ์ 9๋ฅผ ์ ํํฉ๋๋ค.
์ ํ์ ํด๋ฆญํฉ๋๋ค.
ID ๋ฐ API ์ก์ธ์ค ์น์ ์์ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ์ ํํฉ๋๋ค.
๋ฐฉํ๋ฒฝ ์น์ ์์ HTTP ํธ๋ํฝ ํ์ฉ์ ์ ํํฉ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
gcloud
Compute ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ์ต์
์ ์ฌ์ฉํด์ gcloud compute instances create
๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
- ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค ๋ ์ ํํ ZONE
- HTTP ํธ๋ํฝ์ ํ์ฉํ๋
http-server
ํ๊ทธ - ์์ฑํ SERVICE_ACCOUNT
gcloud compute instances create COMPUTE_NAME \ --project=PROJECT_ID \ --zone=ZONE \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=http-server \ --service-account=SERVICE_ACCOUNT
์ถ๋ ฅ์ ๋ค์ ์ํ๊ณผ ๋น์ทํฉ๋๋ค.
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/COMPUTE_NAME]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS COMPUTE_NAME ZONE n1-standard-1 INTERNAL_IP EXTERNAL_IP RUNNING
์ธ์คํด์ค๊ฐ ์์๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ธ์คํด์ค๊ฐ ์์๋๋ฉด VM ์ธ์คํด์ค ํ์ด์ง์ ๋ น์ ์ํ ์์ด์ฝ์ผ๋ก ํ์๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค์๋ ํด๋ฌ์คํฐ์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ ๊ธฐ๋ณธ VPC ๋คํธ์ํฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, ์ธ์คํด์ค์์ ํด๋ฌ์คํฐ๋ก ํธ๋ํฝ์ด ์ ์ก๋ ์ ์์ต๋๋ค.
์ธ์คํด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
์ฝ์
Google Cloud Console์์ VM ์ธ์คํด์ค ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
๊ฐ์ ๋จธ์ ์ธ์คํด์ค ๋ชฉ๋ก์ ๋ฐ๋ก ์ ์ ๋ง๋ ์ธ์คํด์ค ํ์์ SSH๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
์ธ์คํด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด gcloud compute ssh
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute ssh INSTANCE_NAME \ --project PROJECT_ID \ --zone ZONE
์ด์ Linux ์ธ์คํด์ค์ ์ํธ์์ฉํ ์ ์๋ ํฐ๋ฏธ๋ ์ฐฝ์ด ์๊ฒผ์ต๋๋ค.
ํฐ๋ฏธ๋ ์ฐฝ์์ Netcat์ ์ค์นํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-sample.txt
ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ์ธ์คํด์ค์ ์ ์ฅํฉ๋๋ค. ํ์ผ์ ์ฌ์ฉ๋ ์ธ์ฝ๋ฉ ๋ฐ ์ธ๊ทธ๋จผํธ ์ข ๋ฃ์์ ๋ํ ์์ธํ ๋ด์ฉ์ HL7v2 ๋ฉ์์ง ์ธ๊ทธ๋จผํธ ๊ตฌ๋ถ์ ๋ฐ ์ธ์ฝ๋ฉ์ ์ฐธ์กฐํ์ธ์.MLLP ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ์ ์ฅ์๋ก HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด ํ์ผ์ ๋ค์ด๋ก๋ ํ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ์๋น์ค๋ฅผ ๊ฒ์ฌํ ๋ ํ์๋
LoadBalancer Ingress
๊ฐ์ ์ฌ์ฉํฉ๋๋ค.echo -n -e "\x0b$(cat hl7v2-mllp-sample.txt)\x1c\x0d" | nc LOAD_BALANCER_INGRESS_IP_ADDRESS 2575
๋ช ๋ น์ด๋ฅผ ์คํํ ํ ๋ฉ์์ง๊ฐ MLLP ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ์ ์ฅ์๋ก ์ ์ก๋ฉ๋๋ค. ๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์์ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋๋ฉด ์ด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
MSA|AA|20150503223000|ILITY|FROM_APP|FROM_FACILITY|20190312162410||ACK|f4c59243-19c2-4373-bea0-39c1b2ba616b|P|2.5
์ด ์ถ๋ ฅ์ HL7v2 ์ ์ฅ์๊ฐ
AA
(Application Accept
) ์๋ต ์ ํ์ผ๋ก ์๋ตํ์์ ๋ํ๋ ๋๋ค. ์ฆ, ๋ฉ์์ง๊ฐ ๊ฒ์ฆ๋๊ณ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋ฉ๋๋ค.Pub/Sub ์ฃผ์ ์ ๊ฒ์๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ ค๋ฉด
gcloud pubsub subscriptions pull
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud pubsub subscriptions pull --auto-ack PUBSUB_SUBSCRIPTION
๋ช ๋ น์ด๋ ์์ง๋ HL7v2 ๋ฉ์์ง์ ๋ํ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ | DATA | MESSAGE_ID | ATTRIBUTES | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------| | projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/HL7V2_MESSAGE_ID | 123456789012345 | msgType=ADT | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ
๋ํ HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋์ดํ์ฌ ๋ฉ์์ง๊ฐ ์ถ๊ฐ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
curl
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Get ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
์ด ์น์ ์ ์๋ฃํ ํ MLLP ์ด๋ํฐ๋ฅผ GKE์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ์๊ฒฉ ์ธ์คํด์ค์์ ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ๋ฉ์์ง๋ฅผ Cloud Healthcare API๋ก ์ ์กํ๊ฒ ๋ฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ ๋๋จธ์ง ๋ถ๋ถ์์๋ '์จํ๋ ๋ฏธ์ค' ์ธ์คํด์ค ์ญํ ์ ํ๋ Compute Engine ์ธ์คํด์ค์ ์ด๋ํฐ ๊ฐ์ VPN์ ๊ตฌ์ฑํ์ฌ ์ ์ก๋ HL7v2 ๋ฉ์์ง๋ฅผ ์์ ํ๊ฒ ์ํธํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
VPN ๊ตฌ์ฑ
VPN์ ์ฌ์ฉํ๋ฉด ์ธํฐ๋ท๊ณผ ๊ฐ์ ๊ณต์ฉ ๋คํธ์ํฌ์์ HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋น๊ณต๊ฐ ๋คํธ์ํฌ๋ฅผ ํ์ฅํ ์ ์์ต๋๋ค. VPN์ ์ฌ์ฉํ๋ฉด MLLP ์ด๋ํฐ๋ฅผ ํตํด ๊ด๋ฆฌ ์ผํฐ์์ Google Cloud๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ด ํ๋ฆ์ ์์คํ ์ ๋จ์ผ ๋น๊ณต๊ฐ ๋คํธ์ํฌ์ ์๋ ๊ฒ์ฒ๋ผ ์๋ํฉ๋๋ค.
VPN์ ์ฌ์ฉํ์ฌ MLLP ์ฐ๊ฒฐ์ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง์ ๋๋ค.
- Cloud VPN ์ฌ์ฉ
- Strongswan on Docker ์๋ ํฌ ์๋ VPN ์๋ฃจ์ ์ฌ์ฉ
Cloud VPN ๊ตฌ์ฑ
Cloud VPN์ IPsec VPN ์ฐ๊ฒฐ์ ํตํด ์จํ๋ ๋ฏธ์ค ๋คํธ์ํฌ๋ฅผ Google Cloud Virtual Private Cloud(VPC) ๋คํธ์ํฌ์ ์์ ํ๊ฒ ์ฐ๊ฒฐํฉ๋๋ค. ํ์ชฝ VPN ๊ฒ์ดํธ์จ์ด์์ ๋ ๋คํธ์ํฌ ์ฌ์ด์ ํธ๋ํฝ ์ด๋์ ์ํธํํ๋ฉด ์ดํ ๋ค๋ฅธ ์ชฝ VPN ๊ฒ์ดํธ์จ์ด์์ ์ด๋ฅผ ๋ณตํธํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธํฐ๋ท์ด๋ ๊ด๋ฆฌ ์ผํฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๊ตฌ์ฑ๋๋ ๊ฐ VPN ๊ฒ์ดํธ์จ์ด๊ฐ ์๋ก ๋ค๋ฅธ ์ปค์คํ ๋คํธ์ํฌ ๋ฐ ์๋ก ๋ค๋ฅธ Google Cloud ๋ฆฌ์ ์ ์๋ธ๋ท์ ๋ฐฐ์น๋ฉ๋๋ค.
us-central1
์์ ๊ตฌ์ฑ๋ VPN ๊ฒ์ดํธ์จ์ด๋ Google Cloud ์ธก์ Cloud VPN ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํ๋ฉฐ europe-west1
์ Cloud VPN ๊ฒ์ดํธ์จ์ด๋ '์จํ๋ ๋ฏธ์ค' ๊ฒ์ดํธ์จ์ด๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค.
์ด๋ฆ ์ง์ ๋ฐ ์ฃผ์ ์ง์ ์ฐธ์กฐ
์ฐธ๊ณ ๋ก ์ด ํํ ๋ฆฌ์ผ์์๋ ๋ค์ ์ด๋ฆ ์ง์ ๋ฐ IP ์ฃผ์ ์ง์ ์ ์ฌ์ฉํฉ๋๋ค.
Google Cloud ์ธก
- ๋คํธ์ํฌ ์ด๋ฆ:
cloud-vpn-network
- ์๋ธ๋ท ์ด๋ฆ:
subnet-us-central-10-0-1
- ๋ฆฌ์ :
us-central1
- ์๋ธ๋ท ๋ฒ์:
10.0.1.0/24
- ์ธ๋ถ IP ์ฃผ์ ์ด๋ฆ:
cloud-vpn-ip
- VPN ๊ฒ์ดํธ์จ์ด ์ด๋ฆ:
vpn-us-central
- VPN ํฐ๋ ์ด๋ฆ:
vpn-us-central-tunnel-1
'์จํ๋ ๋ฏธ์ค' ์ธก
- ๋คํธ์ํฌ ์ด๋ฆ:
on-prem-vpn-network
- ์๋ธ๋ท ์ด๋ฆ:
subnet-europe-west-10-0-2
- ๋ฆฌ์ :
europe-west1
- ์๋ธ๋ท ๋ฒ์:
10.0.2.0/24
- ์ธ๋ถ IP ์ฃผ์ ์ด๋ฆ:
on-prem-vpn-ip
- VPN ๊ฒ์ดํธ์จ์ด ์ด๋ฆ:
vpn-europe-west
- VPN ํฐ๋ ์ด๋ฆ:
vpn-europe-west-tunnel-1
์ปค์คํ VPC ๋คํธ์ํฌ ๋ฐ ์๋ธ๋ท ๋ง๋ค๊ธฐ
Cloud VPN ๊ตฌ์ฑ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ VPC ๋คํธ์ํฌ 2๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค. on-prem-vpn-network
๋ผ๋ ํ ๋คํธ์ํฌ๋ '์จํ๋ ๋ฏธ์ค' ํ๊ฒฝ์ ๊ตฌ์ฑ๋๊ณ , on-prem-instance
๋ผ๋ Compute Engine VM ์ธ์คํด์ค์์ ์คํ๋ฉ๋๋ค. cloud-vpn-network
๋ผ๋ ๋ค๋ฅธ ๋คํธ์ํฌ๋ MLLP ์ด๋ํฐ๋ฅผ ์คํํ๋ GKE ํด๋ฌ์คํฐ์ ์ฌ์ฉ๋๋ ๋คํธ์ํฌ์
๋๋ค. on-prem-instance
VM์ ์ฐ๊ฒฐํ๊ณ HL7v2 ๋ฉ์์ง๋ฅผ MLLP ์ด๋ํฐ์ ๋ด๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ํตํด cloud-vpn-network
๋คํธ์ํฌ์์ ์คํ๋๋ MLLP ์ด๋ํฐ๋ก ์ ์กํฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ์ปค์คํ VPC ๋คํธ์ํฌ ๋ ๊ฐ์ ํด๋น ์๋ธ๋ท์ ๋ง๋ญ๋๋ค.
์ฒซ ๋ฒ์งธ VPC ๋คํธ์ํฌ์ธ
cloud-vpn-network
๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute networks create cloud-vpn-network \ --project=PROJECT_ID \ --subnet-mode=custom
cloud-vpn-network
๋คํธ์ํฌ์ ๋ํดsubnet-us-central-10-0-1
์๋ธ๋ท์ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute networks subnets create subnet-us-central-10-0-1 \ --project=PROJECT_ID \ --region=us-central1 \ --network=cloud-vpn-network \ --range=10.0.1.0/24
on-prem-vpn-network
VPC ๋คํธ์ํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute networks create on-prem-vpn-network \ --project=PROJECT_ID \ --subnet-mode=custom
on-prem-vpn-network
VPC ๋คํธ์ํฌ์ ๋ํดsubnet-europe-west-10-0-2
์๋ธ๋ท์ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute networks subnets create subnet-europe-west-10-0-2 \ --project=PROJECT_ID \ --region=europe-west1 \ --network=on-prem-vpn-network \ --range=10.0.2.0/24
์ธ๋ถ IP ์ฃผ์ ๋ง๋ค๊ธฐ
VPN ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ ๊ฐ ๊ฒ์ดํธ์จ์ด์ ๋ํด ์ธ๋ถ IP ์ฃผ์๋ฅผ ์์ฝํฉ๋๋ค.
cloud-vpn-ip
์ฃผ์์ ๋ฆฌ์ ์ ์ธ๋ถ(๊ณ ์ ) IP ์ฃผ์๋ฅผ ์์ฝํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute addresses create cloud-vpn-ip \ --project=PROJECT_ID \ --region=us-central1
on-prem-vpn-ip
์ฃผ์์ ๋ฆฌ์ ์ ์ธ๋ถ(๊ณ ์ ) IP ์ฃผ์๋ฅผ ์์ฝํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud compute addresses create on-prem-vpn-ip \ --project=PROJECT_ID \ --region=europe-west1
๋ค์ ์น์ ์์ VPN ๊ฒ์ดํธ์จ์ด ๊ตฌ์ฑ์ ์ํด ์ฌ์ฉํ ์ ์๋๋ก ์ธ๋ถ IP ์ฃผ์๋ฅผ ๊ธฐ๋กํด ๋ก๋๋ค. ์ธ๋ถ IP ์ฃผ์๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
Cloud VPN IP ์ฃผ์:
gcloud compute addresses describe cloud-vpn-ip \ --project PROJECT_ID \ --region us-central1 \ --format='flattened(address)'
'์จํ๋ ๋ฏธ์ค' VPN IP ์ฃผ์:
gcloud compute addresses describe on-prem-vpn-ip \ --project PROJECT_ID \ --region europe-west1 \ --format='flattened(address)'
์ด ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๋น์ทํ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
address: 203.0.113.1
VPN ๊ฒ์ดํธ์จ์ด, ํฐ๋, ๊ฒฝ๋ก ๋ง๋ค๊ธฐ
๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ฌ Cloud VPN์ ๋ํด VPN ๊ฒ์ดํธ์จ์ด, ํฐ๋, ๊ฒฝ๋ก๋ฅผ ๋ง๋ญ๋๋ค.
๊ฐ๋ ฅํ ์ฌ์ ๊ณต์ ํค ์์ฑ์ ์๋ด์ ๋ฐ๋ผ ์ํธํ๋ ๊ฐ๋ ฅํ ์ฌ์ ๊ณต์ ํค(๊ณต์ ๋น๋ฐ๋ฒํธ)๋ฅผ ๋ง๋ญ๋๋ค. ์ด ํค๋ ์ด ์น์ ์์ SHARED_SECRET๋ก ์ฐธ์กฐ๋ฉ๋๋ค.
๋์ VPN ๊ฒ์ดํธ์จ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute target-vpn-gateways create vpn-us-central \ --project PROJECT_ID \ --region us-central1 \ --network cloud-vpn-network
3๊ฐ์ ์ ๋ฌ ๊ท์น์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ CLOUD_VPN_EXTERNAL_ADDRESS ๋ณ์๋ฅผ ์ด์ ์น์ ์ Cloud VPN IP ์ฃผ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๊ฒ์ดํธ์จ์ด์ ESP(IPsec) ํธ๋ํฝ ์ ์ก:
gcloud compute forwarding-rules create vpn-us-central-rule-esp \ --project PROJECT_ID \ --region us-central1 \ --address CLOUD_VPN_EXTERNAL_ADDRESS \ --ip-protocol ESP \ --target-vpn-gateway vpn-us-central
UDP 500 ํธ๋ํฝ์ ๊ฒ์ดํธ์จ์ด๋ก ์ ์ก:
gcloud compute forwarding-rules create vpn-us-central-rule-udp500 \ --project PROJECT_ID \ --region us-central1 \ --address CLOUD_VPN_EXTERNAL_ADDRESS \ --ip-protocol UDP \ --ports 500 \ --target-vpn-gateway vpn-us-central
UDP 4500 ํธ๋ํฝ์ ๊ฒ์ดํธ์จ์ด๋ก ์ ์ก:
gcloud compute forwarding-rules create vpn-us-central-rule-udp4500 \ --project PROJECT_ID \ --region us-central1 \ --address CLOUD_VPN_EXTERNAL_ADDRESS \ --ip-protocol UDP \ --ports 4500 \ --target-vpn-gateway vpn-us-central
Cloud VPN ๊ฒ์ดํธ์จ์ด๋ก ํฐ๋์ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ON_PREM_VPN_IP๋ฅผ ์ด์ ์น์ ์ '์จํ๋ ๋ฏธ์ค' VPN IP ์ฃผ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
gcloud compute vpn-tunnels create vpn-us-central-tunnel-1 \ --project PROJECT_ID \ --region us-central1 \ --peer-address ON_PREM_VPN_IP \ --shared-secret SHARED_SECRET \ --ike-version 2 \ --local-traffic-selector 0.0.0.0/0 \ --target-vpn-gateway vpn-us-central
10.0.2.0/24
์ ๋ํ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.gcloud compute routes create "vpn-us-central-tunnel-1-route-1" \ --project PROJECT_ID \ --network "cloud-vpn-network" \ --next-hop-vpn-tunnel "vpn-us-central-tunnel-1" \ --next-hop-vpn-tunnel-region "us-central1" \ --destination-range "10.0.2.0/24"
'์จํ๋ ๋ฏธ์ค' VPN์ VPN ๊ฒ์ดํธ์จ์ด, ํฐ๋, ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํ์ธ์.
๋์ VPN ๊ฒ์ดํธ์จ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute target-vpn-gateways create "vpn-europe-west" \ --project PROJECT_ID \ --region "europe-west1" \ --network "on-prem-vpn-network"
3๊ฐ์ ์ ๋ฌ ๊ท์น์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ณ ON_PREMISES_VPN_EXTERNAL_ADDRESS ๋ณ์๋ฅผ ์ด์ ์น์ ์ '์จํ๋ ๋ฏธ์ค' VPN IP ์ฃผ์์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
๊ฒ์ดํธ์จ์ด์ ESP(IPsec) ํธ๋ํฝ ์ ์ก:
gcloud compute forwarding-rules create vpn-europe-west-rule-esp \ --project PROJECT_ID \ --region europe-west1 \ --address ON_PREMISES_VPN_EXTERNAL_ADDRESS \ --ip-protocol ESP \ --target-vpn-gateway vpn-europe-west
UDP 500 ํธ๋ํฝ์ ๊ฒ์ดํธ์จ์ด๋ก ์ ์ก:
gcloud compute forwarding-rules create vpn-europe-west-rule-udp500 \ --project PROJECT_ID \ --region europe-west1 \ --address ON_PREMISES_VPN_EXTERNAL_ADDRESS \ --ip-protocol UDP \ --ports 500 \ --target-vpn-gateway vpn-europe-west
UDP 4500 ํธ๋ํฝ์ ๊ฒ์ดํธ์จ์ด๋ก ์ ์ก:
gcloud compute forwarding-rules create vpn-europe-west-rule-udp4500 \ --project PROJECT_ID \ --region europe-west1 \ --address ON_PREMISES_VPN_EXTERNAL_ADDRESS \ --ip-protocol UDP \ --ports 4500 \ --target-vpn-gateway vpn-europe-west
'์จํ๋ ๋ฏธ์ค' ๊ฒ์ดํธ์จ์ด์ ํฐ๋์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute vpn-tunnels create vpn-europe-west-tunnel-1 \ --project PROJECT_ID \ --region europe-west1 \ --peer-address CLOUD_VPN_IP \ --shared-secret SHARED_SECRET \ --ike-version 2 \ --local-traffic-selector 0.0.0.0/0 \ --target-vpn-gateway vpn-europe-west
10.0.1.0/24
์ ๋ํ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์.gcloud compute routes create "vpn-europe-west-tunnel-1-route-1" \ --project PROJECT_ID \ --network "on-prem-vpn-network" \ --next-hop-vpn-tunnel "vpn-europe-west-tunnel-1" \ --next-hop-vpn-tunnel-region "europe-west1" \ --destination-range "10.0.1.0/24"
Cloud VPN ๋ฐ '์จํ๋ ๋ฏธ์ค' ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ง๋ค๊ณ ํฐ๋์ ์์ํ์ต๋๋ค. VPN ๊ฒ์ดํธ์จ์ด๋ ๊ฒ์ดํธ์จ์ด ์ฌ์ด์ ํฐ๋์ ํตํด ํธ๋ํฝ์ ํ์ฉํ๋ ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋ง๋ค ๋๊น์ง ์ฐ๊ฒฐ๋์ง ์์ต๋๋ค.
๋ฐฉํ๋ฒฝ ๊ท์น ๋ง๋ค๊ธฐ
VPN ํฐ๋์ ์ ์ธก์ ๋ํด ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ท์น์ ๋ชจ๋ TCP, UDP, ICMP ํธ๋ํฝ์ด VPN ํฐ๋์ ํ์ชฝ์ ์๋ ์๋ธ๋ท์์ ๋ค๋ฅธ ํ์ชฝ์ผ๋ก ์ธ๊ทธ๋ ์ค๋๋๋ก ํ์ฉํฉ๋๋ค.
Cloud VPN ์๋ธ๋ท์ ๋ํด ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute firewall-rules create allow-tcp-udp-icmp-cloud-vpn \ --project=PROJECT_ID \ --direction=INGRESS \ --priority=1000 \ --network=cloud-vpn-network \ --action=ALLOW \ --rules=tcp,udp,icmp \ --source-ranges=10.0.2.0/24
'์จํ๋ ๋ฏธ์ค' ์๋ธ๋ท์ ๋ํ ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute firewall-rules create allow-tcp-udp-icmp-on-prem-vpn \ --project=PROJECT_ID \ --direction=INGRESS \ --priority=1000 \ --network=on-prem-vpn-network \ --action=ALLOW \ --rules=tcp,udp,icmp \ --source-ranges=10.0.1.0/24
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํฌํธ 22์์ VM ์ธ์คํด์ค์ SSH๋ก ์ฐ๊ฒฐํ ์ ์๋ ๋ฐฉํ๋ฒฝ ๊ท์น์ ๋ง๋ญ๋๋ค.
gcloud compute firewall-rules create on-prem-vpn-allow-ssh \ --project=PROJECT_ID \ --direction=INGRESS \ --priority=1000 \ --network=on-prem-vpn-network \ --action=ALLOW \ --rules=tcp:22 \ --source-ranges=0.0.0.0/0
VPN ํฐ๋์ ์ํ ํ์ธ
ํฐ๋์ด ์๋ํ๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
Google Cloud ์ฝ์์์ VPN ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Google VPN ํฐ๋ ํญ์ ํด๋ฆญํฉ๋๋ค.
๊ฐ ํฐ๋์ ์ํ ํ๋์์ ๋ น์ ์ฒดํฌํ์์ '์ค์ ๋จ'์ด๋ผ๋ ๋จ์ด๋ฅผ ์ฐพ์ต๋๋ค. ์ด๋ฌํ ํญ๋ชฉ์ด ์์ผ๋ฉด ๊ฒ์ดํธ์จ์ด๊ฐ ํฐ๋์ ํ์ํ ๊ฒ์ ๋๋ค. ๋ช ๋ถ ํ์๋ ํ์๊ฐ ๋ํ๋์ง ์์ผ๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ์ฐธ์กฐํ์ธ์.
VPN ํฐ๋๊ณผ ๊ด๋ จ๋ ์ถ๊ฐ ๋ก๊น ์ ๋ณด๋ ๋ฌธ์ ํด๊ฒฐ ํ์ด์ง์ VPN ๋ก๊ทธ ํ์ธ์ ์ฐธ์กฐํ์ธ์. ์๋ฅผ ๋ค์ด ์ญ์ ๋ ํจํท, ํฐ๋ ์ํ, ์์ ๋ ๋ฐ์ดํธ, ์ ์ก๋ ๋ฐ์ดํธ์ ๋ํ ์ธก์ ํญ๋ชฉ์ ๋ณผ ์ ์์ต๋๋ค.
์ด์ ํ์ํ ๊ฒ์ดํธ์จ์ด, ํฐ๋, ๋ฐฉํ๋ฒฝ ๊ท์น์ผ๋ก Cloud VPN์ ๊ตฌ์ฑํ์ผ๋ฏ๋ก '์จํ๋ ๋ฏธ์ค' VM ์ธ์คํด์ค์ GKE์์ ์คํ๋๋ MLLP ์ด๋ํฐ ๊ฐ์ ๋ณด์ ์ฐ๊ฒฐ์ ๋ง๋ค ์ ์์ต๋๋ค.
GKE ๋ฐ Cloud VPN์ ๋ฐฐํฌ ์กฐํฉ
์ด ํํ ๋ฆฌ์ผ์ ์๋ถ๋ถ์์ MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ํ ์คํธํ๊ณ ๋น VPN ์ฐ๊ฒฐ์ ํตํด MLLP ์ด๋ํฐ์ HL7v2 ๋ฉ์์ง๋ฅผ ์ ์กํ์ง๋ง ์ด์ Cloud VPN์ ์ฌ์ฉํ์ฌ ๋ณด์ ์ฐ๊ฒฐ์ ํตํด Compute Engine VM์์ GKE์์ ์คํ๋๋ MLLP ์ด๋ํฐ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
๋ฐฐํฌ ๋ค์ ๋ง๋ค๊ธฐ
๋จผ์ Cloud VPN ๊ตฌ์ฑ์์ ๊ตฌ์ฑํ ์ค์ ์ด ํด๋ฌ์คํฐ์ ์ฌ์ฉ๋๋๋ก GKE์์ ๋ฐฐํฌ๋ฅผ ๋ค์ ๋ง๋ญ๋๋ค.
์์ฑ๋
mllp-adapter
ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ํ๊ธฐ ์ํดgcloud container clusters delete
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค์์ ๋ ์ฌ์ฉ๋ COMPUTE_ZONE ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.gcloud container clusters delete mllp-adapter --zone=COMPUTE_ZONE
Kubernetes Engine์ MLLP ์ด๋ํฐ ๋ฐฐํฌ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ GKE์์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ค ๋๋ ์ปค์คํ VPN ๋คํธ์ํฌ ๋ฐ ์๋ธ๋ท ๋ง๋ค๊ธฐ์์ ๋ง๋
cloud-vpn-network
๋คํธ์ํฌ์subnet-us-central-10-0-1
์๋ธ๋ท์ ์ถ๊ฐํฉ๋๋ค.ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ ๋ช ๋ น์ด๊ฐ ๋ค์๊ณผ ๊ฐ์์ง ํ์ธํฉ๋๋ค.
gcloud container clusters create mllp-adapter \ --zone=COMPUTE_ZONE \ --service-account=CLIENT_EMAIL \ --network=cloud-vpn-network \ --subnetwork=subnet-us-central-10-0-1
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
COMPUTE_ZONE์ ํด๋ฌ์คํฐ๊ฐ ๋ฐฐํฌ๋ ์์ญ์ ๋๋ค. ์ด์ ์น์ ์์ Cloud VPN์ ๊ตฌ์ฑํ ๋๋
us-central1
์ ์ฌ์ฉํ๋๋ก 'Google Cloud ์ธก' ๋คํธ์ํฌ๋ฅผ ์ค์ ํ์ต๋๋ค. ์ด 'Google Cloud ์ธก' ๋คํธ์ํฌ๋ GKE ํด๋ฌ์คํฐ๊ฐ ์คํ๋๋ ๋คํธ์ํฌ์ ๋๋ค.us-central1
์์us-central1-c
,us-central1-a
,us-central1-f
,us-central1-b
์ค ์๋ฌด ์์ญ์ด๋ ์ฌ์ฉํ์ธ์.CLIENT_EMAIL์ ์ฌ์ฉํ ์๋น์ค ๊ณ์ ์ ์๋ณ์์ ๋๋ค. SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.comํ์์ ์ฌ์ฉํฉ๋๋ค.
๋คํธ์ํฌ ์ค์ ์ผ๋ก ์ Compute Engine VM ๋ง๋ค๊ธฐ
๋ค์ ๋จ๊ณ์์๋ Google Cloud ์ฝ์์ ์ฌ์ฉํ์ฌ Compute Engine์์ Linux ๊ฐ์ ๋จธ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์์ฑ๋ Compute Engine VM๊ณผ ๋ฌ๋ฆฌ, ์ด VM์ "์จํ๋ ๋ฏธ์ค" ์ธก' ๋คํธ์ํฌ ์ค์ ์ ์ฌ์ฉํ์ฌ VPN์ผ๋ก GKE ํด๋ฌ์คํฐ์ ํต์ ํฉ๋๋ค.
์ฝ์
Google Cloud Console์์ VM ์ธ์คํด์ค ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
์ธ์คํด์ค ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
'์จํ๋ ๋ฏธ์ค' ๋คํธ์ํฌ ์ค์ ๊ณผ ์ผ์นํ๋ ์ธ์คํด์ค์ ๋ฆฌ์ ๋ฐ ์์ญ์ ์ ํํฉ๋๋ค. ๋ฆฌ์ ์ ๊ฒฝ์ฐ
europe-west1 (Belgium)
, ์์ญ์ ๊ฒฝ์ฐeurope-west1-b
์ ๋๋ค.๋ถํ ๋์คํฌ ์น์ ์์ ๋ณ๊ฒฝ์ ํด๋ฆญํ์ฌ ๋ถํ ๋์คํฌ ๊ตฌ์ฑ์ ์์ํฉ๋๋ค.
๊ณต๊ฐ ์ด๋ฏธ์ง ํญ์์ Debian ์ด์์ฒด์ ๋ฒ์ 9๋ฅผ ์ ํํฉ๋๋ค.
์ ํ์ ํด๋ฆญํฉ๋๋ค.
ID ๋ฐ API ์ก์ธ์ค ์น์ ์์ ์์ฑ๋ ์๋น์ค ๊ณ์ ์ ์ ํํฉ๋๋ค.
๋ฐฉํ๋ฒฝ ์น์ ์์ HTTP ํธ๋ํฝ ํ์ฉ์ ์ ํํฉ๋๋ค.
๊ด๋ฆฌ, ๋ณด์, ๋์คํฌ, ๋คํธ์ํน, ๋จ๋ ํ ๋ํธ ์น์ ์ ํผ์นฉ๋๋ค.
๋คํธ์ํน ํญ์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์์ '์จํ๋ ๋ฏธ์ค' ๋คํธ์ํฌ ์ค์ ์ ๋คํธ์ํฌ ์ธ๋ถ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.
- ๋คํธ์ํฌ ํ๋์์ on-prem-vpn-network๋ฅผ ์ ํํฉ๋๋ค.
- ์๋ธ๋คํธ์ํฌ ํ๋์์ subnet-europe-west-10-0-2(10.0.2.0/24)๋ฅผ ์ ํํฉ๋๋ค.
๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
์ธ์คํด์ค๊ฐ ์์๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ค๋น๊ฐ ๋๋ฉด VM ์ธ์คํด์ค ํ์ด์ง์ ๋ น์ ์ํ ์์ด์ฝ์ด ํ์๋ฉ๋๋ค.
gcloud
Compute ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ ์ต์
์ ์ฌ์ฉํด์ gcloud compute instances create
๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
- '์จํ๋ ๋ฏธ์ค' ๋คํธ์ํฌ ์ค์ ๊ณผ ์ผ์นํ๋ ZONE: ์์ญ์ ๊ฒฝ์ฐ
europe-west1-b
http-server
ํ๊ทธ๋ฅผ ์ง์ ํ์ฌ HTTP ํธ๋ํฝ ํ์ฉ- ์์ฑํ SERVICE_ACCOUNT
gcloud compute instances create COMPUTE_NAME \ --project=PROJECT_ID --zone=ZONE --image-family=debian-10 \ --tags=http-server,https-server --service-account=SERVICE_ACCOUNT
์ถ๋ ฅ์ ๋ค์ ์ํ๊ณผ ๋น์ทํฉ๋๋ค.
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/COMPUTE_NAME]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS COMPUTE_NAME ZONE n1-standard-1 INTERNAL_IP EXTERNAL_IP RUNNING
์ธ์คํด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฃํฉ๋๋ค.
์ฝ์
Google Cloud Console์์ VM ์ธ์คํด์ค ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
๊ฐ์ ๋จธ์ ์ธ์คํด์ค ๋ชฉ๋ก์ ๋ฐ๋ก ์ ์ ๋ง๋ ์ธ์คํด์ค ํ์์ SSH๋ฅผ ํด๋ฆญํฉ๋๋ค.
gcloud
์ธ์คํด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด gcloud compute ssh
๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
gcloud compute ssh INSTANCE_NAME \ --project PROJECT_ID \ --zone ZONE
์ด์ Linux ์ธ์คํด์ค์ ์ํธ์์ฉํ ์ ์๋ ํฐ๋ฏธ๋ ์ฐฝ์ด ์๊ฒผ์ต๋๋ค.
ํฐ๋ฏธ๋ ์ฐฝ์์ Netcat์ ์ค์นํฉ๋๋ค.
sudo apt install netcat
hl7v2-mllp-sample.txt
ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ ์ด๋ฅผ ์ธ์คํด์ค์ ์ ์ฅํฉ๋๋ค.MLLP ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ์ ์ฅ์๋ก HL7v2 ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด ํ์ผ์ ๋ค์ด๋ก๋ ํ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ์๋น์ค๋ฅผ ๊ฒ์ฌํ ๋ ํ์๋
LoadBalancer Ingress
๊ฐ์ ์ฌ์ฉํฉ๋๋ค.echo -n -e "\x0b$(cat hl7v2-mllp-sample.txt)\x1c\x0d" | nc LOAD_BALANCER_INGRESS_IP_ADDRESS 2575
๋ช ๋ น์ด๋ฅผ ์คํํ ํ ๋ฉ์์ง๊ฐ MLLP ์ด๋ํฐ๋ฅผ ํตํด HL7v2 ์ ์ฅ์๋ก ์ ์ก๋ฉ๋๋ค. ๋ฉ์์ง๊ฐ HL7v2 ์ ์ฅ์์ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋๋ฉด ์ด ๋ช ๋ น์ด๋ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
MSA|AA|20150503223000|ILITY|FROM_APP|FROM_FACILITY|20190312162410||ACK|f4c59243-19c2-4373-bea0-39c1b2ba616b|P|2.5
์ด ์ถ๋ ฅ์ HL7v2 ์ ์ฅ์๊ฐ
AA
(Application Accept
) ์๋ต ์ ํ์ผ๋ก ์๋ตํ์์ ๋ํ๋ ๋๋ค. ์ฆ, ๋ฉ์์ง๊ฐ ๊ฒ์ฆ๋๊ณ ์ฑ๊ณต์ ์ผ๋ก ์์ง๋ฉ๋๋ค.Pub/Sub ์ฃผ์ ์ ๊ฒ์๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ ค๋ฉด
gcloud pubsub subscriptions pull
๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.gcloud pubsub subscriptions pull --auto-ack PUBSUB_SUBSCRIPTION
๋ช ๋ น์ด๋ ์์ง๋ HL7v2 ๋ฉ์์ง์ ๋ํ ๋ค์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค.
โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ | DATA | MESSAGE_ID | ATTRIBUTES | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------| | projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/HL7V2_MESSAGE_ID | 123456789012345 | msgType=ADT | โ-----------------------------------------------------------------------------------------------------------------|-----------------|---------------โ
๋ํ HL7v2 ์ ์ฅ์์ ๋ฉ์์ง๋ฅผ ๋์ดํ์ฌ ๋ฉ์์ง๊ฐ ์ถ๊ฐ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
curl
curl -X GET \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages"
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
PowerShell
$cred = gcloud auth application-default print-access-token $headers = @{ Authorization = "Bearer $cred" } Invoke-WebRequest ` -Method Get ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages" | Select-Object -Expand Content
์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก์ ๋ฉ์์ง ID๋ฅผ ๋ฐํํฉ๋๋ค.
{ "hl7V2Messages": [ { "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/hl7V2Stores/HL7V2_STORE_ID/messages/MESSAGE_ID" } ] }
์ด ์น์ ์ ์๋ฃํ ํ MLLP ์ด๋ํฐ๋ฅผ GKE์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌํ๊ณ VPN์์ ์ด๋ํฐ๋ฅผ ํตํด '์จํ๋ ๋ฏธ์ค' ์ธ์คํด์ค์์ HL7v2 ๋ฉ์์ง๋ฅผ Cloud Healthcare API๋ก ์์ ํ๊ฒ ์ ์กํ๊ฒ ๋ฉ๋๋ค.
์ญ์
์ด ํํ ๋ฆฌ์ผ์ ์ฌ์ฉ๋ ๋ฆฌ์์ค์ ๋น์ฉ์ด Google Cloud ๊ณ์ ์ ์ฒญ๊ตฌ๋์ง ์๋๋ก Google Cloud์์ ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์ญ์
์ด ํํ ๋ฆฌ์ผ์์ ๋ง๋ ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๊ธฐ ์ํด ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
๋ฌธ์ ํด๊ฒฐ
์ด๋ํฐ ์คํจ
MLLP ์ด๋ํฐ๋ฅผ GKE์ ๋ฐฐํฌํ ํ ์ด๋ํฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ฐฐํฌ๋ ์ํฌ๋ก๋ ๋ฌธ์ ํด๊ฒฐ์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๋ก์ปฌ์์ ์คํํ ๋ Connection refused
์ค๋ฅ
MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ํ
์คํธํ ๋ Connection refused
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์ค๋ฅ๋ ์ผ๋ถ Mac OS ์ฌ์ฉ์์๊ฒ์ ๋ฐ์ํฉ๋๋ค.
--network=host
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๋์-p 2575:2575
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ--receiver_ip=127.0.0.0
์ ์ค์ ํ๋ ๋์--receiver_ip=0.0.0.0
์ ์ค์ ํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.docker run \ -p 2575:2575 \ gcr.io/cloud-healthcare-containers/mllp-adapter \ /usr/mllp_adapter/mllp_adapter \ --hl7_v2_project_id=PROJECT_ID \ --hl7_v2_location_id=LOCATION \ --hl7_v2_dataset_id=DATASET_ID \ --hl7_v2_store_id=HL7V2_STORE_ID \ --export_stats=false \ --receiver_ip=0.0.0.0 \ --pubsub_project_id=PROJECT_ID \ --pubsub_subscription=PUBSUB_SUBSCRIPTION \ --api_addr_prefix=https://healthcare.googleapis.com:443/v1 \ --logtostderr
๋ก์ปฌ์์ ์คํํ ๋ could not find default credentials
์ค๋ฅ
MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ํ
์คํธํ ๋ healthapiclient.NewHL7V2Client: oauth2google.DefaultTokenSource: google: could not find default credentials.
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ์ค๋ฅ๋ ์ด๋ํฐ๊ฐ ๋ก์ปฌ ADC ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ ๋ ๋ฐ์ํฉ๋๋ค. ๋ก์ปฌ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ค์ ํ๋์ง ํ์ธํฉ๋๋ค.
์ธ์ฆ ์ค๋ฅ
์ด ์น์
์ ๋๋จธ์ง ๋ถ๋ถ์์ ๋ค๋ฃจ์ง ์๋ MLLP ์ด๋ํฐ๋ฅผ ๋ก์ปฌ์์ ํ
์คํธํ ๋ ์ธ์ฆ ์๋ฅ๊ฐ ๋ฐ์ํ๋ฉด docker run
๋ช
๋ น์ด๋ฅผ ๋ค์ ์คํํ๊ณ ๋ช
๋ น์ด ๋๋ถ๋ถ์ -v ~/.config:/root/.config
ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ธ์. ์๋์ ๋น์ทํ ๋ชจ์ต์
๋๋ค.
docker run \
-v ~/.config:/root/.config \
...