OpenShiftによるJava EEアプリケーションのモダナイゼーションをやってみた(3)

# はじめに
架空の医療会社のExample HealthのOpenShiftによるJava EEアプリケーションのモダナイゼーションの３回目の投稿です。

これまでの２回の投稿で私たちはExample HealthのOpenShiftによるJava EEアプリケーションのモダナイゼーションに成功しました。

- [OpenShiftによるJava EEアプリケーションのモダナイゼーションをやってみた。](https://qiita.com/daihiraoka/items/23cfaed7662d36ccc7ab)
ビジネスロジック用のOpen Libertyで実行されているJava EEアプリケーションをMiniShiftに移行   

- [OpenShiftによるJava EEアプリケーションのモダナイゼーションをやってみた(2)](https://qiita.com/daihiraoka/items/d27cf3b3281ddc5ce8f1)
  患者用UI（ユーザーインターフェイス）のモダナイゼーション

これからは、その後の話になります。OpenShiftに移行した結果、Example Healthは容易に機能拡張できるようになりました。 その後、Example Healthはシステムを拡大して新しいサービスを追加していきます。その1つが健康記録管理者用のPHPアプリケーションのCode Patternsです。

「[ PHP、Source-to-Image ツールキット、OpenShift によるアプリケーションのモダナイズ  - Kubernetes ベースのマイクロサービスで健康記録管理者用アプリを変換する]
(https://developer.ibm.com/jp/patterns/app-modernization-php-s2i-openshift/)」

# 健康記録管理者用のPHPアプリケーションの作成

早速、健康記録管理者用アプリケーションを作り始めましょう。コードパターンの手順はGUI操作ですが、CLI操作でGUIと同じ手順を再現してみましょう。

## (前提)ビジネスロジック用のOpen Libertyで実行されているJava EEアプリケーションがMiniShiftで起動していること

## 手順
1.まず、コードパターンのGitHubのリポジトリ「IBM/php-s2i-openshift」で「Fork」ボタンをクリックして自分のGitHubのリポジトリにフォークします。

2.２回目の記事で作成したhealthプロジェクトに移動します。

```console
$ oc project health
```

3.ビジネスロジック用のJava EEアプリケーションを接続するホスト名を取得します。
健康記録管理者用の PHP アプリケーションからAPI接続するのに使用します。

```console
$ oc get route
NAME                 HOST/PORT                                         PATH      SERVICES             PORT       TERMINATION   WILDCARD
example-health-api   example-health-api-health.192.168.42.218.nip.io             example-health-api   http                     None
```

SERVICESがexample-health-api の　HOST/PORTが該当します。
この場合はのHOST/PORTの「example-health-api-health.192.168.42.218.nip.io 」になります。

4.OpenShiftのS2I（Source to Image）を使って健康記録管理者用の PHP アプリケーションをビルド・デプロイします。

```console
$ oc new-app openshift/php:7.1~https://github.com/daihiraoka/php-s2i-openshift.git \
--context-dir="/src" --name="patient-admin" \
-e apiBaseUrl="http://example-health-api-health.192.168.42.218.nip.io"
```

openshift/php:7.1はベースとなるコンテナイメージ、~（チルダ）で挟んで右側が、ソースコードリポジトリ、
--nameは生成するアプリケーションの名前、--context-dirはソースコードリポジトリのサブディレクトリを指定しています。
-e は 環境変数を定義します。ここではビジネスロジック用のJava EEアプリケーションにAPI接続するための変数apiBaseUrlに、前の手順で取得したJava EEアプリケーションのホスト名を設定します。

実行結果は以下のように出力されます。

```
--> Found image 5ce27de (5 weeks old) in image stream "openshift/php" under tag "7.1" for "openshift/php:7.1"

    Apache 2.4 with PHP 7.1 
    ----------------------- 
    PHP 7.1 available as container is a base platform for building and running various PHP 7.1 applications and frameworks. PHP is an HTML-embedded scripting language. PHP attempts to make it easy for developers to write dynamically generated web pages. PHP also offers built-in database integration for several commercial and non-commercial database management systems, so writing a database-enabled webpage with PHP is fairly simple. The most common use of PHP coding is probably as a replacement for CGI scripts.

    Tags: builder, php, php71, rh-php71

    * A source build using source code from https://github.com/daihiraoka/php-s2i-openshift.git will be created
      * The resulting image will be pushed to image stream tag "patient-admin:latest"
      * Use 'start-build' to trigger a new build
    * This image will be deployed in deployment config "patient-admin"
    * Ports 8080/tcp, 8443/tcp will be load balanced by service "patient-admin"
      * Other containers can access this service through the hostname "patient-admin"

--> Creating resources ...
    imagestream.image.openshift.io "patient-admin" created
    buildconfig.build.openshift.io "patient-admin" created
    deploymentconfig.apps.openshift.io "patient-admin" created
    service "patient-admin" created
--> Success
    Build scheduled, use 'oc logs -f bc/patient-admin' to track its progress.
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose svc/patient-admin' 
    Run 'oc status' to view your app.
```

4.しばらくするとpatient-admin-1-<英数字>のSTATUSがRunningに変わります。

```
$ oc get pod
NAME                                  READY     STATUS      RESTARTS   AGE
example-health-api-7fcb786fb6-gnlff   1/1       Running     0          2d
patient-admin-1-build                 0/1       Completed   0          1m
patient-admin-1-ddjft                 1/1       Running     0          41s
```

5.健康記録管理者用アプリケーションをインターネットに公開するためのRouteを作成します。

```
$ oc expose svc/patient-admin
route.route.openshift.io/patient-admin exposed

$ oc get route
NAME                 HOST/PORT                                         PATH      SERVICES             PORT       TERMINATION   WILDCARD
example-health-api   example-health-api-health.192.168.42.218.nip.io             example-health-api   http                     None
patient-admin        patient-admin-health.192.168.42.218.nip.io                  patient-admin        8080-tcp                 None
```

6.ブラウザーで健康記録管理者用アプリケーションに接続すると以下のようなページが表示されます。

<img width="841" alt="04-ui-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/80e0bec3-c9cd-4ccc-3ee0-1c41b02f8cc6.png">

この管理画面では、Example Health のすべての患者のリストを表示して、以下の患者データの統計内訳を確認できます。

- 年齢
- 性別
- 使用された上位3つの薬
- 糖尿病の有病率
- 喘息の有病率

これで健康記録管理者用アプリケーションとビジネスロジック用のJava EEアプリケーションの結合ができました。

# 今後の展開
この後も、Example Healthはシステムを拡大して新しいサービスを追加していきます。
順風満帆なExample Healthですが、その後の話は、次の投稿「[OpenShiftによるJava EEアプリケーションのモダナイゼーションをやってみた(4)](https://qiita.com/daihiraoka/items/9ee24492737fb769abef)」に続きます。


# この投稿を書いたきっかけ 
IBM CloudのOpenShiftのマネージドサービスである「 Red Hat OpenShift on IBM Cloud 」を使った「OpenShiftによるJava EEアプリケーションのモダナイゼーション」の記事がベースになってます。
https://www.atmarkit.co.jp/ait/articles/1911/15/news002.html

その記事で使用している「 Red Hat OpenShift on IBM Cloud 」は有料サービスのため、たくさんの人に記事の手順を試してもらうのは難しいと思います。　そこで、**無料で利用できるMiniShiftを使って、気軽にOpenShiftでJava EEアプリケーションのモダナイゼーションを体感してもらえるように、リライトしました。**　

今回の投稿は、３回目で、記事にはない、その後の展開の1つのお話になります。