AWS Fargate永久存储解决方案

时间:2019-10-29 20:50:17

标签: amazon-web-services amazon-ec2 amazon-ecs aws-fargate

我正在ecs fargate中的容器上运行一个apache webapp,但是我需要能够持久保存某些文件,以便通过webapp的所有版本向所有用户提供对它们的任何更改。不幸的是,fargate对EFS的支持尚在开发中,因此我至少需要一个持久的存储解决方案,直到该功能可用为止(或者直到宣布该功能的发布日期为止,这样我才能说我会处理)。

我试图从fargate切换到ec2,因为EFS可以与ec2兼容,但是我找不到解决无法“放置任务的方法,因为没有容器实例满足其所有要求。”原因:在集群中未找到容器实例。”错误。我尝试了AWS ECS Error when running task: No Container Instances were found in your cluster中的所有解决方案,以及在一些Google搜索中可以找到的所有解决方案,但都无济于事。

文件的访问方式基本上是:

  1. 一个php文件调用数据库
  2. 数据库指向Web应用程序上存储应用程序数据的位置
  3. 数据被读取/写入Webapp中的文件

有人知道ECS Fargate的持久存储解决方案吗?而我将如何进行设置?

3 个答案:

答案 0 :(得分:5)

EDIT :Farget现在支持EFS作为持久性存储。因此,您无需使用S3FS之类的东西或任何其他hacky解决方案:

https://aws.amazon.com/about-aws/whats-new/2020/04/amazon-ecs-aws-fargate-support-amazon-efs-filesystems-generally-available/


原始答案(不再相关):

Fargate目前不支持持久存储,因为您无权访问基础基础结构,因此,您无法安装EFS卷。而且可能很快不会发生。

但是一种解决方案是使用 S3FS ,它将 S3 存储桶作为文件系统安装在容器上,直接直接,因此您不需要访问基础架构。

您可以在这里找到它:https://github.com/s3fs-fuse/s3fs-fuse

该项目很受欢迎并且维护良好。它应该可以工作,但是请记住,这是一个 hacky 解决方案。它不是完全兼容POSIX的解决方案,但是可以存储简单文件。 与本地文件系统相比,性能也会降低。如果您要提供存储的文件,最好在顶部添加 CDN ,并优化缓存。

答案 1 :(得分:2)

Fargate现在支持EFS。我亲自设置了一个使用它的应用程序,可以说它可以正常运行,但是性能却很糟糕。因此,实际上,这取决于您需要哪种I / O性能。

具体地说,我发现EFS很难在包含数千个文件的目录中列出文件,并且在读取文件内容时可能会很慢。

关于EFS性能的内容很多,因此请确保对其进行研究。但是,现在您终于可以在Fargate中获得文件持久性的解决方案了!

答案 2 :(得分:0)

Fargate用于不同的课程,旨在对基础架构进行零管理,这意味着只需指定Docker映像,然后将所有内容保留在AWS上。

  

使用EC2或Linux时,都支持绑定安装主机卷   Fargate启动类型。 Fargate任务仅支持非持久存储   卷,因此不支持 host和sourcePath字段

工作环境是卷装。

Fargate Task Storage

  

设置后,每个Fargate任务都会收到以下存储。   任务存储是短暂的。 Fargate任务停止后,存储将   删除。

     

10 GB的Docker层存储

     

附加的4 GB for volume mounts。可以安装和共享   在使用卷的容器中,mountPoints和volumeFrom   任务定义中的参数。

在Fargate任务中为容器提供永久性的空存储空间

在此示例中,您可能有两个数据库容器,它们需要在任务执行期间访问相同的暂存文件存储位置。

在“任务定义卷”部分中,定义名称为database_scratch的卷。

  "volumes": [
    {
      "name": "database_scratch",
      "host": {}
    }
  ]

在containerDefinitions部分中,创建数据库容器定义,以便它们安装非持久性存储。

  "containerDefinitions": [
    {
      "name": "database1",
      "image": "my-repo/database",
      "cpu": 100,
      "memory": 100,
      "essential": true,
      "mountPoints": [
        {
          "sourceVolume": "database_scratch",
          "containerPath": "/var/scratch"
        }
      ]
    },
    {
      "name": "database2",
      "image": "my-repo/database",
      "cpu": 100,
      "memory": 100,
      "essential": true,
      "mountPoints": [
        {
          "sourceVolume": "database_scratch",
          "containerPath": "/var/scratch"
        }
      ]
    }
  ]

如果您正在寻找一种绑定主机卷的方法,那么您期望Fargate出现错误,因为在发生Fargate的情况下没有主机。

您需要Ec2类型ECS Task.

使用绑定安装为容器提供持久存储

  

使用绑定安装时,如果指定了sourcePath值,则数据   即使引用它的所有容器都已停止,它仍然存在。   sourcePath中存在的任何文件都会显示给容器   在containerPath值,以及写入到   containerPath值被写入到   容器实例。

在“任务定义卷”部分,使用名称和sourcePath值定义绑定安装。

  "volumes": [
    {
      "name": "webdata",
      "host": {
        "sourcePath": "/ecs/webdata"
      }
    }
  ]

在containerDefinitions部分中,定义一个容器,该容器的mountPoints值引用定义的绑定安装的名称,并使用containerPath值将绑定安装安装在容器上。

  "containerDefinitions": [
    {
      "name": "web",
      "image": "nginx",
      "cpu": 99,
      "memory": 100,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80
        }
      ],
      "essential": true,
      "mountPoints": [
        {
          "sourceVolume": "webdata",
          "containerPath": "/usr/share/nginx/html"
        }
      ]
    }
  ]

bind-mounts

再次

Fargate任务不支持host和sourcePath参数。