在 AWS Elastic Beanstalk 上部署 Web 應用程式
入門指南
單元 2:使用 AWS CDK 建立基礎設施
在本單元中,您將建立一個 CDK 應用程式,以建立使用 Elastic Beanstalk 部署 NodeJS Web 應用程式所需的所有基礎設施。
簡介
在本單元中,您將建立一個 CDK 應用程式,以建立使用 AWS Elastic Beanstalk 部署 NodeJS Web 應用程式所需的所有基礎設施。
您將學到的內容
- 建立簡單的 CDK 應用程式
- 使用 S3 資產將套件上傳至 S3
- 建立 Elastic Beanstalk CDK 應用程式、應用程式版本和環境
完成時間
15 分鐘
單元先決條件
- 有管理員等級存取權限的 AWS 帳戶**
- 建議的瀏覽器:最新版的 Chrome 或 Firefox
[**]過去 24 小時內建立的帳戶可能尚未有權存取本教學課程所需的服務。
實作
建立 CDK 應用程式
確定您有最新的 CDK 版本。
npm install -g cdk
建立新目錄並前往該處。
mkdir cdk-eb-infra
cd cdk-eb-infra
初始化將用來建立基礎設施的 CDK 應用程式。
cdk init app --language typescript
建立資源堆疊的程式碼
前往檔案 /lib/cdk-eb-infra-stack.ts,您將在此為您要建立的資源堆疊撰寫程式碼。
資源堆疊是一組將佈建至特定帳戶中的雲端基礎設施資源 - 在特定案例中,將全都是 AWS 資源。這些資源佈建所在的帳戶,就是您在先決條件步驟中設定的堆疊。在此資源堆疊中,您將建立下列資源:
- S3 資產:這有助於您將壓縮的應用程式上傳至 S3 中,並且可為 CDK 應用程式提供取得物件位置的方法。
- Elastic Beanstalk 應用程式:這是 Elastic Beanstalk 元件的邏輯集合,其中包含環境、版本和環境組態。
- Elastic Beanstalk 應用程式版本:這是指 Web 應用程式可部署的程式碼特定且具標籤的反覆項目。應用程式版本會指向包含可部署程式碼的 Amazon Simple Storage Service (Amazon S3) 物件,在您的案例中,是您將使用 S3 資產上傳至 S3 的 zip 檔。應用程式可以有許多版本,而每個應用程式版本都是獨特的。
- 執行個體描述檔和角色:這是 AWS Identity and Access Management (IAM) 角色的容器,可在 Amazon EC2 執行個體啟動時用來將角色資訊傳至該執行個體。
- Elastic Beanstalk 環境:這是執行應用程式版本的 AWS 資源集合。每個環境一次只能執行一個應用程式版本。
將應用程式自動上傳至 S3
若要部署 Web 應用程式,您必須將應用程式封裝並上傳至 Amazon Simple Storage Service (S3),讓 Elastic Beanstalk 能夠在環境中部署該應用程式。
我們將在本指南的單元 3 執行應用程式的封裝,而目前我們主要先說明如何將其上傳至 S3。為此,我們將使用名為 S3Assets 的 CDK 建構函數。本單元會將本機檔案和目錄上傳至 S3。
為了在 CDK 應用程式中執行此動作,您必須先安裝 aws-s3-assets 模組。
npm i @aws-cdk/aws-s3-assets
然後,在您的 lib/cdk-eb-infra-stack.ts 檔案中,將相依性新增至檔案的最上方。
import s3assets = require('@aws-cdk/aws-s3-assets');
在堆疊內已註解、且顯示為「定義堆疊的程式碼位於此處」的哪一行底下,新增下列程式碼。
// Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
path: `${__dirname}/../app.zip`,
});
此程式碼會使用 s3 資產模組,取用位於 CDK 應用程式根目錄中的 Web 應用程式 zip 檔,並將其上傳至 S3。每當您更新 zip 檔並部署此堆疊時,該檔案都會在 S3 中更新。
新增 Elastic Beanstalk CDK 相依性
我們將建立 Elastic Beanstalk 應用程式、應用程式版本和環境,讓您能夠部署您剛剛使用 S3 資產上傳至 S3 的 Web 應用程式。
首先,您必須安裝 CDK 的 Elastic Beanstalk 模組。
npm i @aws-cdk/aws-elasticbeanstalk
然後,將相依性新增至 /lib/cdk-eb-infra-stack.ts 檔案的最上方。
import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');
建立 Elastic Beanstalk 應用程式
然後您即可建立 Elastic Beanstalk 應用程式。如前所述,Elastic Beanstalk 應用程式是 Elastic Beanstalk 元件的邏輯集合,例如資料夾。
將此程式碼放在 S3Assets 的程式碼底下。此程式碼會在 Elastic Beanstalk 中建立名為 MyWebApp 的應用程式。
// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
applicationName: appName,
});
建立 Elastic Beanstalk 應用程式版本
現在,您必須從先前建立的 S3 資產來建立應用程式版本。這段程式碼會使用 S3 資產和 CDK 將提供給此方法的 S3 儲存貯體與 S3 物件金鑰,來建立應用程式版本。
// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
applicationName: appName,
sourceBundle: {
s3Bucket: webAppZipArchive.s3BucketName,
s3Key: webAppZipArchive.s3ObjectKey,
},
});
在繼續建立應用程式版本之前,您想要確定 Elastic Beanstalk 應用程式已存在,而此動作可使用 CDK 輕鬆完成。
// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);
建立執行個體描述檔
若要建立 Elastic Beanstalk 環境,您必須提供現有的執行個體描述檔名稱。
執行個體描述檔是 AWS Identity and Access Management (IAM) 角色的容器,可在 Amazon EC2 執行個體啟動時用來將角色資訊傳至該執行個體。
在您的案例中,角色將會連接受管政策 - AWSElasticBeanstalkWebTier。此政策會為應用程式授與將日誌上傳至 Amazon S3 以及將偵錯資訊上傳至 AWS X-Ray 的許可。
您的首要工作是在 CDK 應用程式中安裝 IAM 模組。
npm i @aws-cdk/aws-iam
然後,在我們持續處理的 CDK 堆疊中匯入相依性:
import iam = require('@aws-cdk/aws-iam');
您可以在建立應用程式版本的程式碼後面新增下列程式碼:
// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});
const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);
const myProfileName = `${appName}-InstanceProfile`
const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
instanceProfileName: myProfileName,
roles: [
myRole.roleName
]
});
此程式碼首先會執行的,就是建立新的 IAM 角色 (myRole)。
若要允許您環境中的 EC2 執行個體擔任該角色,執行個體描述檔必須在信任關係政策中將 Amazon EC2 指定為信任的實體。
接著,我們會為該角色新增受管政策 AWSElasticBeanstalkWebTier,然後以該角色和描述檔名稱建立執行個體描述檔。
建立 Elastic Beanstalk 環境
您需要建立的最後一個部分是 Elastic Beanstalk 環境。環境是執行應用程式版本的 AWS 資源集合。針對環境,我們必須提供一些基礎設施資訊。
首先,我們將建立環境。在建立環境時,您必須為其提供顯示於 Elastic Beanstalk 主控台中的名稱 - 在此案例中,我們將環境命名為 MyWebAppEnvironment。
接著,您必須提供應用程式名稱;此名稱可從先前的 Elastic Beanstalk 應用程式定義中取得。
解決方案堆疊名稱是 Elastic Beanstalk 為執行中的 Web 應用程式提供之受管平台的名稱。使用正確的解決方案名稱,Elastic Beanstalk 就會為您的應用程式佈建正確的資源,例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。您應根據用來開發 Web 應用程式的架構和平台,選擇正確的軟體堆疊。在此案例中,您將放入 '64bit Amazon Linux 2 v5.4.4 running Node.js 14' 這段字串。如果您想要知道此字串的出處,可以在本單元的結尾處,參考關於解決方案堆疊名稱的詳細資訊。
選項設定屬性可讓您設定所需的 Elastic Beanstalk 環境:
- IamInstanceProfile:您可以在此處參考先前的步驟所建立的執行個體描述檔。
- MinSize、MaxSize 和 InstanceTypes:這是您執行個體的組態,以及 Elastic Beanstalk 為您產生的自動擴展群組。這些屬於選用參數,若您未加以設定,Elastic Beanstalk 將會根據平台定義選擇執行個體類型,以及自動擴展群組的大小下限和上限。您會加以定義,因此可繼續使用 AWS 免費方案。
關於 Elastic Beanstalk 組態選項的詳細資訊
若要定義前述所有的組態選項,請新增以下幾行程式碼:
// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
{
namespace: 'aws:autoscaling:launchconfiguration',
optionName: 'IamInstanceProfile',
value: myProfileName,
},
{
namespace: 'aws:autoscaling:asg',
optionName: 'MinSize',
value: '1',
},
{
namespace: 'aws:autoscaling:asg',
optionName: 'MaxSize',
value: '1',
},
{
namespace: 'aws:ec2:instances',
optionName: 'InstanceTypes',
value: 't2.micro',
},
];
最後,我們會使用版本標籤。這是一個重要屬性,因為它必須參考我們剛建立的應用程式版本。
這些資訊都齊備後,現在您即可建立 Elastic Beanstalk 環境。
將此程式碼貼在您的堆疊定義檔案中。
// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
environmentName: 'MyWebAppEnvironment',
applicationName: app.applicationName || appName,
solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
optionSettings: optionSettingProperties,
versionLabel: appVersionProps.ref,
});
常見錯誤
使用多個版本的 CDK 程式庫
使用 CDK 時的常見錯誤之一是,當您匯入程式庫並開始在應用程式中加以使用時,「此」這個字會強調顯示,且您可能會遇到編譯問題。

發生此錯誤的原因可能是,您使用的 CDK 模組屬於與 CDK 核心程式庫不同的版本。CDK 經常會更新,因此這是很常見的錯誤。
若要解決此問題,您必須將所有 cdk 套件更新為相同的版本。您可以在 CDK 應用程式的 package.json 檔案中,查看您 CDK 套件的版本。

詳細資訊
關於 Elastic Beanstalk 解決方案堆疊名稱的詳細資訊
在文件中,您可以了解 Elastic Beanstalk 支援的所有平台。此頁面會隨著新平台的新增和舊平台的淘汰持續更新。
如果您想了解如何取得正確的平台名稱 - 例如 64bit Amazon Linux 2 v5.4.4 running Node.js 14,您可以使用 AWS CLI,並取得所有支援平台的清單。
aws elasticbeanstalk list-available-solution-stacks
這會傳回支援平台字串的完整清單,供您在 CDK 應用程式中使用。