aws fargate 的持久存储解决方案 [关闭]

Posted

技术标签:

【中文标题】aws fargate 的持久存储解决方案 [关闭]【英文标题】:persistent storage solutions for aws fargate [closed] 【发布时间】:2020-02-25 03:41:00 【问题描述】:

我在 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 中的所有解决方案,以及在一些谷歌搜索中可以找到的所有解决方案,但无济于事。

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

    一个php文件调用数据库 数据库指向 webapp 上存储应用程序数据的位置 数据被读取/写入到 webapp 中的文件

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

【问题讨论】:

将文件存储在 S3 中而不是本地如何? 我对 S3(以及 aws. 和 docker.)不太熟悉,所以我不确定。我可以将文件上传到 S3,并让多个用户读取/写入它们吗?我能否将用户请求从 webapp 重定向到 S3?我将如何设置它?等等 这完全取决于您的用例。如果多个用户需要同时读/写,例如Google Docs 类型的协作,它可能需要在内存中。如果您能够一次锁定文件以供一个用户编辑,我可能会将文件保存到 S3 并使用 dynamodb 锁来控制访问。 Fargate 是无状态的,就像 Lambda;任何存储都是短暂的。如果可能,您可能希望重新考虑将您的应用程序重新架构为无状态,并能够在 Fargate 上运行。如果它不可能或不实用,您将不得不使用 EFS 可以很好地配合使用的 ECS。使用 EFS 和 ECS-EC2 有很好的文档记录,这里有一个很棒的教程docs.aws.amazon.com/AmazonECS/latest/developerguide/…。 【参考方案1】:

编辑:Fargate 现在支持 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,并优化缓存。

【讨论】:

有没有人用 Fargate 让 s3fs-fuse 与 Docker 一起工作?我以为 Fargate 不支持特权模式?【参考方案2】:

针对不同课程的不同马匹,Fargate 旨在对基础设施进行零管理,这意味着只需指定 Docker 映像,然后将所有内容留在 AWS 上。

在使用 EC2 或 Fargate 启动类型。 Fargate 任务仅支持非持久性存储 卷,因此不支持 host 和 sourcePath 字段

解决方法是卷安装。

Fargate Task Storage

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

Docker层存储的10 GB

另一个4 GB for volume mounts。这可以安装和共享 在使用卷、mountPoints 和 volumesFrom 的容器之间 任务定义中的参数。

为 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 值上 容器实例。

在任务定义卷部分中,使用 name 和 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 参数。

【讨论】:

经过一番摸索后,我能够在 EC2 上获得持久存储。我对此解决方案有几个问题: 1. 是否可以访问/下载已安装的文件?比如说,如果我需要备份文件,或者在容器外访问它们,我能做到吗? 2. 我是否正确假设多个容器可以同时访问挂载? 3. 可以跨地域挂载文件吗?还是仅限于创建卷的区域? 1.是的,您可以从 ec2 下载文件,并且在对 ec2 实例执行 SSH 后,您将能够看到挂载的文件。 2)是的,它与您可以访问的多个容器附加相同的卷。 3)第三个看起来很复杂,我认为卷不允许跨区域访问,您需要快照。 docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 我进入了实例,并在 .json 中找到了我指向的文件夹。但是,由于某种原因,这些文件夹是空的。我相信持久存储起作用了,因为我已经停止了任务(并将任务数设置为 0),等待了 17 个小时,再次启动它们,并确认启动后的更改仍然有效。什么可能导致我安装卷的文件夹为空? 我想通了。我在容器中正确设置了权限,但是 ec2 实例没有创建新文件的正确权限。【参考方案3】:

Fargate 现在支持 EFS。我亲自设置了一个使用它的应用程序,我可以说它总体上可以工作,但性能很糟糕。所以说真的,这取决于你需要什么样的 I/O 性能。

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

有很多关于 EFS 性能的内容,因此请务必仔细阅读。不过,您现在可能终于有了在 Fargate 中的文件持久性解决方案!

【讨论】:

以上是关于aws fargate 的持久存储解决方案 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

aws fargate 和私有容器存储库

AWS Fargate 集群无法使用 NAT 和 Internet 网关访问 Internet [关闭]

AWS ECS Fargate 从跨账户 ECR 存储库中提取映像

如何在 AWS Fargate 中更新容器映像

AWS Fargate任务调试,“CannotPullContainerError ...无效参考格式”是什么意思?

ECS 与 EFS 或 EBS 上的持久数据与 CloudFormation