OpenShift 上で MySQL データベースを作成し、マイクロサービス・アプリにリンクさせる

通常、データベースをオンライン・サーバーにデプロイするのは、口で言うほど簡単なことではありません。デプロイにも、アプリケーションへのデータベースの統合にも、かなりの構成作業が必要になります。データベースをデプロイできたとしても、その後のデプロイメントの保守、更新、モニタリング、ロギングは非常に骨の折れるタスクになり兼ねません。しかも、ローカルでデータベースにアクセスするとしたら、対処しなければならないセキュリティー上の懸念事項が無数にあります。幸いにも、こうした苦労は Red Hat OpenShift によって軽減できます!開発環境でも、さらには本番環境のファイアウォールの背後でも、数回クリックするだけで、MySQL データベースを安全にデプロイしてすぐに使用可能な状態にすることができ、ローカル・マシンからアクセスするのか、デプロイ済みのポッド自体からアクセスするのかを問わず、データベースに安全にアクセスしてデータを取り込むことができます。

このチュートリアルではステップバイステップの手順に沿って、MySQL インスタンスを Red Hat OpenShift on IBM Cloud 上で作成して、同じく Red Hat OpenShift 上にデプロイされたマイクロサービス・ベースのアプリケーションに統合する方法を説明します。このチュートリアルの対象読者は、アプリケーションをデプロイ、管理、更新、モニタリングする作業に追われていて、マイクロサービス全般に興味をお持ちの開発者です。チュートリアルの手順を完了した時点で、顧客のリストと各顧客の詳細のすべてをデータベースから収集して表示できる、マイクロサービス・ベースのサンプル・アプリケーションを完成できます。

前提条件

このチュートリアルの手順に従うには、SQL の基本知識が必要です。また、手順を開始する前に、以下の環境をセットアップしておいてください。

所要時間

このチュートリアルの所要時間は約 45 分です。

ステップ 1: MySQL データベース・インスタンスを作成してデータを追加する

最初のステップは、プロジェクトを作成することです。それには、以下のコマンドを使用します。

oc new-project mysql-project

または、Web コンソールからプロジェクトを作成することもできます。

OpenShift Container Platform Web コンソールのスクリーン・キャプチャー

  1. Web コンソールを使用して MySQL データベース・インスタンスを作成するには、まず、カタログから「MySQL (Ephemeral) (MySQL (エフェメラル))」を選択します。

    エフェメラルとは、基本的にデータベースがステートレスであることを意味します。つまり、データベースを格納するポットが再起動 / 削除されると、そのデータベースに保管されているデータはすべて失われるということです。一般に、エフェメラルなデータベースはテスト / 開発目的で使用します。エフェメラル以外の選択肢として、カタログから「MySQL」を選択すると永続ボリューム・ストレージがプロジェクトに追加されますが、この方法はチュートリアルの対象範囲外です。

  2. カタログから「MySQL (Ephemeral) MySQL (エフェメラル)」を選択した後、「MySQL Connection Username (MySQL 接続ユーザー名)」、「MySQL Connection Password (MySQL 接続パスワード)」、「MySQL root user Password (MySQL root ユーザー・パスワード)」に新しい値を入力します。これらの値は資格情報として、後でデータベースにアクセスする際に「Database Service Name (データベース・サービス名)」と「MySQL Database Name (MySQL データベース名)」の値と併せて使用します。サービス・インスタンスがプロビジョニングされるまでには 1 分ほどかかります。

    「MySQL(Ephemeral) (MySQL (エフェメラル))」ページのスクリーン・キャプチャー 

  3. MySQL サービス・インスタンスが用意されたので、次はデータベースにデータを取り込みます。それには 2 つの方法があります。

    • 1 つは、デプロイメントが格納されている実際のポッドにアクセスし、mysql クライアントを使用してデータベースにデータを取り込むという方法です。

      1. ターミナルを開き、以下のコマンドを実行します。

         oc get pods
        
      2. 上記の MySQL が格納されているポッドの名前をコピーした上で、以下のコマンドを実行します。

         oc rsh <POD_NAME>
        
      3. ポッドにログインしたら、データベースにデータを追加します。それには以下のコマンドを実行します。

         mysql -u  <ENTER_MYSQL_USERNAME> -p
        

        MySQL データベースにデータを追加する操作を示す画面のスクリーン・キャプチャー

      4. ログイン後に、以下のクエリーを実行して新しいテーブルを作成します。

         USE sampledb; DROP TABLE IF EXISTS customer; CREATE TABLE IF NOT EXISTS customer ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, customerName VARCHAR( 255 ) NOT NULL, effectiveDate VARCHAR( 255 ), description TEXT, status VARCHAR( 255 ) NOT NULL );
        
      5. 続いて以下のコマンドを実行して、新しく作成したテーブルにデータを追加します。

         USE sampledb; INSERT INTO customer VALUES (1,'Testers Inc.','2020-04-01','Testers are who we hire to test our software','active'), (2,'Deployers CO','2019-06-01','Deployers co. deploy our software','active'), (3,'DJ John Doe','2019-12-01','John provides the music for our annual holiday party.',"active"), (4,'Doe Hypermarket','2019-06-05','Doe is where we purchase all food supply.',"active");
        
      6. すべて順調に運んでいることを確認するために、以下のクエリーを実行します。先ほど入力したレコードが表示されたら、何も問題はないことになります。

         select * from sampledb.customer;
        
      7. データベースにデータが追加されたので、exit と入力して mysql クライアントを終了します。次に exit を再度入力してポッドを終了します。

    • データベースにデータを取り込むもう 1 つの方法は、ホスト・マシン上で MySQL Workbench などのデータベース管理ツールを使用することです。この場合は、MySQL サーバーが格納されているポット内のポートをローカル・マシン上のポートに転送します。

      1. ターミナルを開き、以下のコマンドを実行します。

         oc get pods
        
      2. 上記の MySQL が格納されているポッドの名前をコピーした上で、以下のコマンドを実行します。

         oc port-forward <POD_NAME> :3306
        

        このコマンドは、ポッドに格納されている MySQL サーバーをホストするポートとして、ローカル・マシン上の空きポートを割り当てます。

        MySQL サーバーをホストする空きポートを割り当てる操作を示す画面のスクリーン・キャプチャー

      3. MySQL Workbench を開き、データベース資格情報と localhost に割り当てられたポートを使用して、新しい接続を追加します。

        MySQL Workbench のスクリーン・キャプチャー

      4. 接続されたら、以下のクエリーを実行して新しいテーブルを作成します。

         USE sampledb; DROP TABLE IF EXISTS customer; CREATE TABLE IF NOT EXISTS customer ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, customerName VARCHAR( 255 ) NOT NULL, effectiveDate VARCHAR( 255 ), description TEXT, status VARCHAR( 255 ) NOT NULL );
        
      5. 続いて以下のコマンドを実行して、新しく作成したテーブルにデータを追加します。

         USE sampledb; INSERT INTO customer VALUES (1,'Testers Inc.','2020-04-01','Testers are who we hire to test our software','active'), (2,'Deployers CO','2019-06-01','Deployers co. deploy our software','active'), (3,'DJ John Doe','2019-12-01','John provides the music for our annual holiday party.',"active"), (4,'Doe Hypermarket','2019-06-05','Doe is where we purchase all food supply.',"active");
        

        MySQL Workbench のスクリーン・キャプチャー

ステップ 2. マイクロサービス・ベースのアプリケーションをデプロイし、アプリケーションにデータベースを統合する

  1. getCustomer サービスを作成します。

    注: MYSQL_USER 変数と MYSQL_PASSWORD 変数の値は、前のステップで MySQL サービスを作成した後に返された値によって決定されます。

     oc new-app https://github.com/IBM/mysql-openshift --context-dir=src/getCustomer --name getcustomer -e MYSQL_HOST=mysql -e MYSQL_DATABASE=sampledb -e MYSQL_USER=<YOUR_USERNAME> -e MYSQL_PASSWORD=<YOUR_PASSWORD>
    
  2. getCustomer サービスを公開します。

     oc expose service getcustomer --insecure-skip-tls-verify=false
    
  3. getCustomerList サービスを作成します。

    注: MYSQL_USER 変数と MYSQL_PASSWORD 変数の値は、前のステップで MySQL サービスを作成した後に返された値によって決定されます。

     oc new-app https://github.com/IBM/mysql-openshift --context-dir=src/getCustomerList --name getcustomerlist -e MYSQL_HOST=mysql -e MYSQL_DATABASE=sampledb -e MYSQL_USER=<YOUR_USERNAME> -e MYSQL_PASSWORD=<YOUR_PASSWORD>
    
  4. getCustomerList サービスを公開します。

     oc expose service getcustomerlist --insecure-skip-tls-verify=false
    
  5. 両方のサービスのルートを取得します。

     oc get routes
    

    サービスのルートを取得する操作を示す画面のスクリーン・キャプチャー

  6. customerui サービスを作成します。

    このステップで、Docker Hub からコンテナー・イメージをプルします。これによって、OpenShift のアプリケーション・ビルド機能の多用途性を示してあります。

    注: REACT_APP_CUSTOMER_LIST_URI 変数と REACT_APP_CUSTOMER_URI 変数の値は、前のステップで返された値によって決定されます。

     oc new-app --name customerui --docker-image=docker.io/mohamed7sherif/mysql-react:latest -e REACT_APP_CUSTOMER_LIST_URI="http://<getcustomerlist_SERVICE_URI>/customers" -e REACT_APP_CUSTOMER_URI="http://<getcustomer_SERVICE_URI>/customer/"
    
  7. customerui Web サイトを公開します。

     oc expose service customerui --insecure-skip-tls-verify=false
    
  8. テストします。

    すべてのポッドが作動可能な状態であることを確認します。

     oc get pods
    

    ルートを取得し、ブラウザー内で開きます。

     oc get routes
    

    customerui という名前のルートをコピーしてブラウザー内に貼り付け、アプリケーションが実行中であることを確認します。

まとめ

このチュートリアル全体をとおして確認できたように、OpenShift を利用すると、多くのステップと構成を行う代わりに数回のクリック操作で完了でき、デプロイ・プロセスが単純化されます。

Hat OpenShift on IBM Cloud 上で MySQL データベース・インスタンスをプロビジョニングするのがいかに簡単なのかは、このチュートリアルで実際に体験したとおりです。しかも、デプロイしたデータベースには、このチュートリアルで説明した方法のいずれかを使用して安全にデータを取り込むことができます。このチュートリアルではさらに、マイクロサービスを OpenShift にデプロイして、データベースなどのさまざまなサービスを統合する方法も説明しました。

引き続き OpenShift の操作方法を学ぶために、他の OpenShift チュートリアルにも取り組んでください。