將 Node.js 應用程式與 DynamoDB 部署到 Elastic Beanstalk - AWS Elastic Beanstalk

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

將 Node.js 應用程式與 DynamoDB 部署到 Elastic Beanstalk

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

範例應用程式可說明下列項目:

  • 儲存使用者提供之文字資料的 DynamoDB 資料表。

  • 組態檔案,可用於建立資料表。

  • Amazon Simple Notification Service 主題。

  • 於部署期間使用 package.json 檔案,以安裝套件。

必要條件

本教學課程需要下列先決條件:

  • Node.js 執行階段

  • 預設的 Node.js 套件管理工具軟體 npm

  • Express 命令列產生器

  • Elastic Beanstalk 命令列界面 (EB CLI)

有關安裝所列出之前三個元件和設定本機開發環境的詳細資訊,請參閱 設定您的 Node.js 開發環境。在本教學課程中,您不需要安裝 Node.js 的 AWS SDK,這也在參考的主題中提到。

有關安裝和設定 EB CLI 的詳細資訊,請參閱 安裝 EB CLI設定 EB CLI

建立 Elastic Beanstalk 環境

應用程式目錄

對於應用程式原始碼套件,本教學課程使用的是名為 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 命令建立一個儲存庫。

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

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

  2. 使用 eb create 命令建立執行範例應用程式的環境。

    ~/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 群組會擴展或縮減以進行回應。

    • AWS CloudFormation 堆疊 — Elastic Beanstalk 用 AWS CloudFormation 來啟動環境中的資源並傳播組態變更。資源定義於範本中,您可在 AWS CloudFormation 主控台中檢視此範本。

    • 網域名稱 – 會路由到您 Web 應用程式的網域名稱,其格式為 subdomain.region.elasticbeanstalk.com

      注意

      為了增強 Elastic Beanstalk 應用程式的安全性,我們會在公共后缀列表 (PSL) 中註冊網域 elasticbeanstalk.com。為了加強安全性,如果您需要在 Elastic Beanstalk 應用程式的預設網域名稱中設定敏感性 Cookie,我們建議您使用具 __Host- 前置詞的 Cookie。此做法將有助於保護您的網域免受跨站請求偽造 (CSRF) 攻擊。如需更多資訊,請參閱 Mozilla 開發人員網路中的設定 Cookie 頁面。

  3. 環境建立完成後,請使用 eb open 命令,在預設瀏覽器中開啟環境 URL。

    ~/nodejs-example-dynamo$ eb open

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

新增您環境執行個體的許可

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

範例應用程式會使用執行個體許可將資料寫入 DynamoDB 表格,並透過 Node.js JavaScript 中的 SDK 將通知傳送至 Amazon SNS 主題。將下列受管原則新增至預設執行個體設定檔,以授予您環境中的 EC2 執行個體存取 DynamoDB 和 Amazon SNS 的許可:

  • AmazonDynamo資料庫 FullAccess

  • 亞馬遜 SNS FullAccess

若要在預設的執行個體設定檔中新增原則
  1. 在 IAM 主控台中開啟 角色頁面

  2. 選擇 aws-elasticbeanstalk-ec2 個角色

  3. Permissions (許可) 標籤上,選擇 Attach policies (連接政策)。

  4. 為您的應用程式使用的其他服務,選取受管原則,對於本教學課程,請選取 AmazonSNSFullAccessAmazonDynamoDBFullAccess

  5. 選擇連接政策

如需管理執行個體設定檔的詳細資訊,請參閱 管理 Elastic Beanstalk 執行個體描述檔

部署範例應用程式

現在,您的環境已準備就緒,可供您部署和執行此教學課程的範例應用程式:nodejs-example-dynamo.zip。

部署和執行教學課程範例應用程式
  1. 將目前的工作目錄變更為應用程式目錄 nodejs-example-dynamo

    ~$ cd nodejs-example-dynamo
  2. 下載範例應用程式來源套裝軟體 nodejs-example-dynamo.zip 的內容,並將其解壓縮至應用程式目錄nodejs-example-dynamo

  3. 使用 eb deploy 命令將範例應用程式部署至您的 Elastic Beanstalk 環境。

    ~/nodejs-example-dynamo$ eb deploy
    注意

    依預設,此指eb deploy令會建立專案資料夾的 ZIP 檔案。您亦可設定 EB CLI 從建置程序部署組建成品,而非建立您專案資料夾的 ZIP 檔案。如需詳細資訊,請參閱 部署成品而非專案資料夾

  4. 環境建立完成後,請使用 eb open 命令,在預設瀏覽器中開啟環境 URL。

    ~/nodejs-example-dynamo$ eb open

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

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

欲檢視資料表
  1. 在 DynamoDB 主控台中開啟資料表頁面

  2. 尋找應用程式建立的資料表。該名稱以 awseb 開頭並包含。StartupSignupsTable

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

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

欲檢視主題
  1. 在 Amazon SNS 主控台中開啟主題頁面

  2. 尋找應用程式建立的主題。該名稱以 awseb 開頭並包含。NewSignupTopic

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

應用程式 (app.js) 會定義兩個路由。根路徑 (/) 返回從嵌入式 JavaScript (EJS)模板呈現的網頁,其中包含用戶填寫以註冊其姓名和電子郵件地址的表單。提交表單會將內含表單資料的 POST 請求傳送至 /signup 路由,該路由會寫入 DynamoDB 資料表,並發佈訊息至 Amazon SNS 主題以通知擁有者註冊事宜。

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

建立 DynamoDB 資料表

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

透過下列設定建立資料表:

  • Table name (資料表名稱)nodejs-tutorial

  • 主索引鍵email

  • 主索引鍵類型 – String (字串)

建立 DynamoDB 資料表
  1. 在 DynamoDB 管理主控台中開啟資料表頁面

  2. 選擇 建立資料表

  3. 輸入 Table name (資料表名稱) Primary key (主索引鍵)

  4. 選擇主索引鍵類型。

  5. 選擇建立

更新應用程式的組態檔案

更新應用程式原始碼內的組態檔案以使用 nodejs-tutorial (nodejs-tutorial) 資料表,無須建立新的資料表。

更新範例應用程式,以供生產使用
  1. 將目前的工作目錄變更為應用程式目錄 nodejs-example-dynamo

    ~$ cd nodejs-example-dynamo
  2. 開啟 .ebextensions/options.config 並變更下列設定的值:

    • NewSignupEmail— 您的電子郵件地址。

    • STARTUP_SIGNUP_TABLEnodejs-tutorial

    範例 .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 所建立的資料表。

  3. 移除 .ebextensions/create-dynamodb-table.config

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

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

  4. 使用 eb deploy 命令將更新的應用程式部署至您的 Elastic Beanstalk 環境。

    ~/nodejs-example-dynamo$ eb deploy
  5. 環境建立完成後,請使用 eb open 命令,在預設瀏覽器中開啟環境 URL。

    ~/nodejs-example-dynamo$ eb open

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

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

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

欲檢視資料表
  1. 在 DynamoDB 主控台中開啟資料表頁面

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

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

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

將您的環境設定為高可用性

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

若要設定您環境的 Auto Scaling 群組,以維持高可用性
  1. 開啟彈性魔豆控制台,然後在區域清單中選取您的. AWS 區域

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

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇 Configuration (組態)。

  4. Capacity (容量) 組態類別中,選擇 Edit (編輯)

  5. Auto Scaling 群組區段,將最小執行個體設定為 2

  6. 若要儲存變更,請選擇頁面底部的儲存變更

清除

當您完成使用 Elastic Beanstalk 時,即可終止您的環境。Elastic Beanstalk 會終止與您的環境相關聯的所有 AWS 資源,例如 Amazon EC2 執行個體、資料庫執行個體、負載平衡器、安全群組和警示。

從控制台終止 Elastic Beanstalk 環境
  1. 開啟彈性魔豆控制台,然後在區域清單中選取您的. AWS 區域

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

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 選擇 Actions (動作),然後選擇 Terminate Environment (終止環境)。

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

您可以使用 Elastic Beanstalk,隨時輕鬆地為您的應用程式建立新環境。

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

刪除 DynamoDB 資料表
  1. 在 DynamoDB 主控台中開啟資料表頁面

  2. 選擇資料表。

  3. 選擇 Actions (動作),然後再選擇 Delete table (刪除資料表)

  4. 選擇刪除

後續步驟

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

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

最後,若您打算於生產環境中使用您的應用程式,請設定您環境的自訂網域名稱,並啟用 HTTPS 安全連線。