我目前正在将一个应用程序从静态EC2服务器移到ECS,因为到目前为止,发布过程一直是ssh到服务器以git拉取/迁移数据库。
我已经创建了我需要使用terraform从我的组织的弹性容器注册表部署我的代码的一切。我有一个集群,一些服务和任务定义。
我现在可以成功地为任何给定的版本部署应用程序,但是我的主要问题是找到一种方法来运行迁移。
到目前为止,我的方法是将应用程序拆分为3个服务,我有我的"web"服务,它处理所有HTTP流量(服务前端,响应API请求),我的"cron"服务,它处理在特定时间/事件上发送电子邮件/推送通知等事情,我的"迁移"服务,它只是"cron"服务,但与entryPoint覆盖到容器,只是运行迁移(因为我不需要任何apache2的东西为这个容器,我不认为有理由为迁移再做一个)。
我遇到的问题是"migrate"服务会不断尝试并安排更多的任务来迁移数据库,即使它只需要做一次。所以我放弃了它作为一个服务,而保留了它作为一个任务定义,这样我仍然可以把它放在我的集群中。
作为我正在编写的部署过程的一部分,我通过bash脚本在集群内运行该任务,这样我就可以等到迁移完成后再决定是否将应用程序从维护模式中取出(如果迁移失败),或者一旦迁移完成就部署新的'web'/'cron'容器。
目前这是一个shell脚本(由Github actions运行),看起来像这样:
#!/usr/bin/env bash
CLUSTER_NAME=$1
echo $CLUSTER_NAME
OUTPUT=`aws ecs run-task --cluster ${CLUSTER_NAME} --task-definition saas-app-migrate`
if [$? -n 0]; then
>&2 echo $OUTPUT
exit 1
fi
TASKS=`echo $OUTPUT | jq '.tasks[].taskArn' | jq @sh | sed -e "s/'//g" | sed -e 's/"//g'`
for task in $TASKS
do
# check for task to be done
done
因为$TASKS包含由此产生的任何任务的taskArn,我可以自由地查询任务,但我不知道我在寻找什么信息。
AWS文档说,我应该使用' description -task'命令来找出任务达到'STOPPED'状态的原因,因为它在响应中提供了'stopCode'和'stoppedReason'属性。但是,它没有说明如果成功停止,这些值将是什么?我不想在我的部署中引入手动步骤,直到迁移完成——应用程序不能使用——然后告诉我的发布过程继续。
是否有指向文档的链接,我可能错过了我正在搜索的值,或者有另一种方法来处理这种情况?
您可以使用
获取任务的退出代码aws --no-cli-pager ecs describe-tasks
--cluster $cluster
--tasks $task_arn | jq '.tasks[0].containers[0].exitCode'
但是我认为你需要继续轮询它。
我发现这个脚本非常有用