레거시 코드 호출

앱을 App Engine으로 마이그레이션할 때 직면하는 문제 중 하나는 서버 측 코드가 특정 운영체제에 귀속되어 있기 때문에 쉽게 이식할 수 없다는 것입니다. C++ 또는 Visual Basic으로 오래 전에 작성된 COM 객체를 사용하고 있거나, 최악의 경우 소스 코드를 분실하여 실행 바이너리만 남은 상태일 수도 있습니다.

이 가이드에서는 App Engine, Compute Engine, Cloud Pub/Sub을 사용하여 이전 코드를 호출하는 아키텍처 패턴을 설명하고 패턴의 구현 예를 제시합니다. 구현 예에서는 Windows 관련 코드에 중점을 두지만, 어떠한 이전 코드에도 여기에서 설명하는 패턴을 재사용할 수 있습니다.

목표

  • Google Cloud Platform(GCP)에서 이전 코드를 호출하는 간단한 아키텍처 패턴을 알아봅니다.
  • 아키텍처 패턴의 구현 예를 다운로드하고 배포합니다.

이전 코드를 호출하는 아키텍처 패턴

아래 다이어그램은 App Engine 앱에서 이전 코드를 호출하는 데 사용할 수 있는 아키텍처 패턴을 보여줍니다.

레거시 코드를 호출하는 아키텍처 패턴
그림 1: 이전 코드를 호출하는 아키텍처 패턴

이 아키텍처의 동작은 다음과 같습니다.

  1. 웹 클라이언트에서 App Engine 앱으로 요청을 보내면 앱은 Cloud Pub/Sub 주제에 대한 요청을 작성합니다.

  2. 코드 래퍼가 주제에서 요청을 가져옵니다.

  3. 코드 래퍼가 이전 코드를 호출합니다.

  4. 이전 코드가 결과를 래퍼에 반환합니다. 래퍼는 결과를 App Engine 앱에 반환하고, 앱은 결과를 웹 클라이언트에 반환합니다.

패턴 구현 예

GitHub에서 위 패턴의 구현을 확인할 수 있습니다. 이 예제 앱은 문자열을 입력받고, 이 패턴에서 설명하는 구성요소를 사용하여 문자열을 처리하고, 전체 대문자 버전을 반환합니다. 앱 코드는 다음과 같은 두 가지 주요 부분으로 구성됩니다.

  • App Engine 앱: Cloud Pub/Sub 주제로 수신되는 요청을 게시합니다.
  • 코드 래퍼: Cloud Pub/Sub 주제를 구독하면서 요청이 수신되면 이전 Windows 기반 코드에 요청을 보냅니다.

이 구현에서 래퍼는 C#으로 작성된 Windows 서비스입니다. 이 래퍼 서비스는 인스턴스 시작 시 실행되도록 구성되며, C#에서 호출 가능한 모든 스크립트 또는 바이너리를 호출할 수 있습니다. 래퍼 서비스와 호출되는 바이너리는 모두 Windows Server 2012 R2를 실행하는 Compute Engine 인스턴스에 상주합니다.

앱의 사용자 인터페이스는 다음과 유사합니다.

Shout 앱 사용자 인터페이스
그림 2: Shout 앱 사용자 인터페이스

'mars'라는 단어를 입력하고 Submit을 클릭하면 다음과 같은 결과가 표시됩니다.

Shout 앱 결과
그림 3: Shout 앱 결과

이 가이드는 Google Cloud Platform의 다음 청구 가능 구성요소를 사용합니다.

  • Windows Server 2012 라이선스가 있는 Compute Engine 인스턴스
  • Cloud Pub/Sub 서비스

가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 생성할 수 있습니다. GCP 신규 사용자는 무료 평가판을 사용할 수 있습니다.

기본 요건

이 예제 앱은 다음과 같은 사항을 전제합니다.

소스 코드 가져오기

여기에서 예시 코드를 다운로드하여 압축을 풉니다. 필요한 경우 다음 명령어를 실행하여 GitHub 프로젝트 저장소를 복제할 수 있습니다.

C:\> git clone https://github.com/GoogleCloudPlatform/pubsub-shout-csharp.git

종속 항목 설치

명령줄 터미널에서 appengine-python-flask 저장소의 로컬 복사본에 있는 pubsub-shout-csharp 폴더로 이동하여 다음을 실행합니다.

C:\> pip install -r requirements.txt -t lib

Compute Engine 인스턴스 만들기

코드 래퍼 및 레거시 코드가 실행될 Compute Engine 인스턴스를 만듭니다.

  1. GCP Console에서 새 인스턴스 만들기 페이지로 이동합니다.

  2. 부팅 디스크 섹션에서 변경을 클릭합니다.

  3. 사전 구성된 이미지 목록에서 Windows Server 2012 R2 Datacenter 에디션을 선택하고 선택을 클릭합니다.

  4. 방화벽 섹션에서 HTTP 및 HTTPS 트래픽을 허용합니다.

  5. 프로젝트 액세스 섹션에서 프로젝트의 모든 GCP 서비스에 전체 API 액세스를 허용합니다.

  6. 관리, 보안, 디스크, 네트워킹, 단독 임대를 클릭하고 네트워킹 탭을 클릭하여 고급 옵션을 표시합니다.

  7. 네트워크 태그 섹션에서 rdp-tag 태그를 추가합니다. 이 가이드의 뒷부분에서 이 태그가 지정된 모든 인스턴스에 외부 RDP 액세스를 허용하는 방화벽 규칙을 만듭니다.

  8. 만들기를 클릭하여 새 인스턴스 만들기를 시작합니다.

인스턴스가 생성되었으면 인스턴스에 기본 Windows 사용자를 추가합니다.

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

  2. 새로 배포한 인스턴스의 이름을 클릭합니다.

  3. 인스턴스 페이지에서 Windows 비밀번호 설정 버튼을 클릭합니다.

  4. 새 Windows 비밀번호 설정 대화상자에서 사용자 이름을 추가하고 설정을 클릭하여 인스턴스에 사용자 계정을 만듭니다.

  5. 입력한 비밀번호를 기록해 두고 대화상자를 닫습니다.

다음으로 인스턴스에 대한 RDP 액세스를 허용하는 방화벽 규칙을 만듭니다.

  1. GCP Console에서 방화벽 규칙 만들기 페이지로 이동합니다.

  2. 다음과 같이 양식을 작성합니다.

    • 이름: rdp-rule
    • 소스 IP 범위: 0.0.0.0/0
    • 허용되는 프로토콜 및 포트: tcp:3389
    • 대상 태그: rdp-tag
  3. 만들기를 클릭하여 방화벽 규칙을 만듭니다.

코드 래퍼 빌드 및 배포

코드 래퍼 서비스를 빌드하는 방법은 다음과 같습니다.

  1. GCP Console에서 사용자 인증 정보 페이지로 이동합니다.

  2. 새 사용자 인증 정보를 클릭하고 서비스 계정 키를 선택합니다.

  3. 서비스 계정 키 만들기 페이지에서 다음과 같이 양식을 작성합니다.

    • 서비스 계정: 새 서비스 계정
    • 이름: 직접 선택한 이름
    • 서비스 계정ID: 직접 선택한 ID
    • 키 유형: JSON
  4. 만들기를 클릭합니다. 몇 초 후에 JSON 키 파일이 로컬 컴퓨터로 다운로드됩니다.

  5. 로컬 머신에서 GOOGLE_APPLICATION_CREDENTIALS라는 새로운 환경 변수를 만들고 JSON 키 파일의 절대 경로로 설정합니다.

  6. pubsub-shout-csharp 저장소 로컬 복사본의 windows-csharp 폴더로 이동합니다.

  7. Visual Studio 2012 이상에서 ShoutService.sln을 엽니다.

  8. ShoutLib/Constants.cs를 수정하여 ProjectId 변수를 https://console.cloud.google.com/ 프로젝트 ID로 설정하고 저장합니다.

  9. 빌드 메뉴에서 솔루션 빌드를 클릭하여 앱을 빌드합니다.

코드 래퍼 서비스가 빌드되었으면 Compute Engine 인스턴스로 복사합니다.

  1. 가이드의 앞부분에서 만든 인스턴스에 대한 원격 데스크톱 연결을 설정합니다.

  2. 로컬 머신에서 Windows Explorer(Windows 탐색기)를 열고 windows-csharp 폴더 아래의 ShoutService\bin 폴더로 이동합니다.

  3. Windows Explorer(Windows 탐색기)에서 Release 폴더를 복사하여 원격 연결 창에 붙여넣습니다. 이렇게 하면 이 폴더가 인스턴스에 복사됩니다. Release 폴더는 래퍼 및 Shout 서비스를 포함합니다.

다음으로, Service Control Manager(서비스 제어 관리자)에서 사용하는 사전 정의된 Windows 사용자 계정인 LOCAL SERVICE에 적절한 권한을 부여하여 Windows Service Control Manager(서비스 제어 관리자)가 서비스 시작, 중지 등의 상호작용을 수행할 수 있도록 허용합니다.

  1. Windows Explorer(Windows 탐색기)에서 Release 폴더로 이동합니다.

  2. 폴더를 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 열고 Properties(속성)을 클릭합니다.

  3. Release Properties(Release 속성) 대화상자에서 Security(보안) 탭을 클릭합니다.

  4. Edit(수정)을 클릭합니다.

  5. Permissions for Release(Release의 사용 권한) 대화상자에서 Add(추가)를 클릭합니다.

  6. Select Users or Groups(사용자 또는 그룹 선택) 대화상자에서 Enger the object names to select(선택할 객체 이름을 입력하십시오) 아래에 LOCAL SERVICE를 입력하고 OK(확인)를 클릭합니다.

  7. Release의 사용 권한 대화상자에서 LOCAL SERVICE를 클릭합니다.

  8. LOCAL SERVICE의 사용 권한 아래에서 다음 권한이 허용되었는지 확인합니다.

    • 읽기 및 실행
    • 폴더 내용 보기
    • 읽기
  9. 확인을 클릭합니다.

마지막으로, 코드 래퍼 서비스를 설치합니다.

  1. 원격 머신에서 관리자 권한으로 명령줄 터미널을 열고 Release 폴더로 이동합니다.

  2. 코드 래퍼 서비스를 설치합니다.

    C:\> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe ShoutService.exe
    

App Engine 앱 배포

App Engine 앱을 배포하려면 다음 안내를 따르세요.

  1. 로컬 머신에서 명령줄 터미널을 열고 pubsub-shout-csharp 저장소 로컬 복사본의 appengine-python-flask 폴더로 이동합니다.

  2. 앱을 배포합니다.

    C:\> appcfg.py -A <your_project_id> -V 1 --oauth2 update .
  3. 메시지가 나타나면 앱을 인증합니다.

  4. Cloud Pub/Sub API를 사용 설정합니다.

    API 사용 설정

  5. 웹브라우저에서 다음 URL을 방문하여 앱을 초기화합니다.

    https://<your_project_id>.appspot.com/init

    이 URL을 방문하면 App Engine 앱에서 Cloud Pub/Sub 주제를 만들고 코드 래퍼 서비스가 이 주제를 구독하도록 설정합니다.

수고하셨습니다. 이제 앱이 작동하고 있습니다. <your_project_id>.appspot.com을 방문하여 직접 확인해 보세요.

삭제

레거시 코드 호출 가이드를 완료했으면 GCP에서 만든 리소스가 할당량을 소모하지 않고 이후에 이 리소스에 대하여 요금이 청구되지 않도록 이 리소스를 삭제할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.

GCP 프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

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

Compute Engine 인스턴스 삭제

Compute Engine 인스턴스를 삭제하는 방법은 다음과 같습니다.

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

    VM 인스턴스 페이지로 이동

  2. 다음 옆에 있는 체크박스를 클릭합니다. 삭제할 인스턴스
  3. 페이지 상단의 삭제 삭제를 클릭하여 인스턴스를 삭제합니다.

다음 단계

  • 다른 Google Cloud Platform 기능을 직접 사용해 보려면 가이드를 살펴보세요.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...