レガシーコードの活用

App Engine にアプリを移行したいが、サーバー側のコードが特定のオペレーティング システムに縛られていて、簡単に移植できないという問題があります。これは、C++ または Visual Basic で記述された古い COM オブジェクトを使用しているか、さらには、ソースコードが存在せず、実行可能バイナリだけが残っていることが考えられます。

このチュートリアルでは、App Engine、Compute Engine、Cloud Pub/Sub を使用してレガシーコードを呼び出すためのアーキテクチャ パターンについて説明し、パターンの実装例を示します。実装例は、Windows 固有のコードに重点を置いていますが、ここで説明するパターンは、どのレガシーコードにも再利用できます。

目標

  • Google Cloud Platform(GCP)でレガシーコードを呼び出すための単純なアーキテクチャ パターンについて学習する。
  • アーキテクチャ パターンの実装例をダウンロードしてデプロイする。

レガシーコードを呼び出すためのアーキテクチャ パターン

次の図は、App Engine アプリからレガシーコードを呼び出すために使用できるアーキテクチャ パターンを示しています。

レガシーコードを呼び出すためのアーキテクチャ パターン
図 1: レガシーコードを呼び出すためのアーキテクチャ パターン

このアーキテクチャは次のように機能します。

  1. ウェブ クライアントが、Cloud Pub/Sub トピックへのリクエストを記述する App Engine アプリにリクエストを送信します。

  2. コードラッパーがトピックからリクエストをプルします。

  3. コードラッパーがレガシーコードを呼び出します。

  4. レガシーコードがラッパーに結果を返します。ラッパーが App Engine アプリにその結果を返し、アプリがウェブ クライアントにその結果を返します。

パターンの実装例

上記のパターンの実装例は、GitHub で見つけることができます。このサンプルアプリは、文字列を入力として受け取り、パターンで概説されたコンポーネントを使用して文字列を処理し、すべて大文字のバージョンを返します。アプリコードは、次の 2 つの主要コンポーネントで構成されます。

  • 受信リクエストを Cloud Pub/Sub トピックに発行する App Engine アプリ。
  • 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

依存関係をインストールする

コマンドライン ターミナルで、pubsub-shout-csharp リポジトリのローカルコピー内の appengine-python-flask に移動して、次のコマンドを実行します。

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

Compute Engine のインスタンスを作成する

コードラッパーとレガシーコードが実行される Compute Engine のインスタンスを作成します。

  1. GCP Console の [新しいインスタンスの作成] ページに移動します。

  2. [ブートディスク] セクションで、[変更] をクリックします。

  3. 事前構成されたイメージのリストから [Windows Server 2012 R2 Datacenter Edition] を選択し、[選択] をクリックします。

  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 エクスプローラで、windows-csharp フォルダの下にある ShoutService\bin フォルダに移動します。

  3. Windows エクスプローラから Release フォルダをコピーして、リモート接続ウィンドウ内に貼り付け、フォルダをインスタンスにコピーします。Release フォルダには、ラッパーと Shout サービスが含まれています。

次に、ローカル サービス(サービス コントロール マネージャーによって使用される事前定義済みの Windows ユーザー アカウント)に適切な権限を付与することで、Windows Service Control Manager にサービスの開始と停止、またはサービスとのやり取りを許可します。

  1. Windows エクスプローラで、Release フォルダに移動します。

  2. フォルダを右クリックしてコンテキスト メニューを開き、[プロパティ] をクリックします。

  3. [Release のプロパティ] ダイアログで、[セキュリティ] タブをクリックします。

  4. [編集] をクリックします。

  5. [Release のアクセス許可] ダイアログで [追加] をクリックします。

  6. [ユーザーまたはグループの選択] ダイアログの [選択するオブジェクト名を入力してください] に LOCAL SERVICE と入力して [OK] をクリックします。

  7. [Release のアクセス許可] ダイアログで [LOCAL SERVICE] をクリックします。

  8. [LOCAL SERVICE のアクセス許可] の下で、次のアクセス許可が有効になっていることを確認します。

    • 読み取りと実行
    • フォルダ内容の一覧表示
    • 読み取り
  9. [OK] をクリックします。

最後に、コードラッパー サービスをインストールします。

  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. インスタンスを削除するには、[削除] () をクリックします。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...