

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立堆疊和執行應用程式
<a name="create-custom-stack"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

本節說明如何使用 Tomcat 技術指南實作基本堆疊設定，執行名為 SimpleJSP 的簡易 Java 伺服器頁面 (JSP) 應用程式。堆疊包含名為 TomCustom 的 Tomcat 型自訂層和 MySQL 層。SimpleJSP 會部署到 TomCustom，並顯示 MySQL 資料庫中的一些資訊。如果您尚未熟悉如何使用 OpsWorks Stacks 的基本概念，您應該先閱讀 [Chef 11 Linux 堆疊入門](gettingstarted.md)。

## SimpleJSP 應用程式
<a name="create-custom-stack-jsp"></a>

SimpleJSP 應用程式會示範如何設定資料庫連線和從堆疊的 MySQL 資料庫擷取資料的基本操作。

```
<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>
```

SimpleJSP 使用 `DataSource` 物件與 MySQL 資料庫通訊。Tomcat 使用 [Web 應用程式內容組態檔案](create-custom-configure.md#create-custom-configure-context)中的資料建立和初始化 `DataSource` 物件，並將其繫結到邏輯名稱。它接著會使用 Java 命名及目錄界面 (JNDI) 命名服務註冊邏輯名稱。為取得適當 `DataSource` 物件的執行個體，您會建立 `InitialContext` 物件，並將資源的邏輯名稱傳遞給物件的 `lookup` 方法，擷取適當的物件。SimpleJSP 範例的邏輯名稱 (`java:comp/env/jdbc/mydb`) 包含下列元件：
+ 根命名空間 (`java`)，以冒號 (:) 與名稱的剩餘部分分開。
+ 任何額外的命名空間，都會以斜線 (/) 分開。

  Tomcat 會自動將資源新增到 `comp/env` 命名空間。
+ 資源名稱，定義於 web 應用程式內容組態檔案中，並以斜線與命名空間分隔。

  此範例的資源名稱為 `jdbc/mydb`。

為建立資料庫的連線，SimpleJSP 會執行下列作業：

1. 呼叫 `DataSource` 物件的 `getConnection` 方法，傳回 `Connection` 物件。

1. 呼叫 `Connection` 物件的 `createStatement` 方法，建立 `Statement` 物件，您會使用此物件與資料庫通訊。

1. 透過呼叫適當的 `Statement` 方法與資料庫通訊。

   SimpleJSP 會呼叫 `executeQuery` 執行 SHOW DATABASES 查詢，列出伺服器的資料庫。

`executeQuery` 方法會傳回 `ResultSet` 物件，其中包含查詢的結果。SimpleJSP 會從傳回的 `ResultSet` 物件取得資料庫名稱，然後串連它們以建立輸出字串。最後，範例會關閉 `ResultSet`、`Statement` 和 `Connection` 物件。如需 JSP 和 JDBC 的詳細資訊，請分別參考 [JavaServer Pages Technology](http://docs.oracle.com/javaee/5/tutorial/doc/bnagx.html) 和 [JDBC Basics](http://docs.oracle.com/javase/tutorial/jdbc/basics/)。

若要搭配堆疊使用 SimpleJSP，您必須將其置放在儲存庫中。您可以使用任何支援的儲存庫，但若要搭配下列章節中討論的範例堆疊使用 SimpleJSP，您必須將其置放在公有 S3 封存中。如需如何使用其他標準儲存庫的資訊，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)。

**將 SimpleJSP 置放在 S3 封存儲存庫中**

1. 將範例程式碼複製到名為 `simplejsp.jsp` 的檔案，然後將檔案置放在名為 `simplejsp` 的目錄中。

1. 建立 `simplejsp` 目錄的 `.zip` 存檔。

1. 建立公有 Amazon S3 儲存貯體、上傳至`simplejsp.zip`儲存貯體，並將檔案設為公有。

   如需如何執行此任務的說明，請參閱 [Amazon Simple Storage Service 入門](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html)。

## 建立堆疊
<a name="create-custom-stack-stack"></a>

若要執行 SimpleJSP，您需要具有下列 layer 的堆疊。
+ 支援後端 MySQL 資料庫的 MySQL layer。
+ 使用 Tomcat 技術指南支援 Tomcat 伺服器執行個體的自訂 layer。

**建立堆疊**

1. 在 OpsWorks Stacks 儀表板上，按一下**新增堆疊**以建立新的堆疊，然後按一下**進階 >>** 以顯示所有選項。設定堆疊如下。
   + **名稱** – 使用者定義的堆疊名稱；此範例使用 TomStack。
   + **使用自訂 Chef 技術指南** – 將切換設定為**是**，這會顯示一些額外的選項。
   + **儲存庫類型** – Git。
   + **儲存庫 URL**–`git://github.com/amazonwebservices/opsworks-example-cookbooks.git`。
   + **自訂 Chef JSON** – 新增下列 JSON：

     ```
     {
       "tomcat": {
         "base_version": 7,
         "java_opts": "-Djava.awt.headless=true -Xmx256m"
       },
       "datasources": {
         "ROOT": "jdbc/mydb"
       }
     }
     ```

   對於剩餘的選項，您可以接受預設值。

   自訂 JSON 會執行下列操作：
   + 覆寫 Tomcat 技術指南的 `['base_version']` 屬性，將 Tomcat 的版本設為 7。預設值為 6。
   + 覆寫 Tomcat 技術指南的 `['java_opts']` 屬性，指定執行個體沒有標題，並將 JVM 最大堆積大小設為 256MB。預設值不會為執行 Amazon Linux 的執行個體設定任何選項。
   + 指定 `['datasources]` 屬性值，指派 JDBC 資源名稱 (jdbc/mydb) 給 web 應用程式內容名稱 (ROOT)，如 [tomcat::context](create-custom-configure.md#create-custom-configure-context) 中所討論。

     這個最後一個屬性沒有任何預設值。您必須使用自訂 JSON 設定它。  
![\[Configuration Management interface showing Chef version options and custom JSON input field.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/tom_add_stack.png)

1. 按一下 **Add a layer (新增 layer)**。針對 **Layer type (Layer 類型)**，選取 **MySQL**。然後按一下 **Add Layer (新增 Layer)**。

1. 按一下導覽窗格中的 **Instances (執行個體)**，然後按一下 **Add an instance (新增執行個體)**。按一下 **Add Instance (新增執行個體)** 接受預設值。在執行個體的列上，按一下 **start (啟動)**。

1. 返回 **Layers (Layer)** 頁面然後按一下 **\$1 Layer (\$1Layer)** 以新增 layer。針對 **Layer type (Layer 類型)**，按一下 **Custom (自訂)**。範例使用 **TomCustom** 和 **tomcustom** 分別做為 layer 的名稱和短名。  
![\[Add Layer form with Custom layer type, Name, and Short name fields for creating a customized layer.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/tom_add_custom_layer.png)

1. 在 **Layers (Layer)** 頁面上，針對自訂 layer，按一下 **Recipes (配方)** 然後按一下 **Edit (編輯)**。在 **Custom Chef Recipes (自訂 Chef 配方)** 下，將 Tomcat 技術指南配方指派給 layer 的生命週期事件，如下所示：
   + 針對 **Setup (安裝)**，輸入 **tomcat::setup** 然後按一下 **\$1**。
   + 針對 **Configure (設定)**，輸入 **tomcat::configure** 然後按一下 **\$1**。
   + 針對 **Deploy (部署)**，輸入 **tomcat::deploy** 然後按一下 **\$1**。然後按一下 **Save (儲存)**。

     .  
![\[Custom Chef Recipes interface showing setup, configure, and deploy steps with options.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/tom_events.png)

1. 按一下導覽窗格中的 **Apps (應用程式)**，然後按一下 **Add an app (新增應用程式)**。指定下列選項，然後按一下 **Add App (新增應用程式)**：
   + **名稱** – 應用程式的名稱；範例使用 SimpleJSP，而 Stacks OpsWorks 產生的簡短名稱將是 simplejsp。
   + **應用程式類型** – 將此選項設定為**其他**。

     OpsWorks Stacks 會自動將標準應用程式類型部署至相關聯的伺服器執行個體。若您將 **App type (應用程式類型)** 設為「其他」， OpsWorks Stacks 便只會執行部署配方，並讓它們處理部署。
   + **文件根** – 將此選項設定為 **ROOT**。

     **Document root (文件根)** 的值指定內容名稱。
   + **儲存庫類型** – 將此選項設定為 **S3 Archive**。
   + **儲存庫 URL** – 將此設定為您先前建立的應用程式 Amazon S3 URL。

   其他選項請使用預設設定。  
![\[Application settings form with fields for name, app type, document root, and source details.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/tom_app.png)

1. 使用**執行個體**頁面將執行個體新增至 TomCustom 層並啟動。安裝配方完成後， OpsWorks Stacks 會自動在新執行個體上執行部署配方，因此啟動執行個體也會部署 SimpleJSP。

1. 當 TomCustom 執行個體上線時，在 **Instances (執行個體)** 頁面上按一下執行個體名稱以查看詳細資訊。複製公有 IP 地址。然後建構 URL 如下：http://*publicIP*/tc/*appname.jsp*。例如，此 URL 看起來會像這樣：**http://50.218.191.172/tc/simplejsp.jsp**。
**注意**  
轉遞請求至 Tomcat 的 Apache URL 已設為預設 `['tomcat']['apache_tomcat_bind_path']` 屬性，`/tc/`。SimpleJSP 文件根已設為 `ROOT`，為解析至 `/` 的特殊值。URL 因此為 ".../tc/simplejsp.jsp"。

1. 將先前步驟中的 URL 於您的瀏覽器內貼上。請查看下列事項：

   ```
   Databases found:
   information_schema
   simplejsp
   test
   ```
**注意**  
如果您的堆疊有 MySQL 執行個體， OpsWorks Stacks 會自動為每個應用程式建立資料庫，以應用程式的簡短名稱命名。