建立您的第一個 Node.js 堆疊 - AWS OpsWorks

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

建立您的第一個 Node.js 堆疊

重要

AWS OpsWorks Stacks不再接受新客戶。現有客戶可以正常使用 OpsWorks 主控台、API、CLI 和 CloudFormation 資源,直到 2024 年 5 月 26 日為止,屆時他們將停止使用。為了為此轉換做好準備,我們建議您AWS Systems Manager盡快將堆疊轉換為。如需詳細資訊,請參閱 AWS OpsWorks Stacks壽命終止常見問題將應用程式移轉至AWS OpsWorks Stacks應用AWS Systems Manager程式管

此範例說明如何建立支援 Node.js 應用程式伺服器的 Linux 堆疊,以及如何部署簡易應用程式。堆疊包含下列元件:

必要條件

本演練的假設如下:

  • 您擁有 AWS 帳戶及如何使用 AWS OpsWorks Stacks 的基本理解。

    若您是初次使用 AWS OpsWorks Stacks 或 AWS,請先完成Chef 11 Linux 堆疊入門中的簡介教學,來學習基本概念。

  • 您具有如何實作 Node.js 應用程式的基本理解。

    若您是初次使用 Node.js,請完成簡介教學 (例如 Node: Up and Running) 來學習基本概念。

  • 您已在您計劃於此範例中使用的 AWS 區域內建立至少一個堆疊。

    當您在區域中建立第一個堆疊時,AWS OpsWorksStacks 會為每個層類型建立一個 Amazon 彈性運算雲端 (Amazon EC2) 安全群組。您需要這些安全群組才能建立 Amazon RDS 資料庫 (資料庫) 執行個體。若您是初次使用 AWS OpsWorks Stacks,我們建議您針對此範例使用與在Chef 11 Linux 堆疊入門教學中相同的區域。若您希望使用新的區域,請在區域內建立新的堆疊。堆疊不需要具備任何 layer 或執行個體。在您建立堆疊時,AWS OpsWorks Stacks 便會自動將一組安全群組新增至區域。

  • 您會在預設 VPC 中建立您的堆疊。

    您可以針對本演練使用 EC2-Classic,但一部分的詳細資訊可能會有所不同。例如,使用 EC2-Classic 時,您必須指定執行個體的可用區域 (AZ) 而非其子網路。

  • 您的 IAM 使用者擁有「AWS OpsWorks堆疊」的完整存取權限。

    基於安全考量,我們強烈建議您不要在本演練中使用您帳戶的根登入資料。而是建立具有「AWS OpsWorks堆疊」完整存取權限的使用者,然後透過「AWS OpsWorks堆疊」使用這些憑證 如需詳細資訊,請參閱 建立 管理使用者

實作應用程式

本逐步解說使用簡單的 Express 應用程式,該應用程式可連接到 Amazon RDS 資料庫執行個體並列出執行個體的資料庫

若要實作應用程式,請在您工作站上方便的位置建立名為 nodedb 的目錄,並將下列三個檔案新增至其中。

套件描述項

若要建立應用程式的套件描述項,請在 nodedb 目錄中新增名為 package.json 的檔案,其中包含以下內容。package.json 為 Express 應用程式的必要項目,因此必須位於應用程式的根目錄中。

{ "name": "Nodejs-DB", "description": "Node.js example application", "version": "0.0.1", "dependencies": { "express": "*", "ejs": "*", "mysql": "*" } }

package.json 範例相當精簡。它定義了所需的 nameversion 屬性,並列出依存套件:

  • express 參考 Express 套件。

  • ejs 參考 EJS 套件,應用程式會用它來將文字插入 HTML 配置檔案。

  • mysql 參考 node-mysql 套件,應用程式會用它來連線至 RDS 執行個體。

如需套件描述項檔案的詳細資訊,請參閱 package.json

配置檔案

若要建立應用程式的配置檔案,請將 views 目錄新增至 nodedb 目錄,然後將名為 index.html 的檔案新增至 views,其中內容如下:

<!DOCTYPE html> <html> <head> <title>AWS Opsworks Node.js Example</title> </head> <body> <h1>AWS OpsWorks Node.js Example</h1> <p>Amazon RDS Endpoint: <i><%= hostname %></i></p> <p>User: <i><%= username %></i></p> <p>Password: <i><%= password %></i></p> <p>Port: <i><%= port %></i></p> <p>Database: <i><%= database %></i></p> <p>Connection: <%= connectionerror %></p> <p>Databases: <%= databases %></p> </body> </html>

在此範例中,版面配置檔案是一個簡單的 HTML 文件,其中顯示來自 Amazon RDS 的部分資料。每個 <%= ... => 元素都代表在應用程式程式碼檔案中定義的變數值。我們會在接下來的步驟中建立。

程式碼檔案

若要建立應用程式的程式碼檔案,請在 nodedb 目錄中新增名為 server.js 的檔案,其中包含以下內容。

重要

使用 AWS OpsWorks Stacks 時,Node.js 應用程式的主要程式碼檔案必須命名為 server.js,並位於應用程式的根資料夾中。

var express = require('express'); var mysql = require('mysql'); var dbconfig = require('opsworks'); //[1] Include database connection data var app = express(); var outputString = ""; app.engine('html', require('ejs').renderFile); //[2] Get database connection data app.locals.hostname = dbconfig.db['host']; app.locals.username = dbconfig.db['username']; app.locals.password = dbconfig.db['password']; app.locals.port = dbconfig.db['port']; app.locals.database = dbconfig.db['database']; app.locals.connectionerror = 'successful'; app.locals.databases = ''; //[3] Connect to the Amazon RDS instance var connection = mysql.createConnection({ host: dbconfig.db['host'], user: dbconfig.db['username'], password: dbconfig.db['password'], port: dbconfig.db['port'], database: dbconfig.db['database'] }); connection.connect(function(err) { if (err) { app.locals.connectionerror = err.stack; return; } }); // [4] Query the database connection.query('SHOW DATABASES', function (err, results) { if (err) { app.locals.databases = err.stack; } if (results) { for (var i in results) { outputString = outputString + results[i].Database + ', '; } app.locals.databases = outputString.slice(0, outputString.length-2); } }); connection.end(); app.get('/', function(req, res) { res.render('./index.html'); }); app.use(express.static('public')); //[5] Listen for incoming requests app.listen(process.env.PORT);

範例顯示資料庫連線資訊,並查詢資料庫伺服器及顯示伺服器的資料庫。您可以輕易的將其一般化,以和資料庫互動 (若需要的話)。下列備註指向先前程式碼中具有編號的註解。

[1] 包含資料庫連線資料

require 陳述式包含資料庫連線資料。如稍後所述,當您將資料庫執行個體連接到應用程式時,AWS OpsWorks Stacks 會將連線資料存放在名為 opsworks.js 的檔案中,其內容與下列相似:

exports.db = { "host":"nodeexample.cdlqlk5uwd0k.us-west-2.rds.amazonaws.com", "database":"nodeexampledb", "port":3306, "username":"opsworksuser", "password":"your_pwd", "reconnect":true, "data_source_provider":"rds", "type":"mysql"}

opsworks.js 位於應用程式的 shared/config 目錄,/srv/www/app_shortname/shared/config 中。但是,AWS OpsWorks Stacks 會將 opsworks.js 的符號連結放置在應用程式的根目錄中,讓您可以只使用 require 'opsworks' 來包含物件。

[2] 取得資料庫連線資料

這一組陳述式會將 db 物件的值指派給一組 app.locals 屬性,其中每一項都會對應到 index.html 檔案中的其中一個 <%= ... %> 元素,以顯示 opsworks.js 的連線資料。轉譯後的文件會使用對應的屬性值取代 <%= ... %> 元素。

[3] 連線至 Amazon RDS 執行個體

範例使用 node-mysql 存取資料庫。為連線到資料庫,範例會透過將連線資料傳遞給 connection,然後呼叫 createConnection 建立連線,來建立 connection.connect 物件。

[4] 查詢資料庫

在建立連線後,範例會呼叫 connection.query 查詢資料庫。此範例只會查詢伺服器的資料庫名稱。query 會傳回 results 物件的陣列,每個資料庫一個,並且資料庫名稱會指派給 Database 屬性。範例會串連名稱,並將他們指派給 app.locals.databases,,在轉譯後的 HTML 頁面上顯示清單。

在此範例中,有五個資料nodeexampledb庫、您在建立 RDS 執行個體時指定的資料庫,以及 Amazon RDS 自動建立的其他四個資料庫。

[5] 接聽傳入請求

最後一個陳述式會在指定連接埠上接聽傳入請求。您不必指定明確的連接埠值。當您將應用程式新增至堆疊時,您可以指定應用程式是否支援 HTTP 或 HTTPS 要求。 AWS OpsWorks然後堆疊會將PORT環境變數設定為 80 (HTTP) 或 443 (HTTPS),您就可以在應用程式中使用該變數。

您可以在其他連接埠上偵聽,但 Node.js 應用程式伺服器層的內建安全群組 AWS OpsWorks-節點應用程式伺服器只允許傳入使用者流量傳輸至連接埠 80、443 和 22 (SSH)。若要允許其他連接埠的輸入使用者流量,請建立具有適當輸入規則的安全性群組,並將其指派給 Node.js 應用程式伺服器層。請勿透過編輯內建安全群組來修改傳入規則。每一次建立堆疊時,AWS OpsWorks Stacks 會使用標準設定覆寫內建安全群組的組態,因此您所做的任何變更都會在下次建立堆疊時遺失。

注意

您可以在您建立更新關聯應用程式時,將自訂環境變數與您的應用程式建立關聯。您也可以使用自訂 JSON 和自訂配方將資料傳遞到您的應用程式。如需詳細資訊,請參閱 傳遞資料到應用程式

建立資料庫伺服器和負載平衡器

此範例使用 Amazon RDS 資料庫伺服器和 Elastic Load Balancing 負載平衡器執行個體。您必須分別建立每個執行個體,然後將其併入您的堆疊。本節說明如何建立新的資料庫和負載平衡器執行個體。雖然您可以改為使用現有的執行個體,但我們建議您閱讀整個程序,以確保那些執行個體的設定正確。

以下說明如何建立精簡設定,足以用於此範例的 RDS 資料庫執行個體。如需詳細資訊,請參閱 Amazon RDS 使用者指南

建立 RDS 資料庫執行個體
  1. 開啟 主控台。

    開啟 Amazon RDS 主控台,然後將區域設定為美國西部 (奧勒岡)。在導覽窗格中,選擇 RDS Dashboard (RDS 儀表板),然後選擇 Launch DB Instance (啟動資料庫執行個體)

  2. 指定資料庫引擎。

    選擇 MySQL Community Edition 做為資料庫引擎。

  3. 拒絕異地同步備份部署。

    選擇 No, this instance... (否,此執行個體...),然後選擇 Next (下一步)。您在此範例中不需要使用異地同步備份部署。

  4. 設定基本設定。

    DB Instance Details (資料庫執行個體詳細資訊) 頁面上,指定下列設定:

    • DB Instance Class (資料庫執行個體類別)db.t2.micro

    • Multi-AZ Deployment (異地同步備份部署)No (否)

    • Allocated Storage (配置儲存體)5 GB

    • DB Instance Identifier (資料庫執行個體識別符)nodeexample

    • Master Username (主要使用者名稱)opsworksuser

    • Master Password (主要密碼):您選擇的密碼

    記錄執行個體識別符、使用者名稱、密碼以供稍後使用,接受其他選項的預設設定,然後選擇 Next (下一步)

  5. 設定進階設定。

    Configure Advanced Settings (設定進階設定) 頁面上,指定下列設定:

    • 資料庫名稱nodeexampledb

    • 資料庫安全群組AWS OpsWorks- DB 主伺服器

    注意

    AWS-OpsWorks-DB-master 伺服器安全群組只允許堆疊的執行個體存取資料庫。若您希望直接存取資料庫,請將額外的安全群組連接到 RDS 資料庫執行個體,並搭配適當的傳入規則。如需詳細資訊,請參閱 Amazon RDS 安全群組。您也可以透過將執行個體置放在 VPC 中,來控制存取。如需詳細資訊,請參閱 在 VPC 中執行堆疊

    記錄資料庫名稱以供稍後使用,接受其他設定的預設值,然後選擇 Launch DB Instance (啟動資料庫執行個體)

下列程序說明如何針對此範例建立 Elastic Load Balancing 器。如需詳細資訊,請參閱《Elastic Load Balancing 使用者指南》。

建立負載平衡器
  1. 開啟 Amazon EC2 主控台。

    開啟 Amazon EC2 主控台,並確保該區域設定為美國西部 (奧勒岡)。在導覽窗格中,選擇 Load Balancers (負載平衡器),然後選擇 Create Load Balancer (建立負載平衡器)

  2. 定義負載平衡器。

    Define Load Balancer (定義負載平衡器) 頁面上,指定下列設定。

    • 名稱Node-LB

    • 在其中建立 LB我的預設 VPC

    接受其他選項的預設設定,然後選擇 Next (下一步)

  3. 指派安全群組。

    Assign Security Groups (指派安全群組) 頁面上,指定下列群組:

    • default VPC security group (預設 VPC 安全群組)

    • AWS-節點應用程序服務OpsWorks器

    選擇下一步。在 Configure Security Settings (設定安全設定) 頁面上,選擇 Next (下一步)。您在此範例中不需要使用安全接聽程式。

  4. 設定運作狀態檢查。

    Configure Health Check (設定運作狀態檢查) 頁面上,將 Ping Path (Ping 路徑) 設為 /,並接受其他設定的預設值。選擇下一步。在 Add EC2 Instances (新增 EC2 執行個體) 頁面上,選擇 Next (下一步)。在「新增標籤」頁面上,選擇「檢閱並建立」。 AWS OpsWorksStacks 會處理將 EC2 執行個體新增至負載平衡器的工作,而且此範例不需要標籤。

  5. 建立負載平衡器。

    Review (頁面) 上,選擇 Create (建立) 以建立負載平衡器。

建立堆疊

您現在已具備所有需要用來建立堆疊的元件。

建立堆疊
  1. 登入 AWS OpsWorks Stacks 主控台。

    登入 AWS OpsWorks Stacks 主控台,然後選擇 Add Stack (新增堆疊)

  2. 建立堆疊。

    若要建立新的堆疊,請選擇 Chef 11 stack (Chef 11 堆疊),然後指定下列設定。

    • NodeStack

    • 地區美國西部 (奧勒岡)

      您可以在任何 AWS 區域建立堆疊,但建議使用美國西部 (奧勒岡) 教學課程。

    選擇 Add Stack (新增堆疊)。如需堆疊組態設定的詳細資訊,請參閱建立新的堆疊

  3. 新增含有連接負載平衡器的 Node.js 應用程式伺服器層。

    NodeStack頁面上,選擇「新增圖層」,然後指定下列設定:

    • 圖層類型Node.js 應用程式伺服器

    • Elastic Load Balancer-節點 L B

    接受其他設定的預設值,然後選擇 Add Layer (新增 Layer)

  4. 將執行個體新增至 layer 並啟動。

    在導覽窗格中選擇 Instances (執行個體),然後新增兩個執行個體至 Rails 應用程式伺服器 layer,如下所示。

    1. Node.js 應用程式伺服器下,選擇 [新增執行個

      Size (大小) 設為 t2.micro,接受其他設定的預設值,然後選擇 Add Instance (新增執行個體)

    2. 選擇 +Instance (+執行個體),然後新增第二個 t2.micro 執行個體至位於不同子網路中的 layer。

      這會將執行個體置放在不同的可用區域 (AZ) 中。

    3. 選擇 Add instance (新增執行個體)

    4. 若要啟動兩個執行個體,請選擇 Start All Instances (啟動所有執行個體)

    您已將 Elastic Load Balancing 負載平衡器指派給此層。當執行個體進入或離開線上狀態時,AWS OpsWorks Stacks 會自動向負載平衡器註冊或取消註冊執行個體。

    注意

    針對生產堆疊,我們建議您將您的應用程式伺服器執行個體分散到多個 AZ 中。若使用者無法連線到其中一個 AZ,負載平衡器會將傳入流量路由至剩餘區域中的執行個體,讓您的網站可繼續運作。

  5. 向堆疊註冊 RDS 資料庫執行個體。

    在導覽窗格中選擇 Resources (資源) 並向堆疊註冊 RDS 資料庫執行個體,如下所示。

    1. 選擇 RDS 標籤,然後選擇 Show Unregistered RDS DB (顯示未註冊的 RDS 資料庫) 執行個體。

    2. 選擇 nodeexampledb 執行個體,然後指定下列設定:

      • 使用者 — 您在建立實例時指定的主要使用者名稱;例如。 opsworksuser

      • 密碼 — 您在建立執行個體時指定的主要密碼。

    3. 選擇向堆疊註冊,將 RDS 資料庫執行個體新增到堆疊做為 Amazon RDS 服務層

    警告

    AWS OpsWorks Stacks 不會驗證 User (使用者)Password (密碼) 的值,而會直接將其傳遞給應用程式。若您輸入不正確,您的應用程式將無法連線至資料庫。

    若要將 RDS 資料庫執行個體新增至堆疊做為 Amazon RDS 服務層,請選擇向堆疊註冊

部署應用程式

您必須將應用程式存放在遠端儲存庫中。當您部署它時,AWS OpsWorks Stacks 會將程式碼和相關檔案從儲存庫部署到應用程式伺服器執行個體。為了方便起見,此範例使用公用 Amazon Simple Storage Service (Amazon S3) 存檔做為儲存庫,但您也可以使用其他多種存放庫類型,包括 Git 和 Subversion。如需詳細資訊,請參閱 應用程式來源

部署應用程式
  1. 將應用程式封裝在封存檔中。

    建立 .zip 目錄和子目錄的 nodedb 封存,命名為 nodedb.zip。您也可以使用其他類型的封存檔,包括 gzip、bzip2 和 tarball。請注意,AWS OpsWorks Stacks 不支援未壓縮的 tarball。如需詳細資訊,請參閱 應用程式來源

  2. 將存檔檔案上傳到 Amazon S3。

    上傳nodedb.zip到 Amazon S3 儲存貯體、將檔案設為公開,然後複製檔案的 URL 以供日後使用。如需如何建立儲存貯體以及上傳檔案的詳細資訊,請參閱開始使用 Amazon Simple Storage Service

    注意

    AWS OpsWorks堆疊也可以從 Amazon S3 儲存貯體部署私有檔案,但為了簡單起見,此範例使用公用檔案。如需詳細資訊,請參閱 應用程式來源

  3. 建立 AWS OpsWorks Stacks 應用程式。

    返回 AWS OpsWorks Stacks 主控台,在導覽窗格中,選擇 Apps (應用程式),然後選擇 Add an app (新增應用程式)。指定下列設定:

    • Name (名稱) – NodeDB

      此字串為應用程式的顯示名稱。針對大多數的用途,您需要應用程式的短名。AWS OpsWorks Stacks 會將顯示名稱的所有字元轉換成小寫,並移除標點符號,來產生短名。針對此範例,短名為 nodedb。若要驗證應用程式的短名,在建立應用程式之後,請在 Apps (應用程式) 頁面上選擇應用程式以顯示其詳細資訊頁面。

    • 類型Node.js.

    • Data source type (資料來源類型)RDS

    • 資料庫執行個體 — 選擇您之前註冊的 Amazon RDS 資料庫執行個體。

    • Database name (資料庫名稱) – 指定您先前建立的資料庫名稱,此範例中為 nodeexampledb

    • Repository type (儲存庫類型)Http Archive

      您必須將此儲存庫類型用於公用 Amazon S3 檔案。S3 Archive 類型僅用於私有封存。

    • 儲存庫網址 — 封存檔案的 Amazon S3 網址。

    針對剩餘設定使用預設值,然後按一下 Add App (新增應用程式) 以建立應用程式。

  4. 部署應用程式。

    前往 Apps (應用程式) 頁面,然後在 NodeDB 應用程式的 Actions (動作) 資料行中,選擇 deploy (部署)。然後選擇「部署」,將應用程式部署到伺服器執行個體。 AWS OpsWorks堆疊會在每個執行個體上執行 Deploy 方法,從儲存庫下載應用程式並重新啟動伺服器。當每個執行個體都有綠色的核取記號,並且 Status (狀態)successful (成功) 時,部署便已完成,應用程式已準備好開始處理請求。

    注意

    如果部署失敗,請選擇「記錄」欄中的「示」以顯示部署的 Chef 記錄。錯誤資訊位於接近底部的位置。

  5. 開啟 應用程式。

    若要開啟應用程式,請選擇 Layer (Layer),選擇負載平衡器,然後選擇負載平衡器的 DNS 名稱,將 HTTP 請求傳送到負載平衡器。您應該會看到類似下列的內容。

注意

AWS OpsWorks Stacks 會自動在設定時將應用程式部署到新的執行個體。只需要針對線上執行個體進行手動部署。如需詳細資訊,請參閱 部署應用程式。如需部署的一般討論,包含一些更複雜的部署策略,請參閱管理和部署應用程式與技術指南

後續步驟?

重要

AWS OpsWorks Stacks不再接受新客戶。現有客戶可以正常使用 OpsWorks 主控台、API、CLI 和 CloudFormation 資源,直到 2024 年 5 月 26 日為止,屆時他們將停止使用。為了為此轉換做好準備,我們建議您AWS Systems Manager盡快將堆疊轉換為。如需詳細資訊,請參閱 AWS OpsWorks Stacks壽命終止常見問題將應用程式移轉至AWS OpsWorks Stacks應用AWS Systems Manager程式管

本演練帶領您完成設定簡易 Node.js 應用程式伺服器堆疊的基本操作。以下是有關後續作業的一些建議。

檢查 Node.js 的內建技術指南

若您希望了解執行個體設定方式的詳細資訊,請參閱 layer 的內建技術指南 opsworks_nodejs,其中包含 AWS OpsWorks Stacks 用來安裝和設定軟體的配方和相關檔案,以及內建的 部署技術指南,其中包含 AWS OpsWorks Stacks 用來部署應用程式的配方。

自訂伺服器組態

範例堆疊相當基本。針對生產用途,您可以會希望自訂堆疊。如需詳細資訊,請參閱 自訂 AWS OpsWorks Stacks

新增 SSL 支援

您可以為應用程式啟用 SSL 支援,並在建立應用程式時為 AWS OpsWorks Stacks 提供適當的憑證。 AWS OpsWorks然後,堆疊將憑證安裝在適當的目錄中。如需詳細資訊,請參閱 使用 SSL

新增記憶體內快取

生產層級網站通常會透過在記憶體內鍵/值存放區 (例如 Redis 或 Memcache) 中快取資料來改善效能。您可以搭配 AWS OpsWorks Stacks 堆疊使用其中任何一種。如需詳細資訊,請參閱 ElastiCache RedisMemcached

使用更複雜的部署策略

範例使用簡易的應用程式部署策略,將更新同時部署到每個執行個體。這種方法非常簡單且快速,但沒有錯誤的餘地。若部署失敗或更新發生任何問題,每個您生產堆疊中的執行個體都會受到影響,可能中斷或停用您的網站,直到您修正問題為止。如需部署策略的詳細資訊,請參閱管理和部署應用程式與技術指南

擴充 Node.js 應用程式伺服器層

您可以透過各種方式延伸 layer。例如,您可以實作配方,以在執行個體上執行指令碼,或實作 Chef 部署勾點以自訂應用程式部署。如需詳細資訊,請參閱 擴充 Layer

定義環境變數

您可以透過定義關聯應用程式的環境變數,來將資料傳遞給您的應用程式。當您部署應用程式時,AWS OpsWorks Stacks 會匯出那些變數,讓您可以從您的應用程式存取他們。如需詳細資訊,請參閱 使用 環境變數