在 AWS Elastic Beanstalk 上部署 Web 应用程序
入门指南
模块 2:使用 AWS CDK 创建基础设施
在本模块中,您将创建一个 CDK 应用程序,该应用程序将建立使用 Elastic Beanstalk 部署 NodeJS Web 应用程序所需的所有基础设施。
简介
在本模块中,您将创建一个 CDK 应用程序,该应用程序将建立使用 AWS Elastic Beanstalk 部署 NodeJS Web 应用程序所需的所有基础设施。
您将学到的内容
- 创建简单的 CDK 应用程序
- 使用 S3 Assets 将程序包上传到 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 Assets:这将帮助您将压缩的应用程序上传到 S3,它将为 CDK 应用程序提供一种获取对象位置的方法。
- Elastic Beanstalk 应用程序:这是Elastic Beanstalk 组件的逻辑集合,包括环境、版本和环境配置。
- Elastic Beanstalk 应用程序版本:它指的是 Web 应用程序的可部署代码的特定标记迭代。应用程序版本指向包含可部署代码的 Amazon Simple Storage Service (Amazon S3) 对象,在此情况下是您将使用 S3 Assets 上传到 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 Assets 模块并获取位于 CDK 应用程序根目录中的 Web 应用程序的 zip 文件,然后将其上传到 S3。当您更新 zip 文件并部署此堆栈时,该文件将在 S3 中更新。
添加 Elastic Beanstalk CDK 依赖项
接下来创建 Elastic Beanstalk 应用程序、应用程序版本和环境,以便您使用 S3 Assets 部署刚刚上传到 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 Assets 和 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,接下来使用该角色和配置文件名称创建实例配置文件。
创建 AWS 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 时可能遇到的一个常见错误是,当您导入库并开始在应用程序中使用它时,“this”一词会突出显示,并且您会看到编译问题。

这可能是因为使用的 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 应用程序中使用这些字符串。