使用动态端口映射将节点应用程序部署到AWS ECS

注意:此操作需要几个先决条件。

  1. AWS CLI将您的docker应用程序推送到AWS存储库。安装它并使用。设置您的凭据 aws configure 命令。
  2. 用于构建应用程序映像的Docker Community Edition。
  3. 我已经使用过Node了 nodenpm 是必需的,但您可以使用您选择的任何后端,如Python或Go,并相应地构建您的Docker镜像。

我个人喜欢Docker。这是将应用程序部署到生产环境的一种很好的方式。最好的部分是您可以在本地计算机上的相同环境中测试您的生产应用程序

这张照片总结了一切:)

今天,我将向您展示如何通过AWS ECS(弹性容器服务)部署捆绑在Docker镜像中的Node应用程序。

注意:我建议您在当前正在生产或工作环境中使用的付费AWS账户上尝试此操作。但是如果你是一个免费套餐,请在你去的时候阅读本教程,因为创建这些服务会花费你的钱

现在我已经警告过你了,让我们登录AWS控制台并选择ECS。

这将带您进入以下页面。观看介绍性视频,真棒

我们现在对右边的列表感兴趣。首先,我们需要创建一个存储库。 AWS中的存储库类似于Docker Hub中的存储库,其中我们有各种类型的图像,如MongoDB,Node,Python等及其特定版本。但在这里,我们将构建Node应用程序的自定义Docker镜像。

点击 Repositories 它将带您进入ECR(弹性容器注册表页面),您可以在其中存储所有自定义Docker镜像。

点击 Create repository 在右上方,您将获得此页面。

在输入中,添加您选择的名称,然后单击 Create repository。现在您拥有自己的存储库,并且可以将包含应用程序的Docker镜像推送到此存储库。我创建了一个存储库并命名它 node-simple

请注意 URI 领域。这是一个重要的领域,当我们将Docker镜像从本地机器推送到ECR时,我们将需要它。

单击存储库,它将转到图像列表。在这里,您可以查看我们即将推送到Docker的应用图片。

现在让我们继续创建我们的简单Node应用程序。

创建一个新文件夹,在终端中打开该文件夹,然后运行 npm init -y 创造一个 package.json 文件。然后创建一个名为的文件 index.js 并添加以下内容。

const express = require('express')  const PORT = process.env.PORT || 3000  const app = express()  app.get('/', (request, response) => {   return response.json({     data: {       message: `API is functional`,     },   }) })  app.listen(PORT, () => console.log(`App running on port ${PORT}`)) 

我们用一个简单的快递服务器 / 返回一些json的GET路由。

现在跑 npm i express 安装 express 包。

最后,添加一个 start 脚本在 scripts 你的领域 package.json 文件。

"scripts": {   "start": "node index.js" } 

现在,跑 npm start 如果您未在环境中指定PORT,则在终端中查看在http:// localhost:3000 /上运行的应用程序。您将看到json消息 API is functional 在浏览器中返回。

让我们继续创建我们的 Dockerfile。这对于构建我们的形象并将其推向ECR至关重要。在我们的文件夹中创建一个名为Dockerfile的文件,并添加以下内容。

FROM mhart/alpine-node:10.16.3  WORKDIR /app  COPY package*.json ./  RUN npm ci  COPY index.js .  CMD ("npm", "start") 

我们使用alpine-node来获得更小的图像尺寸。将我们的工作目录设置为 /app 在Docker镜像中,我们正在复制我们的 package.json 以及 package-lock.json 确定性构建的文件。然后我们运行 npm ci 命令以确保安装相同的软件包版本,就像我们的lockfile一样。我们然后复制 index.js 将文件添加到我们的图像中,最后,我们将start命令添加为要在我们的图像中运行的主命令。

返回AWS控制台,然后单击您创建的存储库。您会在右侧找到一个名为的按钮 View push commands

单击该按钮,您将获得要在计算机上运行的命令列表,以便以下列方式将映像推送到AWS ECR。

复制命令并在节点应用程序文件夹中逐个运行它们。我在 us-west-2 区域,但你可以使用支持ECS的任何区域(其中大部分都是btw)。

这些命令在按顺序运行时

  1. 使用您提供的凭据登录AWS服务。
  2. 将您的应用程序构建为Docker镜像。
  3. 根据您创建的存储库标记您的应用。
  4. 将图像推送到存储库。

成功完成上述步骤后,您将能够在此存储库中看到Docker镜像。

这是在创建你的形象。现在让我们继续为我们的应用程序创建一个集群。

选择 Clusters 在Amazon ECS下,您将被重定向到群集列表,我们现在没有任何群集。我们点击吧 Create Cluster 按钮然后选择 EC2 Linux + Networking 模板并单击 Next step

在本节中,为您的群集命名并在 Instance Configuration 部分,选择以下值。

注意:如果要将SSH连接到实例,则需要选择密钥对。它对于调试目的很有用。

保留其他选项,它将创建一个 VPC 为您和您的EC2实例分配IAM角色,以便ECS可以连接到您的实例并运行您的docker镜像。

你会看到这样的东西。我已经命名了我的集群 node-simple

完成后,单击 View cluster 它将带您进入您的创建集群页面,它的状态将显示为活动状态。

你可以去 EC2 从您的AWS服务中,您将能够看到这两个 t2.micro 实例已创建。您也可以使用这些实例的公共IP连接到它们。

回到ECS,在左边,你会看到一些叫做的东西 Task Definitions。单击该按钮,您将进入可以为群集创建任务定义的页面。

简单来说,任务定义是ECS集群与驻留在ECR中的Docker映像之间的连接。目前我们没有任何任务定义,所以让我们创建一个。

点击 Create new Task Definition 你会得到两个选择, FargateEC2。选择 EC2 然后继续下一步。

输入任务定义的名称,将所有内容保留为默认值,直到您转到此部分。

本节帮助您指定Docker镜像所需的所有必要值。点击 Add Container 你会看到这样的东西。

给你的容器和名称命名 Image 字段,复制 URI 您已推送到ECR并将其粘贴到此处的Docker镜像。

在端口映射字段中,添加80作为 Container port 和0作为 Host port。现在你一定在想我们为什么传递0作为主机端口?

这是因为我们需要EC2实例将动态端口映射到Docker容器的PORT 80,以便可以在同一个EC2实例上运行多个容器。 0表示来自的任何随机端口 3276865535 将被分配给EC2实例。这些也被称为短暂的港口。

此外,我们为Docker容器指定了PORT 80,因此我们必须告诉我们的Node服务器以某种方式运行80。我们怎么能实现这一点……你是对的,使用环境变量

滚动下面,你会发现 Environnment 部分。以下列方式添加环境变量。

Node将使用。读取此PORT process.env.PORT 我们在代码中指定的变量。

保持原样,然后单击 Add。您将看到您的容器与您传递的ECR图像URI一起添加。保留其余字段,然后单击 Create。您将被重定向到任务定义页面,您将看到任务定义及其版本以及我们在上一节中提供的所有选项。

现在让我们添加一个负载均衡器,它将平衡两个EC2实例之间的流量。

转到EC2服务并选择 Load Balancers 从左下方 LOAD BALANCING。它将带您进入负载Balancer列表。现在,我们没有。所以让我们创建一个。

点击 Create Load Balancer 您将获得选择负载均衡器类型的选项。选择 Application Load Balancer (ALB)因为它非常先进并且支持EC2实例中端口的动态映射。

点击后 Create 您将看到负载Balancer配置。给你的ALB一个名字,并保留除VPC之外的所有内容。选择ECS群集为您创建的VPC而不是默认值,否则ALB将无法正常工作。检查所有可用区域,因为我们的实例将在所有高可用性实例中分离出来。

点击 Next。您将收到警告,我们正在使用不安全的侦听器,即PORT 80.在生产中,使用SSL证书并将ALB配置为也可以侦听443(HTTPS)。现在,让我们忽略此警告并单击 Next

在这里,你必须配置一个 Security Group (SG)为你的ALB。让我们创建一个新的SG并向全世界打开HTTP端口80,因为用户将使用ALB路由访问我们的Node API。为我们的ALB添加HTTP规则。

点击 Next。这是一个重要的部分。在这里,我们需要创建一个目标组来指定运行状况检查路由,以及ALB将路由流量路由到我们的EC2实例的PORT。

保持原样并单击 Next。你将被带到 Register Targets 页面注册我们的实例 Target Group 我们在上一页创建。

不要在这里注册任何目标,因为这将在我们创建服务的最后一步自动完成。

点击 Next,查看已添加的参数,然后单击 Create。这将创建负载均衡器并为其提供一个DNS,我们可以从中调用我们的Node API。

接下来,我们需要EC2实例与ALB通信,以便它可以执行运行状况检查并将流量路由到我们的EC2实例。为此,我们需要在EC2安全组中添加规则。

点击 Security Groups 在左侧菜单下 NETWORK & SECURITY。你会发现两个安全组。一个用于EC2实例,一个用于Load Balancer。单击由我们的集群创建的EC2安全组。

菜单将在下面打开。选择 Inbound 选项卡并单击 Edit。这将打开一个用于编辑安全规则的对话框。我们将删除该规则并添加我们自己的规则。选择 Custom TCP rule 从下拉列表和端口范围添加 32768-65535 作为我们的港口范围。在源中,键入 sg 您将获得现有安全组的下拉列表。选择负载均衡器SG并添加您选择的描述。

规则看起来像这样。

注意:如果要SSH连接到EC2实例,还要添加SSH端口22规则。

点击 Save。这样就完成了Load Balancer的设置,并将我们带入了最后的部分。创建服务。

返回ECS,选择您的群集,您将看到第一个打开的选项卡是服务选项卡。点击 Create

选择 EC2 作为启动类型并为您的服务命名。您会注意到自动选择了任务定义。设置 Number of Tasks 这将在我们的每个EC2实例中启动我们的Node应用程序映像的两个实例。保留其余的值,然后单击 Next step

这一步是我们配置负载均衡器的地方。选择 Application Load Balancer 就像我们创造的类型一样。您会注意到我们的LB会自动选中 Load Balancer Name。在此之下,您将找到要进行负载平衡的容器。

您将看到我们的容器名称和端口映射已被选中。点击 Add to load balancer。将开设一个新的部分。

在里面 Production listener port,从下拉列表中选择80:HTTP。并在 Target group name,选择我们在创建负载均衡器时创建的目标组。

选择此选项后,它将在创建ALB时加载我们在目标组中添加的所有值。

在最后一节中,取消选中 Enable service discovery integration 因为它不需要。点击 Next step

您将进入自动缩放配置。现在不要自动缩放,在完成此操作后让它作为实验给你:)

点击 Next step 并且您将被带到审核您的服务,该服务将在EC2实例上旋转您的节点应用程序映像。

最后,点击 Create Service。这将创建您的服务并运行我们创建的任务定义。完成后,单击 View Servie。您将看到处于PENDING状态的两个任务定义。

刷新一段时间后,状态将变为RUNNING。点击 Events 标签。您将获得将任务添加到EC2实例的服务日志。

一旦你得到这样的东西,服务已达到准备状态,你就好了

检查 Target Groups 在EC2服务的LOAD BALANCING部分。您将看到我们创建的服务已在ALB目标组中自动注册了两个目标,并且它们是健康的。

检查端口,它们是随机分配的,这就是我们的动态端口映射

最后但并非最不重要,复制 DNS name 您的ALB并将其粘贴到浏览器中,您将看到您的节点应用程序正在运行,您将获得 API is functional 信息。好极了

这就是我们如何通过AWS ECS将我们的应用程序部署为Docker镜像。

谢谢你的阅读。

资讯来源:由0x资讯编译自DEV,原文:https://dev.to/ryands17/deploy-a-node-app-to-aws-ecs-with-dynamic-port-mapping-38gd ,版权归作者所有,未经许可,不得转载
你可能还喜欢