既存のJava EE アプリケーションを JBoss EAP + OpenShift でコンテナ化 -Source to Image編-

Red Hat で Java 関連を担当している伊藤ちひろです。

前回は、既存のJakarta EEアプリケーションをコンテナ化する方法を紹介しました。既存のJakarta EE アプリケーション(WAR)を JBoss EAP でコンテナ化 - 赤帽エンジニアブログ

また、Helm を使って OpenShift 上にコンテナ化する方法も紹介しました。 既存のJakarta EE アプリケーション(WAR)を JBoss EAP + OpenShift でコンテナ化 -Helm編- - 赤帽エンジニアブログ

今回も昔から運用されている Servlet/JSP で動作する Java EE アプリケーションをコンテナ化してOpenShiftへデプロイする方法を紹介します。 今回は、Source to Image を使用します。

必要な作業は以下の4つです。

  • Jakarta EE に対応 (今回は説明を省きます)
  • Mavenの導入
  • Git対応
  • Source to Image

Jakarta EEに対応

アプリケーションを Java EE から Jakarta EE に移行します。 JBoss EAP 8.0 は Jakarta EE 10 に対応しており、Java EE には対応していないためです。 本記事は、この移行が目的ではないため省略します。 この移行を支援するツールとして、Migration Toolkit があります。 Migration Toolkit は Red Hat が提供しているツールです。

Maven の導入

次に、アプリケーションのビルドのため Maven を導入します。 多くのアプリケーションはすでに導入しているでしょう。 しかしながら、一部のアプリケーションは Ant や独自の方法でビルドしているかもしれません。 今回は、最低限必要な Maven の設定を記載しています。 これから Maven を使う場合は、これをベースに依存関係を追加してください。 すでにMavenを使っている場合は、この設定を既存の設定に追加してください。

今回は、 Servlet/JSP を実行可能な、できるだけコンパクトな JBoss EAP をデプロイします。 JBoss EAP はアプリケーションが必要とする機能だけをもつコンパクトな JBoss EAP を作成できます。 この仕組みを Galleon と言います。 Galleon は各機能を Layer として定義しています。 Servlet/JSP を実行できる Layer は web-server です。 Layer は今回使用しているweb-serverのほかにも、ejbjaxrsなどさまざまあります。

他にどのような Layer があるのかは以下に記載されています。

第8章 JBoss EAP for OpenShift の機能のトリム | Red Hat Product Documentation

また、Galleon 自体に興味のある方はこちらをごらん下さい。

Galleon Provisioning Guide

今回使用する pom.xml は以下のとおりです。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>jee-traditional</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>

    <profiles>
        <profile>
            <id>openshift</id>
        </profile>
        <profile>
            <id>develop</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-eap-ee</artifactId>
                <version>8.0.0.GA-redhat-00009</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <pluginRepositories>
        <pluginRepository>
            <id>jboss</id>
            <url>https://maven.repository.redhat.com/ga/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <repositories>
        <repository>
            <id>jboss</id>
            <url>https://maven.repository.redhat.com/ga/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <build>
        <finalName>ROOT.war</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.4.0</version>
            </plugin>
            <plugin>
                <groupId>org.jboss.eap.plugins</groupId>
                <artifactId>eap-maven-plugin</artifactId>
                <version>1.0.0.Final-redhat-00014</version>
                <configuration>
                    <channels>
                        <channel>
                            <manifest>
                                <groupId>org.jboss.eap.channels</groupId>
                                <artifactId>eap-8.0</artifactId>
                            </manifest>
                        </channel>
                    </channels>
                    <feature-packs>
                        <feature-pack>
                            <location>org.jboss.eap:wildfly-ee-galleon-pack</location>
                        </feature-pack>
                        <feature-pack>
                            <location>org.jboss.eap.cloud:eap-cloud-galleon-pack</location>
                        </feature-pack>
                    </feature-packs>
                    <layers>
                        <layer>web-server</layer>
                    </layers>
                    <runtime-name>ROOT.war</runtime-name>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>package</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Git 対応

アプリケーションは Git リポジトリで管理します。 OpenShift は後に指定する Git リポジトリからアプリケーションのソースコードを取得して、ビルドします。 Git リポジトリは OpenShift からアクセスできればどこでも大丈夫です。 今回は、GitHub 上のリポジトリを用います。

github.com

Source to Image (S2I)

最後に、Source to Image (S2I) を使用して アプリケーションを含んだ JBoss EAP を作成します。 S2I は、CLI の oc コマンドを使います。

まずは、アプリケーションのビルドや JBoss EAP の構築に必要なビルダーを取得します。

> oc import-image jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --from=registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest --confirm

次に、アプリケーションをビルドします。 これには時間がかかります。

> oc new-build eap8-openjdk17-builder-openshift-rhel8:latest~https://github.com/chiroito/jee-traditional.git --name=myapp-build-artifacts

最後に、作成されたアプリケーションをデプロイし、外部からアクセスできるようにします。

> oc new-app --name=myapp myapp-build-artifacts
> oc create route edge --service myappv

これで完了です。

OpenShift で確認

アプリケーションが OpenShift にデプロイされたかを確認します。

開発者向けの表示のBuildsをクリックします。 Buildsに my-app-build-artifacts というBuildConfigsができているはずです。 最終実行のステータスCompleteになっていればビルドは成功です。 Runningはまだビルドしています。

他のステータスになったら、実行を確認しましょう。 最終実行のカラムにあるmyapp-build-artifacts-1をクリックします。 ログのタブをクリックするとログが出力されます。 出力されたログから失敗した原因を確認しましょう。

ビルドが成功したら、アプリケーションがデプロイされています。 左側のメニューのトポロジー をクリックします。 ここにmyappというアイコンができているはずです。 これをクリックすると、右側に詳細が表示されます。 その詳細で、青色の丸の中に1 Podと表示されていればアプリケーションが起動しています。 0 Podの場合はアプリケーションの起動がまだ終わっていないか、起動に失敗しています。 青丸の上のリソースタブを開き、Podsのログを表示して、失敗の原因を確認しましょう。

確認の最後として、アプリケーションへアクセスしてみましょう。 下のアイコンをクリックすると、アプリケーションへアクセスできます。

サンプルアプリケーションを使用している場合は、index.jspHello World! が表示されれば成功です。

いかがでしたでしょうか。 今回は、設定をかなり省略しています。 本番ではもう少しちゃんと設定が必要になります。 とはいえ、既存のアプリケーションをOpenShift上にデプロイする流れをイメージできたのではないでしょうか。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。