本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立您的第一個 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 堆疊,以及如何部署簡易應用程式。堆疊包含下列元件:
-
具有兩個實例的 Node.js 應用程序服務器層
-
E lastic Load Balancing 負載平衡器,可將流量分配到應用程式伺服器執行個
-
提供後端資料庫的 Amazon Relational Database Service 服務 (Amazon RDS) 服務層
必要條件
本演練的假設如下:
-
您擁有 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
若要實作應用程式,請在您工作站上方便的位置建立名為 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
的檔案,其中包含以下內容。
重要
使用 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/
中。但是,AWS OpsWorks Stacks 會將app_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 頁面上顯示清單。在此範例中,有五個資料
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 會使用標準設定覆寫內建安全群組的組態,因此您所做的任何變更都會在下次建立堆疊時遺失。
建立資料庫伺服器和負載平衡器
此範例使用 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 (配置儲存體):
5
GB -
DB Instance Identifier (資料庫執行個體識別符):
nodeexample
-
Master Username (主要使用者名稱):
opsworksuser
-
Master Password (主要密碼):您選擇的密碼
記錄執行個體識別符、使用者名稱、密碼以供稍後使用,接受其他選項的預設設定,然後選擇 Next (下一步)。
-
-
設定進階設定。
在 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 使用者指南》。
建立負載平衡器
-
開啟 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器
選擇下一步。在 Configure Security Settings (設定安全設定) 頁面上,選擇 Next (下一步)。您在此範例中不需要使用安全接聽程式。
-
-
設定運作狀態檢查。
在 Configure Health Check (設定運作狀態檢查) 頁面上,將 Ping Path (Ping 路徑) 設為
/
,並接受其他設定的預設值。選擇下一步。在 Add EC2 Instances (新增 EC2 執行個體) 頁面上,選擇 Next (下一步)。在「新增標籤」頁面上,選擇「檢閱並建立」。 AWS OpsWorksStacks 會處理將 EC2 執行個體新增至負載平衡器的工作,而且此範例不需要標籤。 -
建立負載平衡器。
在 Review (頁面) 上,選擇 Create (建立) 以建立負載平衡器。
建立堆疊
您現在已具備所有需要用來建立堆疊的元件。
建立堆疊
-
登入 AWS OpsWorks Stacks 主控台。
登入 AWS OpsWorks Stacks 主控台
,然後選擇 Add Stack (新增堆疊)。 -
建立堆疊。
若要建立新的堆疊,請選擇 Chef 11 stack (Chef 11 堆疊),然後指定下列設定。
-
–
NodeStack
-
地區 — 美國西部 (奧勒岡)
您可以在任何 AWS 區域建立堆疊,但建議使用美國西部 (奧勒岡) 教學課程。
選擇 Add Stack (新增堆疊)。如需堆疊組態設定的詳細資訊,請參閱建立新的堆疊。
-
-
新增含有連接負載平衡器的 Node.js 應用程式伺服器層。
在NodeStack頁面上,選擇「新增圖層」,然後指定下列設定:
-
圖層類型 — Node.js 應用程式伺服器
-
Elastic Load Balancer-節點 L B
接受其他設定的預設值,然後選擇 Add Layer (新增 Layer)。
-
-
將執行個體新增至 layer 並啟動。
在導覽窗格中選擇 Instances (執行個體),然後新增兩個執行個體至 Rails 應用程式伺服器 layer,如下所示。
-
在 Node.js 應用程式伺服器下,選擇 [新增執行個
將 Size (大小) 設為 t2.micro,接受其他設定的預設值,然後選擇 Add Instance (新增執行個體)。
-
選擇 +Instance (+執行個體),然後新增第二個 t2.micro 執行個體至位於不同子網路中的 layer。
這會將執行個體置放在不同的可用區域 (AZ) 中。
-
選擇 Add instance (新增執行個體)。
-
若要啟動兩個執行個體,請選擇 Start All Instances (啟動所有執行個體)。
您已將 Elastic Load Balancing 負載平衡器指派給此層。當執行個體進入或離開線上狀態時,AWS OpsWorks Stacks 會自動向負載平衡器註冊或取消註冊執行個體。
注意
針對生產堆疊,我們建議您將您的應用程式伺服器執行個體分散到多個 AZ 中。若使用者無法連線到其中一個 AZ,負載平衡器會將傳入流量路由至剩餘區域中的執行個體,讓您的網站可繼續運作。
-
-
向堆疊註冊 RDS 資料庫執行個體。
在導覽窗格中選擇 Resources (資源) 並向堆疊註冊 RDS 資料庫執行個體,如下所示。
-
選擇 RDS 標籤,然後選擇 Show Unregistered RDS DB (顯示未註冊的 RDS 資料庫) 執行個體。
-
選擇 nodeexampledb 執行個體,然後指定下列設定:
-
使用者 — 您在建立實例時指定的主要使用者名稱;例如。
opsworksuser
。 -
密碼 — 您在建立執行個體時指定的主要密碼。
-
-
選擇向堆疊註冊,將 RDS 資料庫執行個體新增到堆疊做為 Amazon RDS 服務層。
警告
AWS OpsWorks Stacks 不會驗證 User (使用者) 或 Password (密碼) 的值,而會直接將其傳遞給應用程式。若您輸入不正確,您的應用程式將無法連線至資料庫。
若要將 RDS 資料庫執行個體新增至堆疊做為 Amazon RDS 服務層,請選擇向堆疊註冊。
-
部署應用程式
您必須將應用程式存放在遠端儲存庫中。當您部署它時,AWS OpsWorks Stacks 會將程式碼和相關檔案從儲存庫部署到應用程式伺服器執行個體。為了方便起見,此範例使用公用 Amazon Simple Storage Service (Amazon S3) 存檔做為儲存庫,但您也可以使用其他多種存放庫類型,包括 Git 和 Subversion。如需詳細資訊,請參閱 應用程式來源。
部署應用程式
-
將應用程式封裝在封存檔中。
建立
.zip
目錄和子目錄的nodedb
封存,命名為 nodedb.zip。您也可以使用其他類型的封存檔,包括 gzip、bzip2 和 tarball。請注意,AWS OpsWorks Stacks 不支援未壓縮的 tarball。如需詳細資訊,請參閱 應用程式來源。 -
將存檔檔案上傳到 Amazon S3。
上傳
nodedb.zip
到 Amazon S3 儲存貯體、將檔案設為公開,然後複製檔案的 URL 以供日後使用。如需如何建立儲存貯體以及上傳檔案的詳細資訊,請參閱開始使用 Amazon Simple Storage Service。注意
AWS OpsWorks堆疊也可以從 Amazon S3 儲存貯體部署私有檔案,但為了簡單起見,此範例使用公用檔案。如需詳細資訊,請參閱 應用程式來源。
-
建立 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 (新增應用程式) 以建立應用程式。
-
-
部署應用程式。
前往 Apps (應用程式) 頁面,然後在 NodeDB 應用程式的 Actions (動作) 資料行中,選擇 deploy (部署)。然後選擇「部署」,將應用程式部署到伺服器執行個體。 AWS OpsWorks堆疊會在每個執行個體上執行 Deploy 方法,從儲存庫下載應用程式並重新啟動伺服器。當每個執行個體都有綠色的核取記號,並且 Status (狀態) 為 successful (成功) 時,部署便已完成,應用程式已準備好開始處理請求。
注意
如果部署失敗,請選擇「記錄」欄中的「顯示」以顯示部署的 Chef 記錄。錯誤資訊位於接近底部的位置。
-
開啟 應用程式。
若要開啟應用程式,請選擇 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 Redis 及 Memcached。
- 使用更複雜的部署策略
-
範例使用簡易的應用程式部署策略,將更新同時部署到每個執行個體。這種方法非常簡單且快速,但沒有錯誤的餘地。若部署失敗或更新發生任何問題,每個您生產堆疊中的執行個體都會受到影響,可能中斷或停用您的網站,直到您修正問題為止。如需部署策略的詳細資訊,請參閱管理和部署應用程式與技術指南。
- 擴充 Node.js 應用程式伺服器層
-
您可以透過各種方式延伸 layer。例如,您可以實作配方,以在執行個體上執行指令碼,或實作 Chef 部署勾點以自訂應用程式部署。如需詳細資訊,請參閱 擴充 Layer。
- 定義環境變數
-
您可以透過定義關聯應用程式的環境變數,來將資料傳遞給您的應用程式。當您部署應用程式時,AWS OpsWorks Stacks 會匯出那些變數,讓您可以從您的應用程式存取他們。如需詳細資訊,請參閱 使用 環境變數。