使用 RDS、ECS 和 Docker 构建 CRUD API Express
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
视频版
在本文中,我们将了解如何将基于 ECR 镜像的 ECS 实例连接到 RDS Postgres 实例。
先决条件
- 您的机器上已安装 Docker
- AWS账户
定义
-
RDS:关系数据库服务。AWS 提供的用于关系数据库(例如 Postgres)的服务。(有关 RDS 和 Postgres 的更多信息,请参阅我之前的文章。)
-
ECR :Elastic Container Registry。直接在 AWS 上存储 Docker 镜像(本质上是Docker Hub的替代方案)。
-
ECS:弹性容器服务。部署并运行基于存储在注册表中的镜像的应用程序(它同时支持 Docker Hub 和 ECR)。
我们今天的行动
- 创建 RDS Postgres 实例
- 测试实例
- 使用 AWS 命令行界面创建 ECR 存储库
- 克隆存储库
- 创建 Docker 镜像
- 根据 ECR 存储库的要求对图像进行相应标记
- 将图像推送到 ECR
- 基于 ECR 存储库创建 ECS,并设置环境变量
- 期末测试
创建 RDS Postgres 实例
打开 AWS 控制台,搜索 RDS:
然后点击“创建数据库”:
让我们创建一个 PostgreSQL 实例。我们将使用 12.5-R1 版本,以便利用 AWS 的免费套餐:
在“设置”中,输入以下值:
- 数据库实例标识符(名称)
- 主用户
- 主密码 + 确认密码(选择一个足够安全的密码)
为确保连接性,您必须保证实例可以从外部访问。在“公共访问”下,选择“是”。如果遇到网络问题,请检查安全组的入站规则。
完成后,点击“创建数据库”。
以下是我们RDS Postgres实例的评测:
测试实例
要测试 RDS 实例是否可访问,我们可以使用psql命令。您也可以使用其他类似命令行的工具pgadmin或本地应用程序进行测试。
在以下命令中,将替换RDS_INSTANCE_IP为您从 RDS 实例摘要中获取的命令:
psql --host RDS_INSTANCE_IP --port 5432 --username postgres
使用命令行界面创建 ECR 存储库
ECR 代表 Elastic Container Registry,它是 AWS 的镜像仓库。您可以把它想象成一个存储和检索 Docker 镜像的地方。
在 AWS 控制台中,ECR在搜索栏中输入并点击Elastic Container Registry:
用户界面如下所示:
这是检查现有代码库的好方法。但要创建一个代码库,我们将使用命令行界面。
使用以下命令获取您的凭据:
aws sts get-caller-identity
然后使用您首选的凭证和区域。将 `<region>` 替换为您选择的区域,并将 `<account_id>` 替换为您的 AWS 账户 ID(您可以使用命令获取)。
aws ecr get-login-password --region <REGION> | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com
让我们通过检查 AWS 控制台来确认存储库是否已创建:
太好了!现在我们来克隆并修改代码库。
克隆仓库
克隆 aws-express-template 仓库:
git clone https://github.com/tinystacks/aws-docker-templates-express.git
现在,在命令行中使用 CD 命令进入该目录:
cd aws-docker-templates-express
然后使用您喜欢的 IDE 打开项目。如果您使用的是 Visual Studio Code,则可以输入:
code .
检查应用程序并创建 Docker 镜像
如果您想在本地测试该项目,可以安装依赖项(可选 - 需要本地安装 npm):
npm i
项目建设:
npm run build
npm run start
在构建镜像之前,让我们检查一下 config 文件夹中名为postgres.ts.
您可以在这里定义一些环境变量来访问您的数据库:
PG_HOST数据库地址。稍后我们将在此处使用 RDS 实例地址。PG_PORT数据库端口。Postgres 的默认端口是 5432。PG_USER数据库的默认用户PG_PASSWORD数据库用户的密码。PG_DATABASE我们要访问的数据库。请注意,名为 `<database_name>` 的数据库postgres是 Postgres 实例的默认数据库。
要使用 Docker 构建镜像,请使用以下命令:
docker build -t crud-express .
这里名称并不重要,因为我们将重新标记本地镜像,以便将其推送到我们即将创建的 ECR 存储库。
将图像标记到 ECR 存储库
要为本地镜像添加标签以便将其推送到 ECR 存储库,您需要复制镜像 URI。例如,您可以从 Amazon 控制台的 ECR 存储库列表中复制它:
docker tag crud-express <AWS_ECR_REPO_URI>
将图像推送至 ECR
只需使用与之前相同的标签,将本地标记的图像推送到您的 ECR 存储库即可:
docker push <AWS_ECR_REPO_URI>
之后,请等待几分钟,直到推送完成。
从 ECR 存储库映像创建 ECS 任务
现在到了有趣的部分。因为我们两者兼备:
- 具有公共访问权限的 RDS Postgres 实例
-
ECR注册表上的图像
-
我们可以根据 ECR 镜像创建一个 ECS 实例,并通过将变量提供
PG_HOST给我们的应用程序,使用 RDS 实例的 URI 将其连接到 RDS 实例。
在 AWS 控制台中,查找 ECS:
让我们使用控制台来配置自定义容器:
选择一个你喜欢的容器名称。使用 ECR URI 作为你的 Docker 镜像:
将端口设置为 80:
现在有一个非常重要的步骤——按如下方式设置环境变量:
- 钥匙 :
PG_HOST - 值:您的 RDS URI,以便 ECS 应用可以连接到 RDS 实例。
接下来,点击“更新”:
在任务定义页面,您可以直接点击“下一步”:
在“定义您的服务”页面,单击“下一步”:
对于集群,您可以为集群选择一个名称,然后单击“下一步”:
然后您只需等待几分钟,让 AWS 创建您的资源:
完成后,点击该任务:
向下滚动并复制公网 IP 地址,以便我们可以使用我们最喜欢的 API 测试工具:
期末测试
为了测试我们的应用程序,我们将使用 Postman。首先,让我们检查一下应用程序是否已启动并运行。向以下端点发送一个 GET 请求AWS_APP_IP:80/ping:
现在我们来向数据库插入几条数据。向以下端点发送一个 PUT 请求,请求体(标题和内容)如下AWS_APP_IP:80/postgresql-item:
我们再做一个:
现在,要获取所有项目,请向以下端点发出 GET 请求AWS_APP_IP:80/postgresql-item:
要获取单个项目,请在 URL 末尾附加项目的 ID,发出相同的请求
(请注意,我们在这里没有正确处理错误 - 这只是为了演示目的):
要更新现有项目,您可以向端点发送 POST 请求AWS_APP_IP:80/posgresql-item/1,指定 id 并传递消息正文:
我们来检查一下这些值是否已更新:
您还可以删除现有项目,方法是向端点发出 DELETE 请求AWS_APP_IP:80/postgresql-item/ID(例如 2):
至此,我们已成功验证了将 ECS 任务连接到 Amazon RDS 数据库!


































