TCP/IP 연결을 통해 HL7v2 메시지 전송

이 튜토리얼에서는 Minimal Lower Layer Protocol(MLLP)을 사용하여 TCP/IP 연결을 통해 HL7v2 메시지를 전송하는 방법을 설명합니다. 증명자가 MLLP 이미지에 서명하도록 하려면 서명된 MLLP 이미지를 사용하여 TCP/IP 연결로 HL7v2 메시지 전송의 단계를 따르세요.

이 튜토리얼에서는 다음 환경에서 GitHub에 호스팅된 오픈소스 MLLP 어댑터를 실행하는 방법을 설명합니다.

목표

이 튜토리얼을 완료하고 나면 다음의 작업을 수행할 수 있게 됩니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Cloud Healthcare API
  • Google Kubernetes Engine
  • Compute Engine
  • Cloud VPN
  • Pub/Sub

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

이 튜토리얼을 시작하기 전에 MLLP 및 Google Cloud MLLP 어댑터를 검토하여 Minimal Lower Layer Protocol(MLLP)에 대한 개념 문서를 숙지하세요. 개념 문서는 MLLP 개요, 관리 시스템이 MLLP 연결을 통해 Cloud Healthcare API와 메시지를 주고받는 방법, MLLP 보안의 기본 사항을 제공합니다.

MLLP 어댑터를 설정하려면 먼저 Google Cloud 프로젝트를 선택하거나 만들고 다음 단계를 완료하여 필요한 API를 사용 설정해야 합니다.

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud Healthcare API, Google Kubernetes Engine, Container Registry, and Pub/Sub 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Cloud Healthcare API, Google Kubernetes Engine, Container Registry, and Pub/Sub 사용 설정

    API 사용 설정

  8. Kubernetes Engine API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.

셸 선택

이 튜토리얼을 완료하려면 Cloud Shell 또는 로컬 셸을 사용하면 됩니다.

Cloud Shell은 Google Cloud에서 호스팅되는 리소스를 관리하는 데 사용되는 셸 환경입니다. Cloud Shell에는 gcloud CLIkubectl 도구가 사전 설치되어 있습니다. gcloud CLI는 Google Cloud의 기본 명령줄 인터페이스를 제공합니다. kubectl는 GKE 클러스터에서 명령어를 실행하기 위한 명령줄 인터페이스를 제공합니다.

로컬 셸을 사용하려는 경우 gcloud CLI를 설치해야 합니다.

Cloud Shell을 열거나 로컬 셸을 구성하려면 다음 단계를 완료하세요.

Cloud Shell

Cloud Shell을 시작하려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔

  2. 콘솔의 오른쪽 상단에서 Activate Google Cloud Shell(Google Cloud Shell 활성화) 버튼()을 클릭합니다.

Cloud Shell 세션이 콘솔 아래쪽 프레임 안에서 열립니다. 이 셸을 사용하여 gcloudkubectl 명령어를 실행합니다.

로컬 셸

gcloud CLI 및 kubectl 도구를 설치하려면 다음 단계를 완료합니다.

  1. Google Cloud CLI를 설치하고 초기화합니다.
  2. 로컬에서 어댑터를 테스트하는 경우 추가 단계를 완료할 필요가 없으며 데이터 세트 만들기를 계속 진행할 수 있습니다. GKE에 어댑터를 배포하는 경우 다음 명령어를 실행하여 kubectl 명령줄 도구를 설치합니다.

    gcloud components install kubectl

데이터 세트 만들기

Cloud Healthcare API 데이터 세트를 아직 만들지 않았다면 다음 단계를 완료하여 데이터 세트를 만듭니다.

콘솔

  1. Google Cloud 콘솔에서 데이터 세트 페이지로 이동합니다.

    데이터 세트로 이동

  2. 데이터 세트 만들기를 클릭합니다.
  3. 이름 필드에 데이터 세트의 식별자를 입력합니다. 데이터 세트 ID에는 다음이 포함되어야 합니다.
    • 해당 위치의 고유 ID
    • 다음으로 구성된 1~256자의 유니코드 문자열:
      • 숫자
      • 문자
      • 밑줄
      • 대시
      • 마침표
  4. 위치 유형 섹션에서 다음 위치 유형 중 하나를 선택합니다.
    • 리전: 데이터 세트가 Google Cloud 리전 하나 내에 영구적으로 있습니다. 선택한 후 리전 필드에 위치를 입력하거나 선택합니다.
    • 멀티 리전: 데이터 세트가 여러 Google Cloud 리전에 걸쳐 있는 하나의 위치 내에 영구적으로 있습니다. 선택한 후 멀티 리전 필드에 멀티 리전 위치를 입력하거나 선택합니다.
  5. 만들기를 클릭합니다.

새 데이터 세트가 데이터 세트 목록에 표시됩니다.

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 알림 구성을 참조하세요.

주제를 만들려면 다음 단계를 완료합니다.

콘솔

  1. Google Cloud 콘솔에서 Pub/Sub 주제 페이지로 이동합니다.

    Pub/Sub 주제 페이지로 이동

  2. 주제 만들기를 클릭합니다.

  3. URI와 함께 주제 이름을 입력합니다.

    projects/PROJECT_ID/topics/TOPIC_NAME

    여기서 PROJECT_ID는 Google Cloud 프로젝트 ID입니다.

  4. 만들기를 클릭합니다.

gcloud

주제를 만들려면 gcloud pubsub topics create 명령어를 실행합니다.

gcloud pubsub topics create projects/PROJECT_ID/topics/TOPIC_NAME

요청이 성공하면 명령어는 다음 출력을 반환합니다.

Created topic [projects/PROJECT_ID/topics/TOPIC_NAME].

구독을 만들려면 다음 단계를 완료하세요.

콘솔

  1. Google Cloud 콘솔에서 Pub/Sub 주제 페이지로 이동합니다.

    Pub/Sub 주제 페이지로 이동

  2. 프로젝트 주제를 클릭합니다.

  3. 구독 만들기를 클릭합니다.

  4. 구독 이름을 입력합니다.

    projects/PROJECT_ID/subscriptions/SUBSCRIPTION_NAME

  5. 전송 유형가져오기로 설정한 다음 만들기를 클릭합니다.

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 역할을 추가하려면 다음 단계를 완료하세요.

콘솔

  1. Google Cloud 콘솔의 IAM 페이지에서 Healthcare 서비스 에이전트 역할이 관련 프로젝트 서비스 계정의 역할 열에 표시되는지 확인합니다. 계정 이름은 service-PROJECT_NUMBER@gcp-sa-healthcare.iam.gserviceaccount.com입니다. PROJECT_NUMBER를 찾는 방법은 프로젝트 식별을 참조하세요.

  2. 역할과 일치하는 상속 열에서 연필 아이콘을 클릭합니다. 권한 수정 창이 열립니다.

  3. 다른 역할 추가를 클릭한 다음 Pub/Sub 게시자 역할을 검색합니다.

  4. 역할을 선택하고 저장을 클릭합니다. pubsub.publisher 역할이 서비스 계정에 추가됩니다.

gcloud

서비스 계정 권한을 추가하려면 gcloud projects add-iam-policy-binding 명령어를 실행합니다. PROJECT_IDPROJECT_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 저장소에 수집합니다. 어댑터의 소스 코드에서 이를 확인할 수 있습니다.

어댑터를 수신자로 로컬에서 테스트하려면 다음 단계를 완료하세요.

  1. 사전 빌드된 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.
    

    오류가 발생하면 다음 문제 해결 단계를 따르세요.

  2. 어댑터가 포그라운드 프로세스로 실행되는 동안 테스트를 계속하려면 로컬 머신에서 다른 터미널을 엽니다.

  3. 새 터미널에서 Netcat을 설치하려면 다음 명령어를 실행합니다.

    sudo apt install netcat
    
  4. hl7v2-mllp-sample.txt 파일을 다운로드하고 이를 로컬 머신에 저장합니다.

  5. 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) 응답 유형으로 응답했음을 나타냅니다. 즉, 메시지가 검증되고 성공적으로 수집됩니다.

  6. 어댑터를 실행한 터미널을 열어 메시지가 성공적으로 전송되었는지 확인할 수도 있습니다. 출력은 다음 샘플과 같이 표시됩니다.

     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.
    
  7. 메시지가 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.createmessages.ingest를 통해 전송된 Pub/Sub 메시지를 자동으로 확인합니다.

어댑터가 Pub/Sub 메시지를 성공적으로 인출하고 전송하면 알림이 표시됩니다. 어댑터가 Pub/Sub 구독자이므로 이러한 메시지를 자동으로 확인합니다. 따라서 어댑터로 구성한 Pub/Sub 구독의 메시지 큐에서 삭제됩니다.

Pub/Sub 구독에서 가져오고 메시지가 게시되었는지 별도로 확인하려면 이전에 만든 주제에 할당된 두 번째 Pub/Sub 구독을 만들어야 합니다. 두 번째 구독으로 전송된 메시지는 어댑터에서 자동으로 확인되지 않고 계속 유지되므로 가져올 수 있습니다.

이전에 만든 주제에 할당된 두 번째 Pub/Sub 구독을 만들려면 다음 단계를 완료하세요.

콘솔

  1. Google Cloud 콘솔에서 Pub/Sub 주제 페이지로 이동합니다.

    Pub/Sub 주제 페이지로 이동

  2. 프로젝트 주제를 클릭합니다. 최초 구독을 만들 때 사용한 주제입니다.

  3. 구독 만들기를 클릭합니다.

  4. 구독 이름을 입력합니다.

    projects/PROJECT_ID/subscriptions/SECOND_SUBSCRIPTION_NAME

    전송 유형가져오기로 설정합니다.

  5. 만들기를 클릭합니다.

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 이미지를 가져온 머신에서 다음 단계를 완료하세요.

  1. Netcat을 설치합니다.

    sudo apt install netcat
    
  2. hl7v2-mllp-ack-sample.txt 파일을 다운로드하고 이를 로컬 머신에 저장합니다. 이 파일에는 메시지 게시를 시도할 때 어댑터에 응답으로 필요한 ACK 메시지가 포함되어 있습니다.

  3. 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 ...
    
  4. Netcat은 포그라운드 프로세스로 실행되므로 테스트를 계속하려면 로컬 머신에서 다른 터미널을 엽니다.

  5. 어댑터를 시작하려면 새 터미널에서 다음 명령어를 실행합니다.

    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 주소에서 로컬 머신에서 실행되기 시작합니다.

    오류가 발생하면 다음 문제 해결 단계를 따르세요.

    어댑터는 포그라운드 프로세스로 실행되므로 테스트를 계속하려면 로컬 머신에서 다른 터미널을 엽니다.

  6. 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:266] Started to fetch message.
    I0214 00:00:00.000000       1 healthapiclient.go:283] Message was successfully fetched.
    
  7. 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 값과 동일합니다.

  8. 어댑터가 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 저장소를 구성하려면 다음 단계를 완료합니다.

  1. Pub/Sub 주제를 2개 만들고 각 주제에 대해 하나의 구독을 만듭니다. 자세한 내용은 Pub/Sub 주제 및 구독 만들기를 참조하세요.

  2. 다음 명령어를 실행합니다.

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

메시지 라우팅 테스트

메시지 라우팅을 테스트하려면 다음 섹션의 단계를 완료하세요.

첫 번째 수신자 및 어댑터 구성 및 시작

첫 번째 수신자와 어댑터를 구성하고 시작하려면 다음 단계를 완료하세요.

  1. 사전 빌드된 Docker 이미지를 가져온 머신에서 다음 명령어를 실행하여 Netcat을 설치합니다.

    sudo apt install netcat
    
  2. hl7v2-mllp-ack-sample.txt를 다운로드하지 않았다면 다운로드합니다. 파일에는 어댑터가 메시지를 게시하려고 할 때 응답으로 사용되는 ACK 메시지가 포함됩니다.

  3. 첫 번째 수신자에 대해 포트 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 ...
    
  4. 첫 번째 어댑터를 시작하려면 새 터미널에서 다음 명령어를 실행합니다.

    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의 첫 번째 외부 수신자에 새 메시지를 게시합니다.

두 번째 수신자 및 어댑터 구성 및 시작

두 번째 수신자와 어댑터를 구성하고 시작하려면 다음 단계를 완료하세요.

  1. 사전 빌드된 Docker 이미지를 가져온 머신에서 다음 명령어를 실행하여 Netcat을 설치합니다.

    sudo apt install netcat
    
  2. hl7v2-mllp-ack-sample.txt를 다운로드하지 않았다면 다운로드합니다. 파일에는 어댑터가 메시지를 게시하려고 할 때 응답으로 사용되는 ACK 메시지가 포함됩니다.

  3. 두 번째 수신자에 대해 포트 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 ...
    
  4. 두 번째 어댑터를 시작하려면 새 터미널에서 다음 명령어를 실행합니다.

    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으로 두 번째 외부 수신자에 새 메시지를 게시합니다.

첫 번째 수신자에 메시지 게시

첫 번째 외부 수신자에만 게시되는 메시지를 만들려면 다음 단계를 완료합니다.

  1. hl7v2-sample1.json을 다운로드합니다.

  2. 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"
       }
     ]
    }
    

    이 응답에서 sendFacilitySEND_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 값과 동일합니다.

두 번째 수신자에 메시지 게시

두 번째 외부 수신자에만 게시되는 메시지를 만들려면 다음 단계를 완료합니다.

  1. 로컬 머신에서 새 터미널을 엽니다.

  2. 두 번째 외부 수신자에게만 게시되는 메시지를 만들려면 hl7v2-sample2.json을 다운로드하세요.

  3. 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에 측정항목을 쓸 수 있는 권한도 부여할 수 있습니다.

컨테이너 클러스터에 필요한 범위만 포함하는 새 서비스 계정을 만들려면 다음 단계를 완료하세요.

콘솔

서비스 계정을 만듭니다.

  1. Google Cloud Console에서 서비스 계정 만들기 페이지로 이동합니다.

    서비스 계정 만들기로 이동

  2. 프로젝트를 선택합니다.

  3. 서비스 계정 이름 필드에 이름을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

    선택사항: 서비스 계정 설명 필드에 설명을 입력합니다.

  4. 만들기를 클릭합니다.

  5. 역할 선택 필드를 클릭합니다.

    모든 역할에서 Pub/Sub > Pub/Sub 구독자를 클릭합니다.

  6. 다른 역할 추가를 클릭한 다음 역할 선택 필드를 클릭합니다.

    모든 역할에서 Cloud Healthcare > Healthcare HL7v2 메시지 수집을 클릭합니다.

  7. 선택사항: 모니터링을 사용 설정하려면 다른 역할 추가를 클릭한 다음 역할 선택 필드를 클릭합니다.

    모든 역할에서 모니터링 > 모니터링 측정항목 작성자를 클릭합니다.

  8. 계속을 클릭합니다.

  9. 완료를 클릭하여 서비스 계정 만들기를 마칩니다.

    브라우저 창을 닫지 마세요. 다음 절차에서 이 창을 사용합니다.

서비스 계정 키를 만듭니다.

  1. Google Cloud 콘솔에서 자신이 만든 서비스 계정의 이메일 주소를 클릭합니다.

  2. 를 클릭합니다.

  3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.

  4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.

  5. 닫기를 클릭합니다.

gcloud

  1. 서비스 계정을 만들기 위해 gcloud iam service-accounts create 명령어를 실행합니다.

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
    

    서비스 계정이 출력됩니다.

    Created service account SERVICE_ACCOUNT_NAME.
    
  2. 서비스 계정에 각 역할을 부여하기 위해 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
    
  3. 서비스 계정 키를 만들기 위해 gcloud iam service-accounts keys create 명령어를 실행합니다.

    gcloud iam service-accounts keys create ~/FILENAME.json \
       --iam-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    서비스 계정이 생성되면 서비스 계정의 사용자 인증 정보가 포함된 JSON 키 파일이 컴퓨터에 다운로드됩니다. 이 키 파일은 클러스터 생성 중에 --service-account 플래그를 사용하여 Cloud Healthcare API, Pub/Sub API, Cloud Monitoring API를 인증하도록 MLLP 어댑터를 구성하는 데 사용됩니다.

    created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
        [/usr/home/USERNAME/FILENAME.json] for
        [SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com]
    

클러스터 만들기

GKE에서 클러스터를 만들기 위해 gcloud container clusters create 명령어를 실행합니다.

gcloud container clusters create mllp-adapter \
    --zone=COMPUTE_ZONE \
    --service-account CLIENT_EMAIL

각 항목의 의미는 다음과 같습니다.

  • COMPUTE_ZONE은 클러스터가 배포된 영역입니다. 영역은 클러스터와 리소스가 존재하는 대략적인 리전의 위치입니다. 예를 들어 us-west1-aus-west 리전에 있는 한 영역입니다. gcloud config set compute/zone을 사용하여 기본 영역을 설정한 경우 이 플래그의 값이 기본값을 재정의합니다.
  • CLIENT_EMAIL은 서비스 계정의 식별자입니다. 이 이메일 주소는 "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 파일인 배포 매니페스트 파일을 사용하여 배포의 속성을 정의합니다. 샘플은 배포 만들기를 참조하세요.

  1. 별도의 터미널을 엽니다.

  2. 텍스트 편집기를 사용하여 다음 콘텐츠가 포함된 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 인스턴스에는 이러한 작업을 수행할 수 있는 권한이 부여되어 있어야 합니다. 인스턴스를 만들기 전에 다음 단계를 완료하여 필요한 권한으로 새 서비스 계정을 만듭니다.

콘솔

서비스 계정을 만듭니다.

  1. Google Cloud Console에서 서비스 계정 만들기 페이지로 이동합니다.

    서비스 계정 만들기로 이동

  2. 프로젝트를 선택합니다.

  3. 서비스 계정 이름 필드에 이름을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다.

    선택사항: 서비스 계정 설명 필드에 설명을 입력합니다.

  4. 만들기를 클릭합니다.

  5. 역할 선택 필드를 클릭합니다.

    모든 역할에서 Pub/Sub > Pub/Sub 구독자를 클릭합니다.

  6. 다른 역할 추가를 클릭한 다음 역할 선택 필드를 클릭합니다.

    모든 역할에서 Cloud Healthcare > Healthcare HL7v2 메시지 소비자를 클릭합니다.

  7. 계속을 클릭합니다.

  8. 완료를 클릭하여 서비스 계정 만들기를 마칩니다.

    브라우저 창을 닫지 마세요. 다음 절차에서 이 창을 사용합니다.

서비스 계정 키를 만듭니다.

  1. Google Cloud 콘솔에서 자신이 만든 서비스 계정의 이메일 주소를 클릭합니다.

  2. 를 클릭합니다.

  3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.

  4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.

  5. 닫기를 클릭합니다.

gcloud

  1. 서비스 계정을 만들기 위해 gcloud iam service-accounts create 명령어를 실행합니다.

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
    

    서비스 계정이 출력됩니다.

    Created service account SERVICE_ACCOUNT_NAME.
    
  2. 서비스 계정에 각 역할을 부여하기 위해 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
    
  3. 서비스 계정 키를 만들기 위해 gcloud iam service-accounts keys create 명령어를 실행합니다.

    gcloud iam service-accounts keys create ~/FILENAME.json \
       --iam-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    서비스 계정이 생성되면 서비스 계정의 사용자 인증 정보가 포함된 JSON 키 파일이 컴퓨터에 다운로드됩니다.

다음 단계는 Compute Engine에서 Linux 가상 머신 인스턴스를 만드는 방법을 보여줍니다.

콘솔

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. 클러스터를 만들 때 선택한 영역과 일치하는 인스턴스의 리전영역을 선택합니다. 예를 들어 클러스터를 만들 때 COMPUTE_ZONEus-central1-a를 사용한 경우 인스턴스 생성 화면에서 리전us-central1 (Iowa)를, 영역us-central1-a를 선택합니다.

  4. 부팅 디스크 섹션에서 변경을 클릭하여 부팅 디스크 구성을 시작합니다.

  5. 공개 이미지 탭에서 Debian 운영체제 버전 9를 선택합니다.

  6. 선택을 클릭합니다.

  7. ID 및 API 액세스 섹션에서 생성된 서비스 계정을 선택합니다.

  8. 방화벽 섹션에서 HTTP 트래픽 허용을 선택합니다.

  9. 만들기를 클릭하여 인스턴스를 만듭니다.

gcloud

Compute 인스턴스를 만들기 위해 다음 옵션을 사용해서 gcloud compute instances create 메서드를 실행합니다.

gcloud compute instances create COMPUTE_NAME \
   --project=PROJECT_ID \
   --zone=ZONE \
   --image-family=debian-9 \
   --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 네트워크가 사용됩니다. 즉, 인스턴스에서 클러스터로 트래픽이 전송될 수 있습니다.

인스턴스에 연결하기 위해 다음 단계를 완료합니다.

콘솔

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 가상 머신 인스턴스 목록의 바로 전에 만든 인스턴스 행에서 SSH를 클릭합니다.

gcloud

인스턴스에 연결하기 위해 gcloud compute ssh 명령어를 실행합니다.

gcloud compute ssh INSTANCE_NAME \
    --project PROJECT_ID \
    --zone ZONE

이제 Linux 인스턴스와 상호작용할 수 있는 터미널 창이 생겼습니다.

  1. 터미널 창에서 Netcat을 설치합니다.

    sudo apt install netcat
    
  2. hl7v2-mllp-sample.txt 파일을 다운로드하고 이를 인스턴스에 저장합니다. 파일에 사용된 인코딩 및 세그먼트 종료자에 대한 자세한 내용은 HL7v2 메시지 세그먼트 구분자 및 인코딩을 참조하세요.

  3. 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) 응답 유형으로 응답했음을 나타냅니다. 즉, 메시지가 검증되고 성공적으로 수집됩니다.

  4. 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   |
    └-----------------------------------------------------------------------------------------------------------------|-----------------|---------------┘
    
  5. 또한 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 구성

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 네트워크 두 개와 해당 서브넷을 만듭니다.

  1. 첫 번째 VPC 네트워크인 cloud-vpn-network를 만들기 위해 다음 명령어를 실행합니다.

    gcloud compute networks create cloud-vpn-network \
       --project=PROJECT_ID \
       --subnet-mode=custom
    
  2. 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
    
  3. on-prem-vpn-network VPC 네트워크를 만들기 위해 다음 명령어를 실행합니다.

    gcloud compute networks create on-prem-vpn-network \
       --project=PROJECT_ID \
       --subnet-mode=custom
    
  4. 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 주소를 예약합니다.

  1. cloud-vpn-ip 주소에 리전의 외부(고정) IP 주소를 예약하려면 다음 명령어를 실행합니다.

    gcloud compute addresses create cloud-vpn-ip \
       --project=PROJECT_ID \
       --region=us-central1
    
  2. on-prem-vpn-ip 주소에 리전의 외부(고정) IP 주소를 예약하려면 다음 명령어를 실행합니다.

    gcloud compute addresses create on-prem-vpn-ip \
       --project=PROJECT_ID \
       --region=europe-west1
    
  3. 다음 섹션에서 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 게이트웨이, 터널, 경로를 만듭니다.

  1. 강력한 사전 공유 키 생성의 안내에 따라 암호화된 강력한 사전 공유 키(공유 비밀번호)를 만듭니다. 이 키는 이 섹션에서 SHARED_SECRET로 참조됩니다.

  2. 대상 VPN 게이트웨이 객체를 만들기 위해 다음 명령어를 실행합니다.

    gcloud compute target-vpn-gateways create vpn-us-central \
       --project PROJECT_ID \
       --region us-central1 \
       --network cloud-vpn-network
    
  3. 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
    
  4. 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
    
  5. 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 게이트웨이, 터널, 경로를 만들려면 다음 단계를 완료하세요.

  1. 대상 VPN 게이트웨이 객체를 만들기 위해 다음 명령어를 실행합니다.

    gcloud compute target-vpn-gateways create "vpn-europe-west" \
       --project PROJECT_ID \
       --region "europe-west1" \
       --network "on-prem-vpn-network"
    
  2. 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
    
  3. '온프레미스' 게이트웨이에 터널을 만들려면 다음 명령어를 실행합니다.

    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
    
  4. 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 터널의 한쪽에 있는 서브넷에서 다른 한쪽으로 인그레스되도록 허용합니다.

  1. 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
    
  2. '온프레미스' 서브넷에 대한 방화벽 규칙을 만들려면 다음 명령어를 실행합니다.

    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
    
  3. 다음 명령어를 실행하여 포트 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 터널의 상태 확인

터널이 작동하는지 확인하려면 다음 단계를 완료합니다.

  1. Google Cloud 콘솔에서 VPN 페이지로 이동합니다.

    VPN 페이지로 이동

  2. Google VPN 터널 탭을 클릭합니다.

  3. 각 터널의 상태 필드에서 녹색 체크표시와 '설정됨'이라는 단어를 찾습니다. 이러한 항목이 있으면 게이트웨이가 터널을 협상한 것입니다. 몇 분 후에도 표시가 나타나지 않으면 문제 해결을 참조하세요.

    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에서 배포를 다시 만듭니다.

  1. 생성된 mllp-adapter 클러스터를 삭제하기 위해 gcloud container clusters delete 명령어를 실행합니다. 클러스터를 만들었을 때 사용된 COMPUTE_ZONE 값을 입력합니다.

    gcloud container clusters delete mllp-adapter --zone=COMPUTE_ZONE
    
  2. 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은 서비스 계정의 식별자입니다. "client_email": 필드의 서비스 계정 키 파일에서 이를 찾을 수 있습니다. 형식은 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com입니다.

네트워크 설정으로 새 Compute Engine VM 만들기

다음 단계에서는 Google Cloud 콘솔을 사용하여 Compute Engine에서 Linux 가상 머신 인스턴스를 만드는 방법을 보여줍니다. 생성된 Compute Engine VM과 달리, 이 VM은 "온프레미스" 측' 네트워크 설정을 사용하여 VPN으로 GKE 클러스터와 통신합니다.

콘솔

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 인스턴스 만들기를 클릭합니다.

  3. '온프레미스' 네트워크 설정과 일치하는 인스턴스의 리전영역을 선택합니다. 리전의 경우 europe-west1 (Belgium), 영역의 경우 europe-west1-b입니다.

  4. 부팅 디스크 섹션에서 변경을 클릭하여 부팅 디스크 구성을 시작합니다.

  5. 공개 이미지 탭에서 Debian 운영체제 버전 9를 선택합니다.

  6. 선택을 클릭합니다.

  7. ID 및 API 액세스 섹션에서 생성된 서비스 계정을 선택합니다.

  8. 방화벽 섹션에서 HTTP 트래픽 허용을 선택합니다.

  9. 관리, 보안, 디스크, 네트워킹, 단독 테넌트 섹션을 펼칩니다.

  10. 네트워킹 탭의 네트워크 인터페이스에서 '온프레미스' 네트워크 설정의 네트워크 세부정보를 지정합니다.

    1. 네트워크 필드에서 on-prem-vpn-network를 선택합니다.
    2. 서브네트워크 필드에서 subnet-europe-west-10-0-2(10.0.2.0/24)를 선택합니다.
  11. 만들기를 클릭하여 인스턴스를 만듭니다.

인스턴스가 시작될 때까지 잠시 기다립니다. 준비가 되면 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-9 \
   --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

인스턴스에 연결하기 위해 다음 단계를 완료합니다.

콘솔

  1. Google Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. 가상 머신 인스턴스 목록의 바로 전에 만든 인스턴스 행에서 SSH를 클릭합니다.

gcloud

인스턴스에 연결하기 위해 gcloud compute ssh 명령어를 실행합니다.

gcloud compute ssh INSTANCE_NAME \
    --project PROJECT_ID \
    --zone ZONE

이제 Linux 인스턴스와 상호작용할 수 있는 터미널 창이 생겼습니다.

  1. 터미널 창에서 Netcat을 설치합니다.

    sudo apt install netcat
    
  2. hl7v2-mllp-sample.txt 파일을 다운로드하고 이를 인스턴스에 저장합니다.

  3. 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) 응답 유형으로 응답했음을 나타냅니다. 즉, 메시지가 검증되고 성공적으로 수집됩니다.

  4. 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   |
    └-----------------------------------------------------------------------------------------------------------------|-----------------|---------------┘
    
  5. 또한 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에서 만든 리소스를 삭제할 수 있습니다.

프로젝트 삭제

이 튜토리얼에서 만든 프로젝트를 삭제하기 위해 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

문제 해결

어댑터 실패

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. See https://developers.google.com/accounts/docs/application-default-credentials for more information. 오류가 발생합니다.

어댑터가 Google Cloud 사용자 인증 정보를 찾을 수 없으면 이 오류가 발생합니다. 오류를 해결하려면 명령어를 다시 실행하기 전에 다음 방법 중 하나를 시도해보세요.

인증 오류

이 섹션의 나머지 부분에서 다루지 않는 MLLP 어댑터를 로컬에서 테스트할 때 인증 요류가 발생하면 docker run 명령어를 다시 실행하고 명령어 끝부분에 -v ~/.config:/root/.config 플래그를 추가하세요. 아래와 비슷한 모습입니다.

docker run \
-v ~/.config:/root/.config \
...