在 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”一词会突出显示,并且您会看到编译问题。

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 的所有必要资源以自动部署应用程序。在下一个模块中,您将学习如何将其部署到云以及如何在发生更改时更新您的应用程序。

下一步:部署应用程序

请就我们的表现提供反馈。

感谢您的反馈
很高兴此页面对您有所帮助。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭
感谢您的反馈
很抱歉,此页面未能帮到您。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭