

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Java アプリケーションのデプロイ
<a name="layers-java-deploy"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

以下のトピックでは、Java アプリケーションサーバーレイヤーのインスタンスにアプリケーションをデプロイする方法について説明します。例は JSP アプリケーション用ですが、他の種類の Java アプリケーションのインストールにもほぼ同じ手順を使用できます。

サポートされている任意のリポジトリから JSP ページをデプロイできます。WAR ファイルをデプロイする場合、 OpsWorks スタックは Amazon S3 または HTTP アーカイブからデプロイされた WAR ファイルを自動的に抽出しますが、Git または Subversion リポジトリからは抽出しないことに注意してください。WAR ファイルのために Git または Subversion を使用する場合は、次のいずれかの操作を行います。
+ 抽出されたアーカイブをリポジトリに保存します。
+ 次の例で示すように、WAR ファイルをリポジトリに保存し、Chef デプロイメントフックを使用してアーカイブを抽出します。

Chef デプロイメントフックを使用すると、4 つのデプロイメントステージのうちの任意のステージのインスタンスでユーザー提供の Ruby アプリケーションを実行できます。アプリケーション名によってステージが決まります。次の例では、Ruby アプリケーションの名前が `before_migrate.rb` です。このアプリケーションは、デプロイされた WAR ファイルを Git または Subversion リポジトリから抽出します。アプリケーションは、名前によって Checkout デプロイメントフックに関連付けられているので、デプロイメント操作の開始時に、コードのチェック後、移行の前に実行されます。この例を使用する方法の詳細については、「[Chef デプロイフックの使用](workingcookbook-extend-hooks.md)」を参照してください。

```
::Dir.glob(::File.join(release_path, '*.war')) do |archive_file|
  execute "unzip_#{archive_file}" do
    command "unzip #{archive_file}"
    cwd release_path
  end
end
```

**注記**  
JPS アプリケーションの更新プログラムをデプロイする際に、Tomcat は更新プログラムを認識せず、アプリケーションの既存のバージョンを継続して実行する可能性があります。これが発生するのは、JSP ページのみが含まれている .zip ファイルとしてアプリケーションをデプロイする場合などです。Tomcat が、デプロイされた最新バージョンを確実に実行するようにするには、プロジェクトのルートディレクトリに、`web.xml` ファイルを含む WEB-INF ディレクトリを含める必要があります。`web.xml` ファイルはさまざまなコンテンツを含むことができますが、Tomcat が確実に更新プログラムを認識し、現在デプロイされているアプリケーションのバージョンを実行するようにするには、次のコンテンツで十分です。各更新プログラムのバージョンを変更する必要はありません。Tomcat は、バージョンが変更されていない場合でも更新プログラムを認識します。  

```
<context-param>
  <param-name>appVersion</param-name>
  <param-value>0.1</param-value>
</context-param>
```

**Topics**
+ [JSP アプリケーションのデプロイ](#layers-java-deploy-jsp)
+ [バックエンドデータベースでの JSP アプリケーションのデプロイ](#layers-java-deploy-jsp-db)

## JSP アプリケーションのデプロイ
<a name="layers-java-deploy-jsp"></a>

JSP アプリケーションをデプロイするには、名前とリポジトリ情報を指定します。また、オプションでドメインおよび SSL 設定を指定できます。アプリケーションの作成方法の詳細については、「[アプリケーションの追加](workingapps-creating.md)」を参照してください。次の手順は、公開の Amazon S3 アーカイブから、シンプルな JSP ページを作成およびデプロイする方法を示しています。プライベートの Amazon S3 アーカイブなど、他のリポジトリの種類の使用方法の詳細については、「[Application Source](workingapps-creating.md#workingapps-creating-source)」を参照してください。

次の例は、単にいくつかのシステム情報を表示する JSP ページを示しています。

```
<%@ page import="java.net.InetAddress" %>
<html>
<body>
<%
    java.util.Date date = new java.util.Date();
    InetAddress inetAddress = InetAddress.getLocalHost();
%>
The time is 
<%
    out.println( date );
    out.println("<br>Your server's hostname is "+inetAddress.getHostName());
%>
<br>
</body>
</html>
```

**注記**  
次の手順では、スタックの作成、レイヤーへのインスタンスの追加などの基本操作にすでに慣れていることを前提としています。 OpsWorks スタックを初めて使用する場合は、まず「」を参照してください[Chef 11 Linux スタックの使用開始](gettingstarted.md)。

**Amazon S3 アーカイブから JSP ページをデプロイするには**

1. Java アプリケーションサーバーのレイヤーを持つ[スタックを作成](workingstacks-creating.md) し、レイヤーに [24/7 のインスタンスを追加](workinginstances-add.md)して[起動します](workinginstances-starting.md)。

1. コードを `simplejsp.jsp` という名前のファイルにコピーし、ファイルを `simplejsp` という名前のフォルダに保存して、そのフォルダの `.zip` アーカイブを作成します。名前は任意です。ファイル名とフォルダ名を自由に指定できます。gzip、bzip2、tarball、Java WAR ファイルなど、他の種類のアーカイブも使用できます。 OpsWorks スタックは非圧縮 tarball をサポートしていないことに注意してください。複数の JSP ページをデプロイするには、それらを同じアーカイブに含めます。

1. Amazon S3 バケットにアーカイブをアップロードし、ファイルを公開します。後で使用できるように、ファイルの URL をコピーします。バケットの作成方法とファイルのアップロード方法の詳細については、「[Amazon Simple Storage Service の使用開始](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)」を参照してください。

1. スタックに[アプリケーションを追加](workingapps-creating.md#workingapps-creating-general)し、次の設定を指定します。
   + **名前** – `SimpleJSP`
   + **App type** (アプリケーションタイプ) - `Java` 
   + **Repository type** (リポジトリタイプ) – `Http Archive` 
   + **Repository URL** (リポジトリのURL) – アーカイブファイルのAmazon S3 の URL。

   残りの設定にはデフォルト値を使用し、[**Add App**] をクリックしてアプリケーションを作成します。

1. Java アプリケーションサーバーインスタンスに[アプリケーションをデプロイ](workingapps-deploying.md)します。

これで、アプリケーションの URL に移動し、アプリケーションを表示できます。ドメインを指定しなかった場合は、インスタンスのパブリック IP アドレスまたはパブリック DNS 名を使用して、URL を作成できます。インスタンスのパブリック IP アドレスまたはパブリック DNS 名を取得するには、 OpsWorks スタックコンソールに移動し、**インスタンスページでインスタンス**名をクリックして詳細ページを開きます。

URL の残りは、アプリケーションの短縮名によって異なります。短縮名は、アプリケーションの作成時に指定したアプリケーション名から OpsWorks スタックが生成する小文字の名前です。たとえば、SimpleJSP の短縮名は simplejsp です。アプリケーションの短縮名は、詳細ページで取得できます。
+ 短縮名が `root` である場合は、`http://public_DNS/appname.jsp` または `http://public_IP/appname.jsp` を使用できます。
+ それ以外の場合は、`http://public_DNS/app_shortname/appname.jsp` または `http://public_IP/app_shortname/appname.jsp` を使用できます。

アプリケーションのドメインを指定した場合、URL は `http://domain/appname.jsp` です。

たとえば、URL は `http://192.0.2.0/simplejsp/simplejsp.jsp` のようになります。

同じインスタンスに複数のアプリケーションをデプロイする場合は、短縮名として `root` を使用しないでください。使用すると URL の競合が発生し、アプリケーションが正しく動作しない場合があります。その代わりに、各アプリケーションに異なるドメイン名を割り当てます。

## バックエンドデータベースでの JSP アプリケーションのデプロイ
<a name="layers-java-deploy-jsp-db"></a>

JSP ページは、JDBC `DataSource` オブジェクトを使用して、バックエンドデータベースに接続できます。このようなアプリケーションを作成およびデプロイするには、前のセクションの手順を使用しますが、接続をセットアップするステップが 1 つ追加されます。

次の JSP ページは、`DataSource` オブジェクトに接続する方法を示しています。

```
<html>
  <head>
    <title>DB Access</title>
  </head>
  <body>
    <%@ page language="java" import="java.sql.*,javax.naming.*,javax.sql.*" %>
    <%
      StringBuffer output = new StringBuffer();
      DataSource ds = null;
      Connection con = null;
      Statement stmt = null;
      ResultSet rs = null;
      try {
        Context initCtx = new InitialContext();
        ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/mydb");
        con = ds.getConnection();
        output.append("Databases found:<br>");
        stmt = con.createStatement();
        rs = stmt.executeQuery("show databases");
        while (rs.next()) {
          output.append(rs.getString(1));
          output.append("<br>");
        }
      }
      catch (Exception e) {
        output.append("Exception: ");
        output.append(e.getMessage());
        output.append("<br>");
      }
      finally {
        try {
          if (rs != null) {
            rs.close();
          }
          if (stmt != null) {
            stmt.close();
          }
          if (con != null) {
            con.close();
          }
        }
        catch (Exception e) {
          output.append("Exception (during close of connection): ");
          output.append(e.getMessage());
          output.append("<br>");
        }
      }
    %>
    <%= output.toString() %>
  </body>
</html>
```

OpsWorks スタックは`DataSource`オブジェクトを作成および初期化し、論理名にバインドして、Java 命名およびディレクトリインターフェイス (JNDI) 命名サービスに名前を登録します。完全な論理名は、`java:comp/env/user-assigned-name` です。以下で説明するように、`['opsworks_java']['datasources']` 属性を定義するために、スタック設定およびデプロイ属性にカスタム JSON 属性を追加して、名前のユーザー割り当て部分を指定する必要があります。

**MySQL データベースに接続する JSP ページをデプロイするには**

1. Java アプリケーションサーバーのレイヤーを持つ [スタックを作成](workingstacks-creating.md)し、各レイヤーに [24/7 インスタンスを追加](workinginstances-add.md)して[開始します](workinginstances-starting.md)。

1. スタックにデータベースレイヤーを追加します。詳細は、使用しているデータベースによって異なります。

   この例で MySQL インスタンスを使用するには、スタックに[MySQL レイヤーを追加](workinglayers-db-mysql.md)し、レイヤーに [24/7 インスタンスを追加](workinginstances-add.md)して[開始します](workinginstances-starting.md#workinginstances-starting-start)。

   この例で Amazon RDS (MySQL) インスタンスを使用するには:
   + インスタンスの MySQL データベースエンジンを指定します。
   + **AWS-OpsWorks-DB-Master-Server (*security\$1group\$1id*)** および **AWS-OpsWorks-Java-App-Server (*security\$1group\$1id*)** セキュリティグループをインスタンスに割り当てます。 OpsWorks スタックは、リージョンで最初のスタックを作成するときに、これらのセキュリティグループを作成します。
   + `simplejspdb` という名前のデータベースを作成します。
   + マスターユーザー名とパスワードに `&` または Tomcat エラーの原因になる他の文字が含まれていないことを確認します。

     特に、起動中に Tomcat はウェブアプリケーションのコンテキストファイルを解析する必要があります。このファイルは、マスターパスワードとユーザー名を含む XML ファイルです。いずれかの文字列に `&` 記号が含まれる場合、XML パーサーはそれを不正な形式の XML エンティティとして扱い、解析の例外をスローします。その結果、Tomcat は起動できません。ウェブアプリケーションのコンテキストファイルの詳細については、「[tomcat::context](create-custom-configure.md#create-custom-configure-context)」を参照してください。
   + Java アプリケーションサーバーレイヤーに[MySQL ドライバを追加](workingapps-connectdb.md)します。
   + [RDS インスタンスをスタックに登録](workinglayers-db-rds.md#workinglayers-db-rds-register)します。

   スタックで Amazon RDS OpsWorks インスタンスを使用する方法の詳細については、「」を参照してください[Amazon RDS サービスレイヤー](workinglayers-db-rds.md)。

1. サンプルコードを `simplejspdb.jsp` という名前のファイルにコピーし、ファイルを `simplejspdb` という名前のフォルダに保存して、そのフォルダの `.zip` アーカイブを作成します。名前は任意です。ファイル名とフォルダ名を自由に指定できます。gzip、bzip2、tarball など、他の種類のアーカイブも使用できます。複数の JSP ページをデプロイするには、それらを同じアーカイブに含めます。他のリポジトリタイプのアプリケーションをデプロイする方法の詳細については、「[Application Source](workingapps-creating.md#workingapps-creating-source)」を参照してください。

1. Amazon S3 バケットにアーカイブをアップロードし、ファイルを公開します。後で使用できるように、ファイルの URL をコピーします。バケットの作成方法とファイルのアップロード方法の詳細については、「[Amazon Simple Storage Service の使用開始](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)」を参照してください。

1. スタックに[アプリケーションを追加](workingapps-creating.md#workingapps-creating-general)し、次の設定を指定します。
   + **名前** – `SimpleJSPDB`
   + **App type** (アプリケーションタイプ) – `Java`
   + **Data source type** (データソースタイプ) - **OpsWorks** (MySQL インスタンスの場合) または **RDS** (Amazon RDS インスタンスの場合)。
   + **データベースインスタンス** - 前に作成した MySQL インスタンスで、通常は **db-master1(mysql)** という名前ですが、Amazon RDS インスタンスでは ***DB\$1instance\$1name* (mysql)** という名前になります。
   + **Database name** (データベース名) – `simplejspdb` 
   + **Repository type** (リポジトリタイプ) – `Http Archive` 
   + **Repository URL** (リポジトリのURL) – アーカイブファイルのAmazon S3 の URL。

   残りの設定にはデフォルト値を使用し、[**Add App**] をクリックしてアプリケーションを作成します。

1. 次のカスタム JSON 属性をスタック設定属性に追加します。ここで、simplejspdb はアプリケーションの短縮名です。

   ```
   {
     "opsworks_java": {
       "datasources": {
         "simplejspdb": "jdbc/mydb" 
       }
     }
   }
   ```

   OpsWorks スタックはこのマッピングを使用して、必要なデータベース情報を含むコンテキストファイルを生成します。

   カスタム JSON 属性をスタック設定属性に追加する方法の詳細については、「[カスタム JSON の使用](workingstacks-json.md)」を参照してください。

1. Java アプリケーションサーバーインスタンスに[アプリケーションをデプロイ)](workingapps-deploying.md)します。

これで、アプリケーションの URL を使用してアプリケーションを表示できるようになりました。URL を作成する方法については、「[JSP アプリケーションのデプロイ](#layers-java-deploy-jsp)」を参照してください。

たとえば、URL は `http://192.0.2.0/simplejspdb/simplejspdb.jsp` のようになります。

**注記**  
`datasources` 属性には、複数の属性を含めることができます。各属性はアプリケーションの短縮名によって名付けられ、論理名の適切なユーザー割り当て部分に設定されます。複数のアプリケーションがある場合は、個別の論理名を使用できます。そのためには、以下のようなカスタム JSON が必要です。  

```
{
  "opsworks_java": {
    "datasources": {
      "myjavaapp": "jdbc/myappdb",
      "simplejsp": "jdbc/myjspdb",
      ...
    }
  }
}
```