我的应用程序在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行一组由 Amazon Elastic Container Service (Amazon ECS) 启动的任务。我的应用程序无法与 Amazon Relational Database Service (Amazon RDS) 数据库通信。
解决方法
验证网络配置
要验证容器实例是否可以与数据库建立连接,对基于 Linux 或基于 Windows 的容器实例完成以下步骤:
对于基于 Linux 的容器实例:
- 创建密钥对凭证,使用 SSH 连接到放置任务的容器实例。
- 要连接您的 RDS 数据库,运行以下命令:
$ telnet test.ab12cde3fg4.us-east-1.rds.amazonaws.com 3306
**注意:**将 test.ab12cde3fg4.us-east-1.rds.amazonaws.com 替换为您的数据库端点。将 3306 替换为您的数据库端口。
输出结果类似于:
> Trying 172.31.122.28 > Connected to test.ab12cde3fg4.us-east-1.rds.amazonaws.com
> Escape character is '^]'.
**重要事项:**Telnet 不会预先安装在经过 Amazon ECS 优化的亚马逊机器映像 (AMI) 上。要安装 Telnet,运行 sudo yum install telnet -y 命令。
对于基于 Windows 的容器实例:
**重要事项:**Telnet 不会预先安装在经过 Amazon ECS 优化的 Windows AMI 上。要安装 Telnet,使用 PowerShell 以管理员身份运行 Install-WindowsFeature -Name Telnet-Client 命令。
- 使用远程桌面协议 (RDP) 连接到放置任务的容器实例。
- 要连接到 RDS 数据库,使用 Windows 命令提示符或 Windows PowerShell 运行以下命令:
$ telnet test.ab12cde3fg4.us-east-1.rds.amazonaws.com 3306
**注意:**将 test.ab12cde3fg4.us-east-1.rds.amazonaws.com 替换为您的数据库端点。将 3306 替换为您的数据库端口。
如果连接已建立,将出现一个空白页面。如果连接未建立,您收到“连接超时”或“连接失败”错误,请完成以下步骤:
- 检查连接的安全组是否允许访问 RDS 数据库。您可以使用 DescribeInstances API 调用,或使用 Amazon EC2 控制台中所选实例 ID 对应的描述选项卡。
注意:在桥接和主机网络模式下,连接到容器实例的安全组管理对数据库的访问。在 awsvpc 网络模式下,由服务或任务启动期间关联的安全组管理访问权限。最佳做法是创建一个允许来自数据库端口的传入流量的安全组。然后,将此安全组连接到数据库和容器实例,或将安全组与基于 awsvpc 的任务相关联。
- 检查与子网关联的网络访问控制列表(网络 ACL)和路由表是否允许访问数据库。有关更多信息,请参阅为什么在安全组和网络 ACL 允许入站流量时我无法连接到服务?
验证数据库连接参数
要验证数据库连接参数,完成以下步骤:
- 在容器定义的环境部分,安全地传递环境变量。要安全地传递环境变量,从 AWS Systems Manager Parameter Store 或 AWS Secrets Manager 引用您的环境变量。有关更多信息,请参阅我如何将密钥或敏感信息安全地传递到 Amazon ECS 任务中的容器?
**注意:**应用程序使用参数(如数据库端点、数据库端口和数据库访问凭证)与数据库建立连接。这些参数通常作为环境变量传递到任务。
- 如果您的任务容器可以与数据库建立连接,但由于连接参数不正确而无法进行身份验证,请重置您的数据库密码。
- 从连接参数中删除所有前导或结尾字符空格。
**注意:**语法错误可能导致容器与 RDS 数据库之间的连接失败。