Bob 的二手书:.NET 示例应用程序 — 第 3 部分:基础架构

作者:布拉德·韦伯 | 2023

简介

欢迎阅读 Bob's Used Books 博客文章系列的第三篇也是最后一篇文章。

第一篇文章 中, 我讨论了如何开始使用 Bob 的二手书,并描述了你可以用来测试和运行应用程序的不同调试和部署模式。在 第二篇文章 中, 我讨论了 Bob's Used Books 的架构,并对构建示例应用程序时做出的决策提供了一些见解。在这篇文章中,我将深入探讨配置 亚马逊云科技 资源和部署示例应用程序的 亚马逊云科技 云开发套件 (亚马逊云科技 CDK) 项目。

这篇文章引用了 Bob 的二手书 v1.0.0。 可以在这里找到 Bob 的二手书 v1.0.0 GitHub 存储库。

概述

亚马逊云科技 CDK 是一个 基础设施即代码 (IaC) 框架,它使开发人员能够将 亚马逊云科技 资源和服务表示为应用程序代码。当针对 亚马逊云科技 账户执行该应用程序代码时,该代码中定义的资源和服务将自动配置在 亚马逊云科技 账户中。

IaC 通常与 DevOps 结合使用,作为 CI/CD 管道的一部分,自动配置应用程序环境。iaC 提供以下好处:

  • 通过提交 iaC 脚本进行源代码管理可以对应用程序环境进行版本控制
  • 可以自动创建和删除环境,从而降低人为错误的风险
  • 可以按需创建和删除环境,从而实现灵活的软件开发工作流程和更好的成本控制

合成 亚马逊云科技 CDK 项目时,它会生成一个 A WS CloudFormation 模板,然后将其传递给 CloudFormation 服务进行处理。尽管开发人员可以直接创建 CloudFormation 脚本,但 亚马逊云科技 CDK 提供了 更高级别的结构,这些结构通常 使开发人员能够以更少的精力实现相同的结果

Bob 的二手书使用 亚马逊云科技 CDK 来预置许多 亚马逊云科技 资源和服务,包括:

  • 用于托管应用程序及其组件的 亚马逊虚拟私有云 (Amazon VPC)
  • 用于 存储书籍封面图片的 亚马逊 Simple Storage Service (Amazon S3) 存储桶
  • 一种用于低延迟交付应用程序资产的 Amazon CloudFront 发行版
  • A mazon Cognito 用户池和客户身份和访问管理 (CIAM) 的管理员用户
  • 适用于应用程序后端的适用 于 SQL Server 的 亚马逊关系数据库服务 (亚马逊 RDS)
  • 将应用程序部署到 亚马逊云科技 时用作网络服务器的 亚马逊弹性云计算 (Amazon EC2) 实例
  • 许多 A mazon 身份和访问管理 (IAM) 角色、策略和权限,使应用程序的组件能够相互通信。

如您所见,Bob 的二手书利用了众多 亚马逊云科技 服务。这对于在云中运行的应用程序非常常见。此外,现在几乎所有的应用程序除了生产环境外,还有多个非生产环境,例如测试和UAT。使用像 亚马逊云科技 CDK 这样的 IaC 框架可以保证快速、一致地配置每个环境。

考虑到所有这些,让我们来看看 Bob 的二手书是如何使用 亚马逊云科技 CDK 的。

CDK 堆栈

如概述中所述,在云中运行的应用程序通常依赖于多种服务和资源。亚马逊云科技 CDK 可以轻松地将这些服务和资源组合成 栈。堆栈是一组可以作为单个单元进行管理的服务和资源。部署堆栈时,将部署该堆栈中定义的所有资源;删除堆栈时,该堆栈中的所有资源都将被删除。

对于小型应用程序,维护一个包含该应用程序所有资源的单一堆栈可能是有意义的。但是,随着应用程序发展到包含更多服务和资源,维护整体堆栈可能会变得困难。此时,将该单块堆栈拆分成多个堆栈是有意义的。

Bob 的二手书分为四个堆栈:

  • CoreStack — 定义亚马逊 S3 存储桶、亚马逊 Cognito 用户池和 CloudFront 分配
  • NetworkStack — 定义亚马逊 VPC 和相关资源
  • DatabaseStack — 定义适用于 SQL Server 的亚马逊 RDS 数据库
  • ec2ComputeStack — 定义一个充当 Web 服务器的亚马逊 EC2 实例,并将应用程序部署到该 Web 服务器

将 Bob 的二手书的资源整理成堆栈可以更好地控制资源部署。当您处于集成调试模式时(有关集成调试的详细信息,请参阅本系列 的第一篇文章 ),您只需要部署 Amazon S3 存储桶、Amazon CloudFront 发行版和 Amazon Cognito 用户池。该应用程序仍在您的开发环境中本地运行,不需要网络资源、数据库或 Web 服务器。您可以使用以下命令部署 CoreStack 来部署集成调试所需的资源:

cdk 部署 bobsBooksToreCore

当你想模拟生产环境时,你需要部署所有的堆栈。你可以使用以下命令来做到这一点:

cdk 部署 bobsBookstoreEC2

但是等等,这不只是配置 Web 服务器并部署应用程序吗?那网络资源和数据库呢?Bob's Used Books 中的 亚马逊云科技 CDK 项目利用了 亚马逊云科技 CDK 框架的一项名为 堆栈引用的功能。 EC2ComputeStack 堆栈引用了其他堆栈中定义的资源。当您部署 EC2ComputeStack 时,亚马逊云科技 CDK 会识别这些依赖关系并确保它们也得到部署。让我们仔细看看 Bob's 二手书如何使用跨堆栈引用来管理资源。

跨栈引用

由 Bob's 二手书定义的四个堆栈在 Bookstore.cdk/Program.cs 的主方法中进行了实例化。 当 ec2ComputeStack 被初始化时,它会被传递一个 ec2ComputeStackProps 的实例:

var ec2Stack = new EC2ComputeStack(app, $"{Constants.AppName}EC2", new EC2ComputeStackProps 
{ 
    Env = env, 
    Vpc = networkStack.Vpc, 
    Database = databaseStack.Database, 
    ImageBucket = coreStack.ImageBucket,
    WebAppUserPool = coreStack.WebAppUserPool
});

ec2ComputestackProps 实现了 istackProps 接口,并使用在 NetworkStack、DatabaseStack 和 CoreStack 中创建的资源填充。例如,ec2ComputeStack 将亚马逊 EC2 实例部署到 NetworkStack 创建的 VPC 中。它使用在 CoreStack 中创建的 Amazon Cognito 用户池为网络服务器生成用户池客户端应用程序,并使用 Amazon S3 存储桶和 RDS for SQL Server 数据库为网络服务器生成相应的访问权限。当你运行 cdk deploy bobsBookStoreEC2 时,亚马逊云科技 CDK 会识别 ec2ComputeStack 依赖于在 NetworkStack 中创建的 VPC、在 DatabaseStack 中创建的数据库以及在 CoreStack 中创建的存储桶和用户池,并确保先对其进行配置。

应用程序部署

除了为解决方案定义计算资源外,EC2ComputeStack 还将应用程序部署到 Web 服务器。

注意:应用程序部署通常由 CI/CD 管道而不是像 亚马逊云科技 CDK 这样的 IaC 框架来促进,但是我们希望为.NET 开发社区提供简单、独立的开发体验,并通过 CDK 部署应用程序实现了这一目标。

Bookstore.Cdk 项目有一个名为 EC2Artifacts 的文件夹,其中包含以下文件:

  • bobsbookstore.conf — 一个 Apache 配置文件,用于定义 Bob's 二手书的虚拟主机。
  • bobsbookstore.service — 一项通过 dotnet CLI 启动应用程序的 Linux 服务。
  • ssl.conf — 用作自签名证书配置一部分的配置文件。
  • configure_ec2_web_app.sh — 配置托管 Bob 二手书的 EC2 实例的 bash 脚本。

EC2ComputeStack 将这些文件以及应用程序发布时生成的应用程序输出上传到 S3 存储桶(这与 CoreStack 中定义的存储桶不同)。 这是通过使用在 Amazon.cdk.s3.Assets 命名空间中定义的资产类别来实现的,并通过 uploadAssestStoS3 方法实现。

配置 EC2 实例后,将创建一个 UserDat a 脚本,该 脚本将文件从 S3 存储桶复制到 EC2 实例并执行 configure_ec2_web_app.sh 来配置 EC2 实例。configure_ec2_web_app.sh 安装最新更新,安装和配置 Apache,解压缩 Bob 的二手书并将其复制到 var/www/bobsbookstore,然后启动 bobsbookstore.service。所有这些步骤都是在 EC2ComputeStack 的 con figureUserData 方法中执行的。

清理

如果您已经部署了 Bob 的二手书中包含的任何 CDK 堆栈,则可以通过打开命令行提示符、导航到应用程序解决方案文件夹并运行以下命令来删除创建的 亚马逊云科技 服务和资源:

cdk 摧毁 bobsBookstore*

这是确保您不会产生不必要费用的重要步骤。

结论

Bob 的二手书利用适用于.NET 的 亚马逊云科技 开发工具包来定义和预置所需的 亚马逊云科技 资源。适用于.NET 的 亚马逊云科技 CDK 是一个强大的基础设施即代码框架,它使.NET 开发人员能够使用他们熟悉且富有成效的编程语言来表示他们的 亚马逊云科技 基础设施。

这是 Bob's 二手书入门系列的最后一篇文章。本系列 的第一篇文章 描述了如何启动和运行应用程序以及可用的不同调试和部署模式。该系列的 第二篇文章 深入探讨了 Bob's Used Books 的架构,并深入了解了我们在设计和构建应用程序时的思维过程。

但是,这并不是你最后一次听说鲍勃的二手书!相反,我们计划使用 Bob 的二手书来演示常见的.NET 现代化场景,演示与其他 亚马逊云科技 服务的集成,并包含在即将到来的培训和支持内容中。

你可以 从我们的 GitHub 存储库 下载 Bob 的二手书

Brad Webber

布拉德·韦伯·

布拉德是亚马逊网络服务(亚马逊云科技)的高级微软解决方案架构师。他在 Visual Basic 6 还存在的时候就开始编写代码。如今,他花了大部分时间帮助组织实现.NET 工作负载的现代化并将其迁移到云端。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。