【问题标题】:Docker Node app on AWS Lightsail Container Service loosing connection to AWS RDS PostgresAWS Lightsail Container Service 上的 Docker 节点应用程序失去与 AWS RDS Postgres 的连接
【发布时间】:2022-10-24 03:26:01
【问题描述】:

我有一个 node.js 应用程序(快速)在 AWS Lightsail 容器服务上部署的 docker 中运行。它使用 AWS RDS 上的 postgres 数据库(通过 knex)。

这可能是几个相关的问题。

连接通常可以正常工作大约 2 天,然后有时在运行迁移后,lightsail 上的应用程序无法连接到 RDS。

一段时间以来,我仍然可以从 DBeaver、本地运行的非 dockerized 应用程序以及本地运行的应用程序的 dockerized 版本连接到 RDS DB,但过了一段时间,这些连接也停止工作。

那时,无法再访问 RDS DB。

然后我开始做一些事情,比如删除和重新创建 VPC 对等互连(Lightsail VPC - 默认 VPC),删除入站规则并将其重新添加到安全组,创建另一个数据库。基本上我能想到的都有。在某个时候,连接再次开始工作。不幸的是,这一次它仍然无法在 lightsail 上的应用程序中运行,而只能在我的开发机器上运行。

我三重检查的事情:

  • DATABASE_URL,为了调试,我创建了一条打印环境的路由,以确保设置了正确的 DATABASE_URL 连接字符串。相同的字符串适用于来自我的开发机器的连接。
  • AWS RDS 数据库可公开访问
  • AWS RDS DB 的安全组有 Lightsail VPC CIDR 的入站规则,它实际上现在有一个完整的开放规则 ip4 和 ip6
  • 我重新启动了 RDS 数据库
  • 我添加了另一个 RDS 数据库,我也无法从 lightsail 连接到该数据库,而是从我的开发计算机连接

Lightsail Docker 日志中显示的错误是

[23/Oct/2022:16:28:42] Error: connect ECONNREFUSED 127.0.0.1:5432
[23/Oct/2022:16:28:42] at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16)
  • 上面写着127.0.0.1 很奇怪吗?
  • 我用ssl: false
  • 因为该问题通常发生在回滚并重新运行 29 次迁移并为表播种后,我认为这可能是最大连接问题,但这可能只能解释最初的问题,但不能解释为什么我现在可以从我的机器连接但不是来自光帆。
  • 我是否必须配置 docker 以允许端口 5432 上的出站流量?
  • 奇怪的是,当我遇到问题时,我通常无法访问任何 RDS 数据库。
  • 将 lightail 应用程序回滚到以前工作的版本有效,但我不知道如何下载图像以进行进一步检查
  • 关于维护窗口,我不确定是否相关。我的主要问题是即使超过 24 小时后我仍然无法从 Lightsail 连接。我怀疑它在 AWS 网络层或 docker 网络配置中。
  • (我不知道如何使用 AWS Reachablity 分析器,因为我不知道 lightsail 容器应用程序要使用什么)

我可能忽略了什么?

【问题讨论】:

    标签: node.js amazon-web-services docker amazon-rds lightsail-container-service


    【解决方案1】:

    我发现了这个问题。我加载了错误的配置,因为未设置环境变量。

    export function getConfig(processVariables: ProcessVariables): Config {
      const environment: Environment = processVariables.ENV || 'local'
      switch (environment) {
        case 'production':
          return getProductionConfig(processVariables)
        case 'localdocker':
          return getLocalDockerConfig(processVariables)
        case 'local':
          return getLocalConfig(processVariables)
      }
    }
    

    对于localdocker,我确实设置了ENV env var,但不适用于生产。每当我为local 切换数据库连接时,因为我正在对实时数据库运行迁移并在我更改数据库连接之前进行部署,生产工作正常。

    帮助确认问题的是调试 knex 连接字符串。

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2021-09-21
      相关资源
      最近更新 更多