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设置、添加防火墙规则)
- 确认本次提交是否升级了
mysql2gem版本,新版本可能有连接参数变化,需要调整database.yml中的配置(比如新增ssl_mode等参数)
5. RDS状态与连接测试
- 在CodeBuild环境中执行
telnet <RDS端点> 3306或nc -zv <RDS端点> 3306,验证网络连通性,排除RDS临时故障 - 查看RDS的监控指标(连接数、CPU使用率),确认是否达到连接上限或资源耗尽
内容的提问来源于stack exchange,提问作者codingman
相关产品推荐
相关产品推荐

