AWS CodeBuild预构建阶段无法连接外部MySQL数据库求助
AWS CodeBuild PRE_BUILD阶段MySQL连接失败问题排查与解答
问题背景
[Container] 2024/12/22 20:03:43.966393 Phase complete: PRE_BUILD State: FAILED
[Container] 2024/12/22 20:03:43.966407 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: if mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USERNAME" -p"$DB_PASSWORD" -e "SHOW DATABASES;"; then
已尝试的排查步骤
- 验证环境变量:
$DB_HOST、$DB_PORT、$DB_USERNAME、$DB_PASSWORD均从AWS Parameter Store获取,通过buildspec中的echo命令确认加载正常。 - 网络可达性:数据库部署在外部服务器(13.247.100.80),非RDS实例:
- MySQL服务器入站规则已允许CodeBuild服务角色的公网IP访问;
- MySQL服务器运行正常,本地环境可正常访问。
- 验证MySQL配置:数据库已配置为允许端口3306的远程连接。
当前使用的buildspec.yml
version: 0.2 env: variables: PHP_83_VERSION: "8.3.8" # Define PHP version phases: install: commands: - echo "Updating system dependencies..." - sudo dnf update -y - echo "Installing required tools..." - sudo dnf install -y unzip git nmap dnf-plugins-core - echo "Installing MySQL Community client..." - sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 - sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm - sudo dnf config-manager --enable mysql80-community - sudo dnf install -y mysql-community-client --nogpgcheck - echo "Installing Composer..." - curl -sS https://getcomposer.org/installer | php - sudo mv composer.phar /usr/local/bin/composer pre_build: commands: - echo "Fetching environment variables from Parameter Store..." - export DB_HOST=$(aws ssm get-parameter --name "/expressuddb/db_host" --query Parameter.Value --output text) - export DB_PORT=$(aws ssm get-parameter --name "/expressuddb/db_port" --query Parameter.Value --output text) - export DB_DATABASE=$(aws ssm get-parameter --name "/expressuddb/db_name" --query Parameter.Value --output text) - export DB_USERNAME=$(aws ssm get-parameter --name "/expressuddb/db_user" --query Parameter.Value --output text) - export DB_PASSWORD=$(aws ssm get-parameter --name "/expressuddb/db_password" --with-decryption --query Parameter.Value --output text) - echo "Environment variables loaded successfully." - echo "Testing database connectivity..." - | if mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USERNAME" -p"$DB_PASSWORD" -e "SHOW DATABASES;"; then echo "Successfully connected to the database." else echo "Failed to connect to the database. Debugging connection..." echo "Host: $DB_HOST" echo "Port: $DB_PORT" echo "Database: $DB_DATABASE" echo "Username: $DB_USERNAME" exit 1 fi build: commands: - echo "Building the application..." - composer install --no-dev --optimize-autoloader post_build: commands: - echo "Build completed successfully." artifacts: files: - '**/*' - '!node_modules/**/*' base-directory: /codebuild/output/src
问题解答
1. 如何在CodeBuild环境中调试或解决无法连接MySQL服务器的错误?
- 增加详细错误输出:修改mysql命令,添加
-v(verbose)参数获取更具体的连接报错信息,示例:mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USERNAME" -p"$DB_PASSWORD" -v -e "SHOW DATABASES;" - 兼容认证协议:若目标MySQL服务器为5.x版本,CodeBuild中安装的8.0客户端可能因认证协议差异失败,可添加
--default-auth=mysql_native_password参数。 - 处理密码特殊字符:如果
$DB_PASSWORD包含!、@、$等shell敏感字符,改用单引号包裹密码参数:-p'$DB_PASSWORD'。 - 交互式调试:在pre_build阶段添加
bash -i命令,通过CodeBuild会话管理器进入交互式shell,手动执行mysql命令排查问题。
2. CodeBuild访问外部MySQL服务器是否需要特定的网络或安全配置?
- 网络模式适配:
- 若CodeBuild使用VPC模式,需确保子网路由表配置互联网网关,且安全组允许出站访问3306端口;
- 若使用默认公网模式,CodeBuild的公网IP是动态变化的,需将AWS对应区域的公网IP段加入MySQL服务器的入站规则(而非单个IP)。
- VPC权限配置:如果CodeBuild部署在VPC内,服务角色需拥有
ec2:CreateNetworkInterface等VPC相关权限。 - NAT网关与防火墙:若CodeBuild通过NAT网关访问公网,需将NAT网关的公网IP加入MySQL入站规则;外部防火墙需允许对应IP/端口的访问。
3. 有没有不使用mysql命令即可在CodeBuild脚本中测试MySQL服务器连通性的方法?
- telnet端口测试:在install阶段安装telnet(
sudo dnf install -y telnet),执行:telnet "$DB_HOST" "$DB_PORT" - netcat端口扫描:利用已安装的nmap中的nc工具,执行:
nc -zv "$DB_HOST" "$DB_PORT" - curl模拟TCP连接:无需额外安装工具,执行:
curl -v telnet://"$DB_HOST":"$DB_PORT"
以上方法仅验证网络层连通性,无法确认MySQL认证权限,但可快速排查端口是否可达。
内容的提问来源于stack exchange,提问作者Hellen
相关产品推荐
相关产品推荐

