在 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 時的常見錯誤之一是,當您匯入程式庫並開始在應用程式中加以使用時,「此」這個字會強調顯示,且您可能會遇到編譯問題。

gsg_build_elb_1

發生此錯誤的原因可能是,您使用的 CDK 模組屬於與 CDK 核心程式庫不同的版本。CDK 經常會更新,因此這是很常見的錯誤。

若要解決此問題,您必須將所有 cdk 套件更新為相同的版本。您可以在 CDK 應用程式的 package.json 檔案中,查看您 CDK 套件的版本。

gsg_build_elb_2

詳細資訊

關於 Elastic Beanstalk 解決方案堆疊名稱的詳細資訊

文件中,您可以了解 Elastic Beanstalk 支援的所有平台。此頁面會隨著新平台的新增和舊平台的淘汰持續更新。

如果您想了解如何取得正確的平台名稱 - 例如 64bit Amazon Linux 2 v5.4.4 running Node.js 14,您可以使用 AWS CLI,並取得所有支援平台的清單

aws elasticbeanstalk list-available-solution-stacks

這會傳回支援平台字串的完整清單,供您在 CDK 應用程式中使用。

結論

在本單元中,您已了解如何建立自動部署應用程式所需的所有 Elastic Beanstalk 資源。在下一個單元中,您將了解如何將其部署至雲端,以及在有所變更時如何更新您的應用程式。

下一步:部署應用程式

讓我們知道我們表現如何。

感謝您的意見回饋
我們很高興此頁面對您有所幫助。您願意分享更多詳細資訊以協助我們繼續改進嗎?
關閉
感謝您的意見回饋
很抱歉此頁面沒有幫助到您。您願意分享更多詳細資訊以協助我們繼續改進嗎?
關閉