我有一个使用EFS卷的ECS服务。我还有一个Datasync任务,从S3 Bucket(源)更新EFS Filesystem(目标)上的文件
容器任务正在提供存储在EFS上的文件。
每当我运行Datasync任务并更新EFS时,容器上的数据都没有更新。为了获得最新的数据,我必须将服务上所需的任务设置为0,然后再次设置为1,以便它创建任务的新实例。
我想避免我的服务停机。有没有一种方法可以在不做我之前解释的情况下获得最新的数据?
更新:
看起来我的主要问题是容器索引文件到内存,所以重新启动(需要重新部署)。但是我仍然有一个可用性问题,我需要一种方法来自动化这个过程
经过大量的研究,我发现有一个AWS-CLI命令强制ECS服务的新部署,新任务被创建,旧任务被保留,直到最新的处于稳定状态,这消除了我的可用性问题。
命令为:
aws ecs update-service --force-new-deployment --service my-service-name --cluster my-cluster-name
现在我需要一种方法来自动更新我的任务,每当Datasync任务被执行时,我考虑创建一个管道,让它执行来自Codebuild容器的命令。问题是CodePipeline没有Datasync Task Execution作为源阶段的触发器…
我的解决方案是创建一个带有模式的AWS EventBridge规则来检测我的任务的Datasync任务状态更改事件,然后我添加了一个目标CodeBuild项目,我在buildspec
中定义了前面所述的命令模式看起来像这样,以防有人需要它(在网上找不到任何关于它的例子)
{
"detail-type": ["DataSync Task State Change"],
"resources": ["arn:aws:datasync:us-east-1:1234567890:task/task-1234567890"],
"source": ["aws.datasync"],
"detail": {
"State": ["AVAILABLE"]
}
}
我的Datasync任务完成了它的执行,EventBridge规则将自动触发我的CodeBuild项目,因此自动更新我的ECS服务与0停机时间!