

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

# 將 Node.js 應用程式與 DynamoDB 部署到 Elastic Beanstalk
<a name="nodejs-dynamodb-tutorial"></a>

本教學課程及其範例應用程式 [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip) 會逐步引導您部署 Node.js 應用程式，該應用程式使用 Node.js 中適用於 JavaScript 的 AWS SDK 與 Amazon DynamoDB 服務互動。您將建立 DynamoDB 資料表，該資料表位於與 AWS Elastic Beanstalk 環境分離或外部的資料庫中。您也需設定應用程式，以使用分開的資料庫。在生產環境中，最佳做法是使用與 Elastic Beanstalk 環境分開的資料庫，以使其獨立於環境的生命週期。此做法也可讓您執行[藍/綠部署](using-features.CNAMESwap.md)。

範例應用程式可說明下列項目：
+ 儲存使用者提供之文字資料的 DynamoDB 資料表。
+ [組態檔案](ebextensions.md)，可用於建立資料表。
+ Amazon Simple Notification Service 主題。
+  於部署期間使用 [package.json 檔案](nodejs-platform-dependencies.md#nodejs-platform-packagejson)，以安裝套件。

**Topics**
+ [先決條件](#nodejs-dynamodb-tutorial-prereqs)
+ [建立 Elastic Beanstalk 環境](#nodejs-dynamodb-tutorial-launch)
+ [新增您環境執行個體的許可](#nodejs-dynamodb-tutorial-role)
+ [部署範例應用程式](#nodejs-dynamodb-tutorial-deploy)
+ [建立 DynamoDB 資料表](#nodejs-dynamodb-tutorial-database)
+ [更新應用程式的組態檔案](#nodejs-dynamodb-tutorial-update)
+ [將您的環境設定為高可用性](#nodejs-dynamodb-tutorial-configure)
+ [清除](#nodejs-dynamodb-tutorial-cleanup)
+ [後續步驟](#nodejs-dynamodb-tutorial-nextsteps)

## 先決條件
<a name="nodejs-dynamodb-tutorial-prereqs"></a>

本教學課程需要下列先決條件：
+ Node.js 執行階段
+ 預設的 Node.js 套件管理工具軟體 npm
+ Express 命令列產生器
+ Elastic Beanstalk 命令列界面 (EB CLI)

有關安裝所列出之前三個元件和設定本機開發環境的詳細資訊，請參閱 [設定 Elastic Beanstalk 的 Node.js 開發環境](nodejs-devenv.md)。在本教學課程中，您不需要安裝適用於 Node.js 的 AWS SDK，這也在參考主題中提及。

有關安裝和設定 EB CLI 的詳細資訊，請參閱 [使用設定指令碼安裝 EB CLI （建議）](eb-cli3.md#eb-cli3-install) 和 [設定 EB CLI](eb-cli3-configuration.md)。

## 建立 Elastic Beanstalk 環境
<a name="nodejs-dynamodb-tutorial-launch"></a>

**應用程式目錄**  
對於應用程式原始碼套件，本教學課程使用的是名為 `nodejs-example-dynamo` 的目錄。為本教學課程建立 `nodejs-example-dynamo` 目錄。

```
~$ mkdir nodejs-example-dynamo
```

**注意**  
本章中的每個教學課程皆會使用其自身的應用程式原始碼套件目錄。目錄名稱與教學課程所使用的範例應用程式名稱相符。

將您目前的工作目錄變更為 `nodejs-example-dynamo`。

```
~$ cd nodejs-example-dynamo
```

現在，來設定執行 Node.js 平台和範例應用程式的 Elastic Beanstalk 環境。我們將會使用 Elastic Beanstalk 命令列介面 (EB CLI)。

**設定應用程式的 EB CLI 儲存庫，並建立執行 Node.js 平台的 Elastic Beanstalk 環境**

1. 使用 **[**eb init**](eb3-init.md)** 命令建立一個儲存庫。

   ```
   ~/nodejs-example-dynamo$ eb init --platform node.js --region <region>
   ```

   此命令會在名為 `.elasticbeanstalk` 的資料夾內建立組態檔案，其中會指定應用程式使用的環境設定，並以目前資料夾為名建立 Elastic Beanstalk 應用程式。

1. 使用 **[**eb create**](eb3-create.md)** 命令建立執行範例應用程式的環境。

   ```
   ~/nodejs-example-dynamo$ eb create --sample nodejs-example-dynamo
   ```

   本命令會使用 Node.js 平台的預設設定和下列資源，建立負載平衡的環境：
   + **EC2 執行個體** ‒ Amazon Elastic Compute Cloud (Amazon EC2) 虛擬機器，已設為在您選擇的平台上執行 Web 應用程式。

     每個平台會執行特定的一套軟體、設定檔和指令碼，來支援特定的語言版本、架構、Web 容器或其組合。大多數的平台使用會 Apache 或 NGINX 做為反向代理，此反向代理會在您 Web 應用程式的前景執行、轉傳遞交給此 Web 應用程式的請求、提供靜態資產，並產生存取和錯誤日誌。
   + **執行個體安全群組** - Amazon EC2 安全群組，已設為允許從連接埠 80 傳入的流量。此資源可讓負載平衡器傳來的 HTTP 傳輸資料，到達執行您 Web 應用程式的 EC2 執行個體。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
   + **負載平衡器** - Elastic Load Balancing 負載平衡器，可設定將請求分配到執行您應用程式的執行個體。負載平衡器也讓您的執行個體不需直接連接到網際網路。
   + **負載平衡器安全群組** - Amazon EC2 安全群組，設為允許從連接埠 80 傳入的流量。此資源可讓來自網際網路的 HTTP 傳輸資料到達負載平衡器。在預設情況下，不允許傳輸資料從其他通訊埠傳送。
   + **Auto Scaling 群組** - Auto Scaling 群組，設為在執行個體終止或無法使用時，取代該執行個體。
   + **Amazon S3 儲存貯體** - 儲存位置，用來儲存當您使用 Elastic Beanstalk 時所建立的原始程式碼、日誌和其他成品。
   + **Amazon CloudWatch 警示** - 兩種 CloudWatch 警示，用來監控您環境中執行個體上的負載，會在負載過高或過低時觸發。當警示觸發時，您的 Auto Scaling 群組會擴展或縮減以進行回應。
   + **CloudFormation 堆疊** – Elastic Beanstalk 使用 CloudFormation 啟動環境中的資源並傳播組態變更。資源定義於範本中，您可在 [CloudFormation 主控台](https://console.aws.amazon.com/cloudformation)中檢視此範本。
   + **網域名稱** – 會路由到您 Web 應用程式的網域名稱，其格式為 **subdomain*.*region*.elasticbeanstalk.com*。
**網域安全**  
為了增強 Elastic Beanstalk 應用程式的安全性，我們會在[公共后缀列表 (PSL)](https://publicsuffix.org/) 中註冊網域 *elasticbeanstalk.com*。  
如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感 Cookie，建議您使用字`__Host-`首為 的 Cookie 以提高安全性。此實務可保護您的網域免於跨網站請求偽造嘗試 (CSRF)。如需更多資訊，請參閱 Mozilla 開發人員網路中的[設定 Cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 頁面。

1. 環境建立完成後，請使用 [**eb open**](eb3-open.md) 命令，在預設瀏覽器中開啟環境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

您現在已使用範例應用程式建立 Node.js Elastic Beanstalk 環境。您可以使用自己的應用程式對其進行更新。接下來，我們會更新範例應用程式，以使用 Express 架構。

## 新增您環境執行個體的許可
<a name="nodejs-dynamodb-tutorial-role"></a>

您的應用程式會執行於負載平衡器後方的一個或多個 EC2 執行個體上，處理來自網際網路的 HTTP 請求。當應用程式收到要求其使用 AWS 服務的請求時，應用程式會使用其執行的執行個體許可來存取這些服務。

本範例應用程式會使用執行個體的許可將資料寫入 DynamoDB 資料表，並透過適用於 Node.js 中 JavaScript 的開發套件，將通知傳送至 Amazon SNS 主題。將下列受管原則新增至預設[執行個體設定檔](concepts-roles-instance.md)，以授予您環境中的 EC2 執行個體存取 DynamoDB 和 Amazon SNS 的許可：
+ **AmazonDynamoDBFullAccess**
+ **AmazonSNSFullAccess**

**若要在預設的執行個體設定檔中新增原則**

1. 在 IAM 主控台中開啟 [Roles (角色) 頁面](https://console.aws.amazon.com/iam/home#roles)。

1. 請選擇 **aws-elasticbeanstalk-ec2-role (aws-elasticbeanstalk-ec2-role)**。

1. 在 **Permissions** (許可) 標籤上，選擇 **Attach policies** (連接政策)。

1. 為您的應用程式使用的其他服務，選取受管原則，對於本教學課程，請選取 `AmazonSNSFullAccess` 和 `AmazonDynamoDBFullAccess`。

1. 選擇**連接政策**。

如需管理執行個體設定檔的詳細資訊，請參閱 [管理 Elastic Beanstalk 執行個體描述檔](iam-instanceprofile.md)。

## 部署範例應用程式
<a name="nodejs-dynamodb-tutorial-deploy"></a>

現在，您的環境已可供部署，並可執行本教學課程的範例應用程式：[nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip)。

**部署和執行教學課程範例應用程式**

1. 將目前的工作目錄變更為應用程式目錄 `nodejs-example-dynamo`。

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. 將範例應用程式原始碼套件 [nodejs-example-dynamo.zip](samples/nodejs-example-dynamo.zip) 的內容下載並解壓縮至應用程式目錄 `nodejs-example-dynamo`。

1. 使用 [**eb deploy**](eb3-deploy.md) 命令將範例應用程式部署至您的 Elastic Beanstalk 環境。

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```
**注意**  
根據預設， `eb deploy`命令會建立專案資料夾的 ZIP 檔案。您亦可設定 EB CLI 從建置程序部署組建成品，而非建立您專案資料夾的 ZIP 檔案。如需詳細資訊，請參閱[部署成品而非專案資料夾](eb-cli3-configuration.md#eb-cli3-artifact)。

1. 環境建立完成後，請使用 [**eb open**](eb3-open.md) 命令，在預設瀏覽器中開啟環境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

本站點會收集使用者聯絡資訊，並使用 DynamoDB 資料表來存放資料。欲新增項目，選擇 **Sign up today (立即註冊)**，輸入名稱和電子郵件地址，然後選擇 **Sign Up\$1 (註冊！)**。本 Web 應用程式會將表單內容寫入資料表，並觸發 Amazon SNS 電子郵件通知。

![\[Startup landing page with teaser message and sign-up button for upcoming product launch.\]](http://docs.aws.amazon.com/zh_tw/elasticbeanstalk/latest/dg/images/nodejs-dynamodb-tutorial-app.png)


現在，Amazon SNS 主題會透過通知用的預留位置電子郵件進行設定。您很快就會更新此組態，但您可同時在 AWS 管理主控台內驗證 DynamoDB 資料表和 Amazon SNS 主題。

**欲檢視資料表**

1. 在 DynamoDB 主控台中開啟[資料表頁面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 尋找應用程式建立的資料表。名稱開頭為 **awseb**，而且其中包含 **StartupSignupsTable**。

1. 選取資料表，選擇 **Items (項目)**，然後選擇 **Start search (開始搜尋)** 以檢視資料表的所有項目。

於註冊網站提交的每個電子郵件地址，在資料表內均有一個項目。本應用程式除了寫入資料表，亦會傳送訊息至具有兩個訂閱的 Amazon SNS 主題，一個用於向您發送電子郵件通知，另一個則用於 Amazon Simple Queue Service 佇列，工作者應用程式可自其中讀取以處理請求並傳送電子郵件至感興趣的客戶。

**欲檢視主題**

1. 在 Amazon SNS 主控台中開啟[主題頁面](https://console.aws.amazon.com/sns/v2/home?#/topics)。

1. 尋找應用程式建立的主題。名稱開頭為 **awseb**，而且其中包含 **NewSignupTopic**。

1. 選擇主題以檢視其訂閱。

應用程式 (`[app.js](https://github.com/awslabs/eb-node-express-sample/blob/master/app.js)`) 會定義兩個路由。根路徑 (`/`) 會回傳轉譯自嵌入式 JavaScript (EJS) 範本的網頁及一份表單，使用者須填寫表單以註冊他們的名稱和電子郵件地址。提交表單會將內含表單資料的 POST 請求傳送至 `/signup` 路由，該路由會寫入 DynamoDB 資料表，並發佈訊息至 Amazon SNS 主題以通知擁有者註冊事宜。

本範例應用程式內含[組態檔案](ebextensions.md)，其可建立 DynamoDB 資料表、Amazon SNS 主題和應用程式所使用的 Amazon SQS 佇列。這可讓您建立新的環境並立即測試功能，但缺點是將 DynamoDB 資料表與環境綁定。以生產環境而言，您應於環境外建立 DynamoDB 資料表，以避免您終止環境或更新其組態時遺失該資料表。

## 建立 DynamoDB 資料表
<a name="nodejs-dynamodb-tutorial-database"></a>

欲搭配於 Elastic Beanstalk 執行的應用程式使用外部 DynamoDB 資料表，請先於 DynamoDB 建立資料表。當您在 Elastic Beanstalk 外建立資瞭表時，它完全獨立於 Elastic Beanstalk 和您的 Elastic Beanstalk 環境，並且不會被 Elastic Beanstalk 終止。

透過下列設定建立資料表：
+ **Table name (資料表名稱)** – **nodejs-tutorial** 
+ **主索引鍵** – **email**
+ 主索引鍵類型 – **String (字串)**

**建立 DynamoDB 資料表**

1. 在 DynamoDB 管理主控台中開啟[資料表頁面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 選擇 **Create Table** (建立資料表)。

1. 輸入 **Table name (資料表名稱) **和 **Primary key (主索引鍵)**。

1. 選擇主索引鍵類型。

1. 選擇**建立**。

## 更新應用程式的組態檔案
<a name="nodejs-dynamodb-tutorial-update"></a>

更新應用程式原始碼內的[組態檔案](ebextensions.md)以使用 **nodejs-tutorial (nodejs-tutorial)** 資料表，無須建立新的資料表。

**更新範例應用程式，以供生產使用**

1. 將目前的工作目錄變更為應用程式目錄 `nodejs-example-dynamo`。

   ```
   ~$ cd nodejs-example-dynamo
   ```

1. 開啟 `.ebextensions/options.config` 並變更下列設定的值：
   + **NewSignupEmail** – 您的電子郵件地址。
   + **STARTUP\$1SIGNUP\$1TABLE** – **nodejs-tutorial**

     
**Example .ebextensions/options.config**  

   ```
   option_settings:
     aws:elasticbeanstalk:customoption:
       NewSignupEmail: you@example.com
     aws:elasticbeanstalk:application:environment:
       THEME: "flatly"
       AWS_REGION: '`{"Ref" : "AWS::Region"}`'
       STARTUP_SIGNUP_TABLE: nodejs-tutorial
       NEW_SIGNUP_TOPIC: '`{"Ref" : "NewSignupTopic"}`'
     aws:elasticbeanstalk:container:nodejs:
       ProxyServer: nginx
     aws:elasticbeanstalk:container:nodejs:staticfiles:
       /static: /static
     aws:autoscaling:asg:
       Cooldown: "120"
     aws:autoscaling:trigger:
       Unit: "Percent"
       Period: "1"
       BreachDuration: "2"
       UpperThreshold: "75"
       LowerThreshold: "30"
       MeasureName: "CPUUtilization"
   ```

   這將為應用程式套用以下設定：
   + Amazon SNS 主題用於通知的電子郵件地址會設為您的地址，或您於 `options.config` 檔案中輸入的地址。
   + 系統將會使用 **nodejs-tutorial** 資料表，而非 `.ebextensions/create-dynamodb-table.config` 所建立的資料表。

1. 移除 `.ebextensions/create-dynamodb-table.config`。

   ```
   ~/nodejs-tutorial$ rm .ebextensions/create-dynamodb-table.config
   ```

   您下次部署應用程式時，將刪除此組態檔案建立的資料表。

1. 使用 [**eb deploy**](eb3-deploy.md) 命令將更新的應用程式部署至您的 Elastic Beanstalk 環境。

   ```
   ~/nodejs-example-dynamo$ eb deploy
   ```

1. 環境建立完成後，請使用 [**eb open**](eb3-open.md) 命令，在預設瀏覽器中開啟環境 URL。

   ```
   ~/nodejs-example-dynamo$ eb open
   ```

當您部署時，Elastic Beanstalk 會更新 Amazon SNS 主題的組態，並刪除您部署應用程式第一個版本時建立的 DynamoDB 資料表。

現在，當您終止環境時，將無法刪除 **nodejs-tutorial (nodejs-tutorial)** 資料表。這可讓您執行藍/綠部署、修改組態檔案或關閉您的網站而不會遺失資料。

在瀏覽器中開啟您的網站，並確認表單如預期運作。建立數個項目，然後檢查 DynamoDB 主控台來驗證資料表。

**欲檢視資料表**

1. 在 DynamoDB 主控台中開啟[資料表頁面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 尋找 **nodejs-tutorial (nodejs-tutorial)** 資料表。

1. 選取資料表，選擇 **Items (項目)**，然後選擇 **Start search (開始搜尋)** 以檢視資料表的所有項目。

您也可看到 Elastic Beanstalk 已刪除之前建立的資料表。

## 將您的環境設定為高可用性
<a name="nodejs-dynamodb-tutorial-configure"></a>

最後，請增加執行個體計數下限，藉此設定您的環境 Auto Scaling 群組。隨時至少執行兩個執行個體，避免您環境中的 Web 伺服器出現單點故障，且無須停止網站服務即可部署變更。

**若要設定您環境的 Auto Scaling 群組，以維持高可用性**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇 **Configuration** (組態)。

1. 在 **Capacity (容量)** 組態類別中，選擇 **Edit (編輯)**。

1. 在 **Auto Scaling 群組**區段，將**最小執行個體**設定為 **2**。

1. 若要儲存變更，請選擇頁面底部的**儲存變更**。

## 清除
<a name="nodejs-dynamodb-tutorial-cleanup"></a>

完成使用示範程式碼後，您可以終止您的環境。Elastic Beanstalk 會刪除所有相關 AWS 資源，例如 [Amazon EC2 執行個體](using-features.managing.ec2.md)、[資料庫執行個體](using-features.managing.db.md)、[負載平衡器](using-features.managing.elb.md)、安全群組和[警示](using-features.alarms.md#using-features.alarms.title)。

移除資源不會刪除 Elastic Beanstalk 應用程式，因此您可以隨時為您的應用程式建立新環境。

**從主控台終止您的 Elastic Beanstalk 環境**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 選擇 **Actions** (動作)，然後選擇 **Terminate Environment** (終止環境)。

1. 使用畫面顯示對話方塊來確認環境終止。

您也可以刪除您所建立的外部 DynamoDB 資料表。

**刪除 DynamoDB 資料表**

1. 在 DynamoDB 主控台中開啟[資料表頁面](https://console.aws.amazon.com/dynamodb/home?#tables:)。

1. 選擇資料表。

1. 選擇 **Actions (動作)**，然後再選擇 **Delete table (刪除資料表)**。

1. 選擇 **刪除**。

## 後續步驟
<a name="nodejs-dynamodb-tutorial-nextsteps"></a>

範例應用程式使用組態檔案來設定軟體設定，並建立 AWS 資源做為您環境的一部分。如需關於組態檔案及其用途的詳細資訊，請參閱 [使用組態檔案 (`.ebextensions`) 來進行進階的環境自訂](ebextensions.md)。

本教學課程的範例應用程式使用 Node.js 適用的 Express Web 架構。如需有關 Express 的詳細資訊，請至 [expressjs.com](https://expressjs.com) 參閱其官方文件。

最後，若您打算於生產環境中使用您的應用程式，請[設定您環境的自訂網域名稱](customdomains.md)，並[啟用 HTTPS](configuring-https.md) 安全連線。