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

Ruby on Rails AWS CodeBuild部署时无法连接MySQL RDS(错误110)

问题:BitBucket Pipeline + AWS CodeBuild部署Rails时数据库连接失败

部署Ruby on Rails代码到生产环境时,流水线循环40分钟后因CodeBuild失败终止,日志显示执行RUN bundle exec rake db:migrate -X -s -q时出现Mysql2::Error: Can't connect to MySQL server (110)错误,后续任务全部失败。

已尝试的操作:

  • 手动清理迁移文件后重新部署
  • 更新RDS实例
  • 确认EC2安全组已正确关联RDS

此前流水线运行正常,怀疑问题和本次提交的代码有关,需要排查方向。


相关配置脚本

BitBucket Pipeline配置

branches:
    develop:
      - step:
          name: create & push image
          script:
            - aws/codebuild.sh demo company-demo
      - step:
          name: deploy
          deployment: staging
          script:
            - sed -i "s/TAGTOSET/demo-$BITBUCKET_COMMIT/g" ./aws/demo/ecs/task.json
            - export TASK_VERSION=$(aws ecs register-task-definition --cli-input-json file://aws/demo/ecs/task.json | jq --raw-output '.taskDefinition.revision')
            - echo "Registered ECS Task Definition $TASK_VERSION"
            - aws ecs update-service --cluster demo --service company --task-definition demo-company:$TASK_VERSION --desired-count 1 --force-new-deployment
      - step:
          name: whenever deploy
          script:
            - sed -i "s/TAGTOSET/demo-$BITBUCKET_COMMIT/g" ./aws/demo/ecs/cron-task.json
            - export TASK_VERSION=$(aws ecs register-task-definition --cli-input-json file://aws/demo/ecs/cron-task.json | jq --raw-output '.taskDefinition.revision')
            - echo "Registered ECS Task Definition $TASK_VERSION"
            - ECS_CLUSTER=demo TASK_DEFINITION=demo-cron ECS_CONTAINER=ruby AWS_REGION=ca-central-1 elastic_whenever -i demo -f config/schedule.rb

aws/codebuild.sh脚本

PROJECT_ENV=$1
PROJECT_NAME=$2

TAG="$PROJECT_ENV-$BITBUCKET_COMMIT"

echo "Starting build for project: $PROJECT_NAME with tag: $TAG"
BUILD_INFO=`aws codebuild start-build --project-name $PROJECT_NAME --source-version $BITBUCKET_BRANCH --environment-variables-override name=TAG,value=$TAG`
echo "Build Info: $BUILD_INFO"

BUILD_ID=`echo $BUILD_INFO | jq -r '.build.id'`

while true;
do
  BUILD_STATUS=`aws codebuild batch-get-builds --ids $BUILD_ID | jq -r '.builds[0].buildStatus'`
  echo "Current Build Status: $BUILD_STATUS"

  if [[ $BUILD_STATUS == "SUCCEEDED" ]]; then
    echo $BUILD_STATUS
    exit 0
  elif [[ $BUILD_STATUS == "IN_PROGRESS" ]]; then
    echo "Build in Progress"
    sleep 10
  else
    echo "Build Failed with status: $BUILD_STATUS"
    exit 1;
  fi
done

排查方向

1. 数据库配置文件变更检查

  • 对比本次提交中config/database.yml的修改,确认生产环境的数据库主机、端口、用户名、密码等配置是否正确,是否误修改了RDS的端点地址或端口
  • 检查是否新增了环境变量依赖,而CodeBuild环境中未正确注入这些变量(比如数据库密码存到Secrets Manager但CodeBuild权限不足或未正确读取)

2. 迁移文件本身的问题

  • 确认本次提交的新迁移文件是否存在语法错误,或在本地模拟生产环境执行迁移,看是否能复现连接问题
  • 检查迁移文件中是否有自定义代码(比如初始化数据时建立额外数据库连接),导致连接逻辑异常

3. CodeBuild环境网络与权限

  • 确认CodeBuild项目的VPC配置是否正确:是否和RDS在同一个VPC,是否配置了正确的子网和安全组(即使EC2安全组关联RDS,CodeBuild的安全组也需要允许出站访问RDS的3306端口)
  • 检查CodeBuild的IAM角色是否有访问RDS的权限,或是否有权限读取数据库凭证

4. 镜像构建阶段的环境差异

  • 检查Dockerfile中是否新增了影响数据库连接的配置(比如修改DNS设置、添加防火墙规则)
  • 确认本次提交是否升级了mysql2 gem版本,新版本可能有连接参数变化,需要调整database.yml中的配置(比如新增ssl_mode等参数)

5. RDS状态与连接测试

  • 在CodeBuild环境中执行telnet <RDS端点> 3306或nc -zv <RDS端点> 3306,验证网络连通性,排除RDS临时故障
  • 查看RDS的监控指标(连接数、CPU使用率),确认是否达到连接上限或资源耗尽

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:00:56