AWS数据库迁移失败,寻求该错误的排查调试方法
提取任务终止详细原因
执行以下命令获取容器停止的具体原因:aws ecs describe-tasks --cluster <clustername> --tasks <container_arn> | jq '.tasks[0].containers[0].reason'也可直接在AWS ECS控制台的任务详情页查看「停止原因」字段。
查看容器运行日志
如果任务配置了CloudWatch日志,通过命令或控制台获取日志:aws logs get-log-events --log-group-name <你的日志组名称> --log-stream-name <任务对应的日志流名称>日志中通常会包含迁移命令执行失败的具体报错信息,比如数据库连接失败、SQL语法错误等。
校验任务定义配置
- 检查容器启动命令/入口点是否正确,确认数据库迁移命令的参数、路径无错误
- 核对任务定义中的环境变量(如数据库地址、用户名、密码)是否完整且正确
- 确认任务分配的CPU、内存资源满足迁移任务的运行需求,资源不足可能导致进程异常退出
验证网络与权限
- 检查任务使用的安全组是否开放了数据库端口的出站规则
- 确认任务执行角色拥有访问目标数据库、CloudWatch日志的必要权限
- 检查任务所在子网的路由表,确保能正常连通数据库所在网络
本地模拟测试
在本地或测试环境中,模拟任务容器的运行环境,直接执行迁移命令,复现问题并定位具体错误点
参考错误日志
[Container] 2022/09/08 10:57:51 进入BUILD阶段
[Container] 2022/09/08 10:57:51 正在运行命令:echo Running database migrations...
输出:Running database migrations...
[Container] 2022/09/08 10:57:51 正在运行命令:run_result=$(aws ecs run-task --launch-type FARGATE --cluster clustername --task-definition taskname --network-configuration "awsvpcConfiguration=subnet,securityGroups=SGgroup,assignPublicIp=ENABLED}")
[Container] 2022/09/08 10:58:02 正在运行命令:container_arn=$(echo $run_result | jq '.tasks[0].taskArn' | sed -e 's/^"//' -e 's/"$//')
[Container] 2022/09/08 10:58:02 正在运行命令:aws ecs wait tasks-stopped --cluster clustername --tasks "${container_arn}"
[Container] 2022/09/08 10:59:15 正在运行命令:describe_result=$(aws ecs describe-tasks --cluster clustername --tasks "${container_arn}")
[Container] 2022/09/08 10:59:16 正在运行命令:terminated_status=$(echo $describe_result | jq '.tasks[0].containers[0].exitCode')
[Container] 2022/09/08 10:59:16 正在运行命令:echo $terminated_status
输出:1
[Container] 2022/09/08 10:59:16 正在运行命令:exit $terminated_status
[Container] 2022/09/08 10:59:16 命令未成功退出:exit $terminated_status,退出状态1
[Container] 2022/09/08 10:59:16 BUILD阶段完成:状态为FAILED
[Container] 2022/09/08 10:59:16 阶段上下文状态码:COMMAND_EXECUTION_ERROR 消息:执行命令exit $terminated_status时出错,原因:退出状态1
内容的提问来源于stack exchange,提问作者Bikram Rajbanshi

