在本模块中,您将使用 Amazon Elastic Container Service (Amazon ECS) 将 EC2 计算实例的托管集群实例化,并将映像部署为在集群上运行的容器。开始构建

架构概览

a.客户端
客户端通过端口 80 向负载均衡器发出请求。

b.负载均衡器
负载均衡器会将请求分发给所有的可用端口。

c.目标组
实例会在应用程序的目标组中注册。

d.容器端口
每个容器运行一个应用程序进程,该进程会在其命名空间内将 node.js 集群父端口绑定到端口 80。

e.使用容器封装 node.js 整体式架构
node.js 集群父端口负责将流量分发给整体式应用程序内的工作线程。虽然此架构已经使用容器进行封装,但仍然是整体式架构,因为每个容器的功能都与其余容器相同。

Amazon Elastic Container Service (Amazon ECS) 是一项高度可扩展、高性能的容器管理服务,支持 Docker 容器,让您能够轻松地在 Amazon EC2 实例的托管集群上运行应用程序。 只需进行简单的 API 调用,您便可以启动和停止支持 Docker 应用程序,查询集群的完整状态,使用各种熟悉的功能,包括安全组、Elastic Load Balancing、EBS 卷和 IAM 角色。

您可以使用 Amazon ECS 根据您的资源需求和可用性要求在您的集群中安排容器的置放。您还可以集成自己的计划程序或第三方计划程序,以满足业务或应用程序的特定要求。

Amazon ECS 无需额外付费。您只需为您创建的用于存储和运行应用程序的 AWS 资源(例如 EC2 实例或 EBS 卷)付费。


请按照下面的分步说明使用 Amazon ECS 部署 node.js 应用程序。 选择各个步骤编号可展开相应部分。

break-the-monolith
  • 步骤 1:使用 AWS CloudFormation 启动 ECS 集群

    创建一个部署在 Application Load Balancer 后面的 Amazon ECS 集群。

    1. 导航至 AWS CloudFormation 控制台
    2. 选择创建堆栈
    3. 选择上传模板文件并从 amazon-ecs-nodejs-microservice/2-containerized/infrastructure/ecs.yml的 GitHub 项目中选择 ecs.yml 文件,然后选择下一步
    4. 输入 BreakTheMonolith-Demo 作为堆栈名称。验证其他参数是否具有下列值:
      1. 所需容量 = 2
      2. 实例类型 = t2.micro
      3. 大小上限 = 2
    5. 选择下一步
    6. 配置堆栈选项页面,保留默认选项,向下滚动并选择下一步
    7. 审查 BreakTheMonolith-Demo 页面上向下滚动到页面底部,选中复选框确认功能声明,并选择创建堆栈

    您将看到状态为 CREATE_IN_PROGRESS 的堆栈。您可以选择屏幕右上角的“刷新”按钮查看进度。此过程通常需要不到 5 分钟的时间。

    创建堆栈

    ⚐ 注意:您也可以选择使用 AWS 命令行界面 (AWS CLI) 部署 AWS CloudFormation 堆栈。从 amazon-ecs-nodejs-microservices/3-microservices 文件夹在终端中运行以下代码,然后将 [region] 替换为您的 AWS 区域。

    $ aws cloudformation deploy \
       --template-file infrastructure/ecs.yml \
       --region [region] \
       --stack-name BreakTheMonolith-Demo \
       --capabilities CAPABILITY_NAMED_IAM
  • 第 2 步:检查您的集群是否正在运行

    Amazon ECS 验证集群
    • BreakTheMonolith-Demo 下选择集群,然后选择任务选项卡以验证没有正在运行的任务。
    Amazon ECS 集群任务
    • 选择 ECS 实例选项卡以验证有两个由 AWS CloudFormation 模板创建的 Amazon EC2 实例。
      ⚐ 注意:如果您收到显示 ECS 代理已过时的消息,请选择了解详情获取更新 ECS 代理的说明。
    Amazon ECS 实例
  • 第 3 步:编写任务定义

    任务定义规定 Amazon ECS 如何在集群间部署应用程序容器。

    • Amazon ECS 左侧导航菜单中选择任务定义
    • 选择创建新任务定义
    • 选择启动类型兼容性页面中,选择 EC2 选项,然后选择下一步
    • 配置任务和容器定义页面上执行以下操作:
      • 任务定义名称字段中输入 api
      • 向下滚动至容器定义并选择添加容器
      • 添加容器窗口中:
        • 未定义的参数可留空白或使用默认设置。
        • 容器名称字段中输入 api
        • 映像字段中输入 [account-ID].dkr.ecr.[region].amazonaws.com/api:v1
          [account-ID] 和 [region]替换为您的具体信息。请确保标签 v1 与您在模块 1 中用于标记的值一致,并推送映像。这是在上一个模块中创建的 ECR 存储库映像的 URL。
        • 内存限制字段,验证硬限制已选中,然后输入 256 作为值。
        • 端口映射下,主机端口 = 0 且容器端口 = 3000
        • 滚动至 ENVIRONMENT,CPU 单元 = 256
    • 选择添加
      返回到配置任务和容器定义页面。
    • 转至页面底部,然后选择创建

    您的任务定义将列在控制台中。

    任务定义
  • 第 4 步:配置 Application Load Balancer:目标组

    Application Load Balancer (ALB) 可让您的服务接受传入流量。ALB 会自动将流量路由到在集群上运行的容器实例(使用容器实例作为目标组)。

    查看您的 VPC 名称:如果您不是第一次使用此 AWS 账户,则可能拥有多个 VPC。请务必使用正确的 VPC 配置您的目标组。

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 找到名为 demo 的负载均衡器。
    • 选中 demo 旁边的复选框以查看该负载均衡器的详细信息。
    • 描述选项卡中,找到 VPC 属性(格式为:vpc-xxxxxxxxxxxxxxxxx)。
      ⚐ 注意:在下一步配置 ALB 目标组时,您需要 VPC 属性。
    VPC 属性

    配置 ALB 目标组

    • 导航到 EC2 控制台的“目标组”部分。
    • 选择创建目标组
    • 配置以下目标组参数(下方未列出的参数,请保持默认值):
      • 对于目标组名称,请输入 api
      • 对于协议,请输入 HTTP
      • 对于端口,请输入 80
      • 请选择与负载均衡器中相匹配的 VPC 值。这很可能不是您的默认 VPC
      • 访问高级运行状况检查设置,并根据需要编辑以下参数: 
        • 对于正常运行阈值,请输入 2
        • 对于运行不正常阈值,请输入 2
        • 对于超时,请输入 5
        • 对于时间间隔,请输入 6
    • 选择创建
    创建目标组
  • 第 5 步:配置 Application Load Balancer:侦听器

    ALB 侦听器会查看指向您的 ALB 的传入连接请求。

    将侦听器添加到 ALB

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 选中 demo 旁边的复选框以查看该负载均衡器的详细信息。
    • 选择侦听器选项卡。
    • 选择添加侦听器并根据需求编辑以下参数:
      • 对于协议:端口,请选择 HTTP,并输入 80
      • 对于默认操作,请选择转发至,然后在目标组字段,输入 api
    • 选择保存
    将侦听器添加到 ALB
  • 第 6 步:以服务的形式部署整体式架构

    以服务的形式将整体式架构部署到集群中。

    • 导航到 Amazon ECS 控制台,然后从左侧菜单栏中选择集群
    • 选中集群 BreakTheMonolith-Demo,选择服务选项卡,然后选择创建
    • 配置服务页面上,编辑以下参数(并保留下面未列出参数的默认值): 
      • 对于启动类型,选择 EC2
      • 对于服务名称,输入 api。 
      • 对于任务数量,输入 1
      • 选择下一步
    • 配置网络页面上的负载均衡部分,选择 Application Load Balancer
      将会出现其他参数:服务 IAM 角色负载均衡器名称
      • 对于服务 IAM 角色,选择 BreakTheMonolith-Demo-ECSServiceRole。
      • 对于负载均衡器名称,验证是否已选中 demo
    • 将容器添加到负载均衡部分,选择添加到负载均衡器
      系统将显示标记为 api:3000 的其他信息。
    • api:3000 部分,进行以下操作:
      • 对于生产侦听器端口,选择 80:HTTP
      • 对于目标组名称,选择您的组:api
      • 选择下一步
    • 设置 Auto Scaling 页面上,保留默认设置并选择下一步
    • 审核页面上,审核设置,然后选择创建服务
    • 在创建了服务后,选择查看服务
    Amazon ECS 服务 API

    做得好! 您现在已拥有正在运行的服务。容器可能要过 1 分钟后才能注册为运行正常,并开始接收流量。

  • 第 7 步:测试您的整体式架构

    通过检查服务能否通过互联网访问并对其执行 ping 操作来验证您的部署。

    要查找您的服务 URL,请执行以下操作:

    • 导航到 EC2 控制台的负载均衡器部分。
    • 选择您的负载均衡器 demo
    • 描述选项卡中,复制 DNS 名称并粘贴到新浏览器选项卡或窗口中。
    • 您应该会看到一条消息:Ready to receive requests(可以接收请求了)。


    查看服务的各个部分:
    node.js 应用程序会根据 URL 将流量路由到每个工作线程。要查看工作线程,只需将工作线程名称 api/[worker-name] 添加到 DNS 名称的末尾即可,如下所示:

    • http://[DNS name]/api/users
    • http://[DNS name]/api/threads
    • http://[DNS name]/api/posts

    您还可以在 URL 的末尾添加记录编号,以细化到特定记录。例如:http://[DNS name]/api/posts/1http://[DNS name]/api/users/2

    用户演示