本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立您的第一個 Node.js 堆疊
重要
AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
此範例說明如何建立支援 Node.js 應用程式伺服器的 Linux 堆疊,以及如何部署簡易應用程式。堆疊包含下列元件:
-
具有兩個執行個體的 Node.js App Server layer
-
Elastic Load Balancing 負載平衡器可將流量分配到應用程式伺服器執行個體
-
提供後端資料庫的 Amazon Relational Database Service (Amazon RDS) 服務層
先決條件
本演練的假設如下:
-
您有一個 AWS 帳戶,並對如何使用 OpsWorks Stacks 有基本的了解。
如果您是初次使用 OpsWorks Stacks 或 AWS,請完成 中的簡介教學課程來學習基本知識Chef 11 Linux 堆疊入門。
-
您具有如何實作 Node.js 應用程式的基本理解。
若您是初次使用 Node.js,請完成簡介教學 (例如 Node: Up and Running
) 來學習基本概念。 -
您已在您計劃於此範例中使用的 AWS 區域內建立至少一個堆疊。
當您在區域中建立第一個堆疊時, OpsWorks Stacks 會為每個層類型建立 Amazon Elastic Compute Cloud (Amazon EC2) 安全群組。您需要這些安全群組才能建立 Amazon RDS 資料庫 (DB) 執行個體。如果您是初次使用 OpsWorks Stacks,我們建議您在此範例中使用與您在 中遵循教學課程時相同的區域Chef 11 Linux 堆疊入門。若您希望使用新的區域,請在區域內建立新的堆疊。堆疊不需要具備任何 layer 或執行個體。建立堆疊後, OpsWorks Stacks 會自動將一組安全群組新增至區域。
-
您會在預設 VPC 中建立您的堆疊。
您可以針對本演練使用 EC2-Classic,但一部分的詳細資訊可能會有所不同。例如,使用 EC2-Classic 時,您必須指定執行個體的可用區域 (AZ) 而非其子網路。
-
您的 IAM 使用者具有 Stacks OpsWorks 的完整存取許可。
基於安全考量,我們強烈建議您不要在本演練中使用您帳戶的根登入資料。反之,請建立具有 OpsWorks Stacks 完整存取許可的使用者,並將這些登入資料與 Stacks OpsWorks 搭配使用。如需詳細資訊,請參閱建立 管理使用者。
實作應用程式
此演練使用連接至 Amazon RDS 資料庫執行個體的簡單 Express
若要實作應用程式,請在您工作站上方便的位置建立名為 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 範例相當精簡。它定義了所需的 name 及 version 屬性,並列出依存套件:
-
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 的檔案,其中包含以下內容。
重要
透過 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陳述式包含資料庫連線資料。如稍後所述,當您將資料庫執行個體連接至應用程式時, 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/中。不過, OpsWorks Stacksapp_shortname/shared/configopsworks.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 頁面上顯示清單。在此範例中,有五個資料庫,您在建立 RDS 執行個體時指定的
nodeexampledb資料庫,以及由 Amazon RDS 自動建立的四個其他資料庫。 - [5] 接聽傳入請求
-
最後一個陳述式會在指定連接埠上接聽傳入請求。您不必指定明確的連接埠值。當您將應用程式新增至堆疊時,您可以指定應用程式是否支援 HTTP 或 HTTPS 請求。 OpsWorks Stacks 接著會將
PORT環境變數設定為 80 (HTTP) 或 443 (HTTPS),而且您可以在應用程式中使用該變數。您可以監聽其他連接埠,但 Node.js App Server 層的內建安全群組 AWS-OpsWorks-nodejs-App-Server 僅允許傳入使用者流量至連接埠 80、443 和 22 (SSH)。若要允許傳入使用者流量到其他連接埠,請使用適當的傳入規則建立安全群組,並將其指派給 Node.js App Server layer。請勿透過編輯內建安全群組來修改傳入規則。每次建立堆疊時, OpsWorks Stacks 都會以標準設定覆寫內建的安全群組,因此您所做的任何變更都會遺失。
建立資料庫伺服器和負載平衡器
此範例使用 Amazon RDS 資料庫伺服器和 Elastic Load Balancing 負載平衡器執行個體。您必須分別建立每個執行個體,然後將其併入您的堆疊。本節說明如何建立新的資料庫和負載平衡器執行個體。雖然您可以改為使用現有的執行個體,但我們建議您閱讀整個程序,以確保那些執行個體的設定正確。
以下說明如何建立精簡設定,足以用於此範例的 RDS 資料庫執行個體。如需詳細資訊,請參閱 Amazon RDS 使用者指南。
建立 RDS 資料庫執行個體
-
開啟 主控台。
開啟 Amazon RDS 主控台,
並將區域設定為美國西部 (奧勒岡)。在導覽窗格中,選擇 RDS Dashboard (RDS 儀表板),然後選擇 Launch DB Instance (啟動資料庫執行個體)。 -
指定資料庫引擎。
選擇 MySQL Community Edition 做為資料庫引擎。
-
拒絕異地同步備份部署。
選擇 No, this instance... (否,此執行個體...),然後選擇 Next (下一步)。您在此範例中不需要使用異地同步備份部署。
-
設定基本設定。
在 DB Instance Details (資料庫執行個體詳細資訊) 頁面上,指定下列設定:
-
DB Instance Class (資料庫執行個體類別):db.t2.micro。
-
Multi-AZ Deployment (異地同步備份部署):No (否)
-
Allocated Storage (配置儲存體):
5GB -
DB Instance Identifier (資料庫執行個體識別符):
nodeexample -
Master Username (主要使用者名稱):
opsworksuser -
Master Password (主要密碼):您選擇的密碼
記錄執行個體識別符、使用者名稱、密碼以供稍後使用,接受其他選項的預設設定,然後選擇 Next (下一步)。
-
-
設定進階設定。
在 Configure Advanced Settings (設定進階設定) 頁面上,指定下列設定:
-
資料庫名稱:
nodeexampledb -
DB Security Group(s) (資料庫安全群組):AWS-OpsWorks-DB-Master-Server
注意
AWS-OpsWorks-DB-Master-Server 安全群組只會允許您堆疊的執行個體存取資料庫。若您希望直接存取資料庫,請將額外的安全群組連接到 RDS 資料庫執行個體,並搭配適當的傳入規則。如需詳細資訊,請參閱 Amazon RDS 安全群組。您也可以透過將執行個體置放在 VPC 中,來控制存取。如需詳細資訊,請參閱在 VPC 中執行堆疊。
記錄資料庫名稱以供稍後使用,接受其他設定的預設值,然後選擇 Launch DB Instance (啟動資料庫執行個體)。
-
下列程序說明如何為此範例建立 Elastic Load Balancing 負載平衡器。如需詳細資訊,請參閱《Elastic Load Balancing 使用者指南》。
建立負載平衡器
-
開啟 Amazon EC2 主控台。
開啟 Amazon EC2 主控台
,並確保區域設定為美國西部 (奧勒岡)。在導覽窗格中,選擇 Load Balancers (負載平衡器),然後選擇 Create Load Balancer (建立負載平衡器)。 -
定義負載平衡器。
在 Define Load Balancer (定義負載平衡器) 頁面上,指定下列設定。
-
名稱 –
Node-LB -
在內部建立 LB – 我的預設 VPC
接受其他選項的預設設定,然後選擇 Next (下一步)。
-
-
指派安全群組。
在 Assign Security Groups (指派安全群組) 頁面上,指定下列群組:
-
default VPC security group (預設 VPC 安全群組)
-
AWS-OpsWorks-nodejs-App-Server
選擇下一步。在 Configure Security Settings (設定安全設定) 頁面上,選擇 Next (下一步)。您在此範例中不需要使用安全接聽程式。
-
-
設定運作狀態檢查。
在 Configure Health Check (設定運作狀態檢查) 頁面上,將 Ping Path (Ping 路徑) 設為
/,並接受其他設定的預設值。選擇下一步。在 Add EC2 Instances (新增 EC2 執行個體) 頁面上,選擇 Next (下一步)。在新增標籤頁面上,選擇檢閱和建立。 OpsWorks Stacks 會處理將 EC2 執行個體新增至負載平衡器的任務,在此範例中您不需要標籤。 -
建立負載平衡器。
在 Review (頁面) 上,選擇 Create (建立) 以建立負載平衡器。
建立堆疊
您現在已具備所有需要用來建立堆疊的元件。
建立堆疊
-
登入 Stacks OpsWorks 主控台。
登入 OpsWorks Stacks 主控台
,然後選擇 Add Stack (新增堆疊)。 -
建立堆疊。
若要建立新的堆疊,請選擇 Chef 11 stack (Chef 11 堆疊),然後指定下列設定。
-
–
NodeStack -
區域 – 美國西部 (奧勒岡)
您可以在任何 AWS 區域中建立堆疊,但我們建議美國西部 (奧勒岡) 進行教學課程。
選擇 Add Stack (新增堆疊)。如需堆疊組態設定的詳細資訊,請參閱建立新的堆疊。
-
-
使用連接的負載平衡器新增 Node.js App Server layer。
在 NodeStack 頁面上,選擇 Add a layer (新增 layer),然後指定下列設定:
-
Layer 類型 – Node.js 應用程式伺服器
-
Elastic Load Balancer – Node-LB
接受其他設定的預設值,然後選擇 Add Layer (新增 Layer)。
-
-
將執行個體新增至 layer 並啟動。
在導覽窗格中選擇 Instances (執行個體),然後新增兩個執行個體至 Rails 應用程式伺服器 layer,如下所示。
-
在 Node.js App Server 下,選擇新增執行個體。
將 Size (大小) 設為 t2.micro,接受其他設定的預設值,然後選擇 Add Instance (新增執行個體)。
-
選擇 +Instance (+執行個體),然後新增第二個 t2.micro 執行個體至位於不同子網路中的 layer。
這會將執行個體置放在不同的可用區域 (AZ) 中。
-
選擇 Add instance (新增執行個體)。
-
若要啟動兩個執行個體,請選擇 Start All Instances (啟動所有執行個體)。
您已將 Elastic Load Balancing 負載平衡器指派給此層。當執行個體進入或離開線上狀態時, OpsWorks Stacks 會自動向負載平衡器註冊或取消註冊執行個體。
注意
針對生產堆疊,我們建議您將您的應用程式伺服器執行個體分散到多個 AZ 中。若使用者無法連線到其中一個 AZ,負載平衡器會將傳入流量路由至剩餘區域中的執行個體,讓您的網站可繼續運作。
-
-
向堆疊註冊 RDS 資料庫執行個體。
在導覽窗格中選擇 Resources (資源) 並向堆疊註冊 RDS 資料庫執行個體,如下所示。
-
選擇 RDS 標籤,然後選擇 Show Unregistered RDS DB (顯示未註冊的 RDS 資料庫) 執行個體。
-
選擇 nodeexampledb 執行個體,然後指定下列設定:
-
使用者 – 您在建立執行個體時指定的主要使用者名稱;在此範例中為
opsworksuser。 -
密碼 – 您在建立執行個體時指定的主要密碼。
-
-
選擇向 Stack 註冊,將 RDS 資料庫執行個體新增至堆疊做為 Amazon RDS 服務層。
警告
OpsWorks Stacks 不會驗證使用者或密碼值,只會將值傳遞給應用程式。若您輸入不正確,您的應用程式將無法連線至資料庫。
若要將 RDS 資料庫執行個體新增至堆疊做為 Amazon RDS 服務層,請選擇向 Stack 註冊。
-
部署應用程式
您必須將應用程式存放在遠端儲存庫中。當您部署它時, OpsWorks Stacks 會將程式碼和相關檔案從儲存庫部署到應用程式伺服器執行個體。為了方便起見,此範例使用公有 Amazon Simple Storage Service (Amazon S3) 封存做為儲存庫,但您也可以使用其他幾種儲存庫類型,包括 Git 和 Subversion。如需詳細資訊,請參閱應用程式來源。
部署應用程式
-
將應用程式封裝在封存檔中。
建立
.zip目錄和子目錄的nodedb封存,命名為 nodedb.zip。您也可以使用其他類型的封存檔,包括 gzip、bzip2 和 tarball。請注意, OpsWorks Stacks 不支援未壓縮的 tarball。如需詳細資訊,請參閱應用程式來源。 -
將封存檔案上傳至 Amazon S3。
nodedb.zip上傳至 Amazon S3 儲存貯體,將檔案設為公有,然後複製檔案的 URL 以供日後使用。如需如何建立儲存貯體以及上傳檔案的詳細資訊,請參閱開始使用 Amazon Simple Storage Service。注意
OpsWorks Stacks 也可以從 Amazon S3 儲存貯體部署私有檔案,但為了簡單起見,此範例會使用公有檔案。如需詳細資訊,請參閱應用程式來源。
-
建立 OpsWorks Stacks 應用程式。
返回 OpsWorks Stacks 主控台,在導覽窗格中,選擇應用程式,然後選擇新增應用程式。指定下列設定:
-
Name (名稱) –
NodeDB。此字串為應用程式的顯示名稱。大多數情況下,您需要應用程式的簡短名稱,Stacks OpsWorks 會透過將所有字元轉換為小寫並移除標點符號,從顯示名稱產生該名稱。針對此範例,短名為
nodedb。若要驗證應用程式的短名,在建立應用程式之後,請在 Apps (應用程式) 頁面上選擇應用程式以顯示其詳細資訊頁面。 -
類型 –
Node.js. -
Data source type (資料來源類型) –
RDS。 -
資料庫執行個體 – 選擇您先前註冊的 Amazon RDS 資料庫執行個體。
-
Database name (資料庫名稱) – 指定您先前建立的資料庫名稱,此範例中為
nodeexampledb。 -
Repository type (儲存庫類型) –
Http Archive。您必須將此儲存庫類型用於公有 Amazon S3 檔案。
S3 Archive類型僅用於私有封存。 -
儲存庫 URL – 封存檔案的 Amazon S3 URL。
針對剩餘設定使用預設值,然後按一下 Add App (新增應用程式) 以建立應用程式。
-
-
部署應用程式。
前往 Apps (應用程式) 頁面,然後在 NodeDB 應用程式的 Actions (動作) 資料行中,選擇 deploy (部署)。然後選擇部署,將應用程式部署到伺服器執行個體。 OpsWorks Stacks 會在每個執行個體上執行部署配方,從儲存庫下載應用程式並重新啟動伺服器。當每個執行個體都有綠色的核取記號,並且 Status (狀態) 為 successful (成功) 時,部署便已完成,應用程式已準備好開始處理請求。
注意
如果部署失敗,請選擇日誌欄中的顯示以顯示部署的 Chef 日誌。錯誤資訊位於接近底部的位置。
-
開啟 應用程式。
若要開啟應用程式,請選擇 Layer (Layer),選擇負載平衡器,然後選擇負載平衡器的 DNS 名稱,將 HTTP 請求傳送到負載平衡器。您應該會看到類似下列的內容。
注意
OpsWorks Stacks 會在設定期間自動將應用程式部署到新的執行個體。只需要針對線上執行個體進行手動部署。如需詳細資訊,請參閱部署應用程式。如需部署的一般討論,包含一些更複雜的部署策略,請參閱管理和部署應用程式與技術指南。
後續步驟?
重要
AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
本演練帶領您完成設定簡易 Node.js 應用程式伺服器堆疊的基本操作。以下是有關後續作業的一些建議。
- 檢查 Node.js 的內建技術指南
-
如果您想要詳細了解執行個體的設定方式,請參閱 layer 的內建技術指南 opsworks_nodejs
,其中包含 Stacks OpsWorks 用來安裝和設定軟體的配方和相關檔案,以及內建部署技術指南 ,其中包含 OpsWorks Stacks 用來部署應用程式的配方。 - 自訂伺服器組態
-
範例堆疊相當基本。針對生產用途,您可以會希望自訂堆疊。如需詳細資訊,請參閱自訂 OpsWorks Stacks。
- 新增 SSL 支援
-
您可以為您的應用程式啟用 SSL 支援,並在建立應用程式時為 OpsWorks Stacks 提供適當的憑證。 OpsWorks Stacks 接著會在適當的目錄中安裝憑證。如需詳細資訊,請參閱使用 SSL。
- 新增記憶體內快取
-
生產層級網站通常會透過在記憶體內鍵/值存放區 (例如 Redis 或 Memcache) 中快取資料來改善效能。您可以搭配 Stacks OpsWorks 堆疊使用 。如需詳細資訊,請參閱ElastiCache Redis及Memcached。
- 使用更複雜的部署策略
-
範例使用簡易的應用程式部署策略,將更新同時部署到每個執行個體。這種方法非常簡單且快速,但沒有錯誤的餘地。若部署失敗或更新發生任何問題,每個您生產堆疊中的執行個體都會受到影響,可能中斷或停用您的網站,直到您修正問題為止。如需部署策略的詳細資訊,請參閱管理和部署應用程式與技術指南。
- 擴展 Node.js 應用程式伺服器層
-
您可以透過各種方式延伸 layer。例如,您可以實作配方,以在執行個體上執行指令碼,或實作 Chef 部署勾點以自訂應用程式部署。如需詳細資訊,請參閱擴充 Layer。
- 定義環境變數
-
您可以透過定義關聯應用程式的環境變數,來將資料傳遞給您的應用程式。當您部署應用程式時, OpsWorks Stacks 會匯出這些變數,以便您可以從應用程式存取它們。如需詳細資訊,請參閱使用 環境變數。