You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ECS中Django容器连接AWS RDS数据库时遭遇访问拒绝错误

解决ECS Django容器连接RDS MySQL的1045访问拒绝错误

针对你遇到的MySQLdb.OperationalError: (1045, "Access denied for user 'myuser'@'[ECS Task IP]' (using password: YES)")错误,以下是关键排查和修复方向:

1. 检查RDS安全组入站规则

确保RDS的安全组允许ECS任务所在网络访问3306端口:

  • 登录AWS控制台,进入RDS实例的安全组配置页
  • 添加入站规则:协议选TCP,端口3306,源设置为ECS任务所在的安全组(不要用单个IP,ECS任务IP会动态变化)
  • 若ECS和RDS不在同一VPC,需确认VPC peering或路由配置正常

2. 验证MySQL用户的主机权限

MySQL权限绑定用户名+主机地址,主机不匹配即使密码正确也会被拒绝:

  • 通过RDS查询编辑器或本地客户端连接数据库,执行SQL查看用户权限:
    SELECT user, host FROM mysql.user WHERE user = 'myuser';
    
  • 若结果中的host不是%(允许任意主机)或ECS任务所在IP段,更新用户权限:
    -- 替换旧主机值为实际内容,或创建允许任意主机的用户(生产环境建议限制IP段)
    ALTER USER 'myuser'@'旧主机值' IDENTIFIED BY '你的密码';
    CREATE USER 'myuser'@'%' IDENTIFIED BY '你的密码';
    GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'myuser'@'%';
    FLUSH PRIVILEGES;
    

3. 确认Secrets Manager密码注入的正确性

即使你确认密码正确,仍需验证ECS任务是否正确获取到密码:

  • 查看ECS任务的环境变量配置,确认从Secrets Manager注入的密码变量(如DB_PASSWORD)已加载
  • 检查Django的settings.py是否正确读取环境变量:
    import os
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': '你的数据库名',
            'USER': 'myuser',
            'PASSWORD': os.getenv('DB_PASSWORD'),
            'HOST': 'RDS实例端点',
            'PORT': '3306',
        }
    }
    
  • 可在ECS任务中执行echo $DB_PASSWORD验证密码是否与Secrets Manager一致

4. 检查RDS的公有可访问性与VPC配置

  • 若ECS在私有子网:确保RDS也部署在同一VPC的私有子网,关闭"公有可访问性",且VPC路由表配置了私有子网间通信
  • 若ECS在公有子网:确保RDS开启"公有可访问性",且安全组允许对应IP访问

5. 排查密码特殊字符问题

若密码包含!@#$%^&*()等特殊字符,可能在注入时被转义或截断:

  • 临时替换Secrets Manager中的密码为无特殊字符的测试值,重新部署ECS任务验证连接
  • 若测试有效,需确保密码传递时保留所有特殊字符(比如Github Actions中用正确的变量引用方式避免转义)

内容的提问来源于stack exchange,提问作者UCFChandra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:03:32