具有 EFS 卷更新数据的 ECS Fargate

ECS Fargate with EFS Volume update data

我有一个 ECS 服务,其中的任务使用 EFS 卷。我还有一个数据同步任务,用于从 S3 存储桶(源)

更新 EFS 文件系统(目标)上的文件

容器任务正在为存储在 EFS 上的文件提供服务。

每当我 运行 数据同步任务和更新 EFS 时,容器上的数据都不会更新。为了获得最新数据,我必须将服务上的所需任务设置为 0,然后再次设置为 1,以便创建任务的新实例。

我想避免我的服务停机。有没有办法在不执行我之前解释的操作的情况下获得最新数据?

更新:

看来我的主要问题是容器正在将文件索引到内存,因此需要重新启动(需要重新部署)。但我仍然有可用性问题,我需要一种方法来自动执行此过程

好的,经过大量研究,我发现有一个 AWS-CLI 命令可以强制为 ECS 服务进行新部署,创建新任务并保留旧任务直到最新任务处于稳定状态,这消除了我的可用性问题。

命令是:

aws ecs update-service --force-new-deployment --service my-service-name --cluster my-cluster-name 

现在我需要一种方法来在执行 Datasync 任务时自动更新我的任务,我考虑为其创建一个管道以从 Codebuild 容器执行命令。问题是 CodePipeline 没有数据同步任务执行作为源阶段的触发器...

我的解决方案是创建一个带有模式的 AWS EventBridge 规则来检测我的任务的 Datasync 任务状态更改事件,然后我将一个 CodeBuild 项目添加为目标,我在其中定义了之前在构建规范中声明的命令

模式看起来像这样以防有人需要它(无法在网上找到任何关于它的示例)

{
  "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!