【问题标题】:Error TypeOrmModule Unable to connect to database with "ETIMEDOUT" or "Handshake inactivity timeout"错误类型OrmModule Unable to connect to database with "ETIMEDOUT" or "Handshake inactivity timeout"
【发布时间】:2021-12-29 21:47:21
【问题描述】:

我有一个 NestJS (v8.2.x) 服务器应用程序,我正在尝试使用 TypeORM (v0.2.41) 连接到 AWS Arura 3.x (MySQL 8.x 协议) 或者mysql (v2.18.1) 或 mysql2 (v2.3.3) 驱动程序。该应用程序正在 GitHub 代码空间中运行。

当关注NestJS TypeORM documentation 时,我收到以下错误:

使用mysql2 驱动程序我得到:

ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
 Error: connect ETIMEDOUT
 ...

使用mysql 驱动程序我得到:

[TypeOrmModule] Error: Handshake inactivity timeout
 ...

创建连接的代码如下:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

const MYSQL_HOST = '....rds.amazonaws.com';
const MYSQL_USERNAME = '...';
const MYSQL_PASSWORD = '...';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: MYSQL_HOST,
      port: 3306,
      username: MYSQL_USERNAME,
      password: MYSQL_PASSWORD,
      database: 'kitchen',
      // entities: [__dirname + '/**/*.entity{.ts,.js}'],
      debug: true,
      logging: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

初步故障排除

首先,我验证了我在服务器应用程序中使用的凭据。我确认他们可以通过TablePlus 正常连接。因此,我排除了“无效凭据”并确定我遇到了另一个问题。

其次,在创建 AWS Arura 数据库时,我选择 YesPublic Access

VPC 外部的 Amazon EC2 实例和设备可以连接到您的数据库。选择一个或多个 VPC 安全组,指定 VPC 内的哪些 EC2 实例和设备可以连接到数据库。

【问题讨论】:

    标签: mysql node.js nestjs typeorm amazon-aurora


    【解决方案1】:

    修复

    TL;DR:虽然我选择了Public Access,但我不得不进一步放宽看起来的“入站”安全规则。因此,使用source: "0.0.0.0/0" 添加另一个“入站规则”解决了我的问题。

    调试

    为什么?可能是因为 GitHub Codespace 的托管位置,source: "76.202.164.21/32" 的默认规则不起作用?不知道...

    我是怎么找到这个的?

    最初,我使用 mysql2 包并得到它的错误(上面列出),没有 StackOverflow 结果。由于mysql2 是基本mysql 包的“替换”,我决定恢复到mysql 以查看它是否有不同的错误。如上所述,我收到了一个稍微不同的错误,导致我进入 StackOverflow 问题Error: Handshake inactivity timeout in Node.js MYSQL module。哪里有 AWS 特定的答案:

    a)mscheker's add an inbound rule

    对于那些在AWS 上部署并遇到此错误的用户,您需要更改您的数据库/集群和add an inbound rule 的安全组,其中source 是您的安全组实例/秒

    b)Berkay Torun's "changing the allowed IP Addresses"

    如果您使用亚马逊的服务,我可以通过更改安全设置中允许的 IP 地址或更改打开的连接端口来解决此问题。

    是我解决问题所遵循的。允许通过source: "0.0.0.0/0" 添加额外的“所有 IPv4 地址”入站规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 2020-12-24
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2015-08-04
      • 2018-07-30
      相关资源
      最近更新 更多