我正在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搜索中可以找到的所有解决方案,但都无济于事。
文件的访问方式基本上是:
有人知道ECS Fargate的持久存储解决方案吗?而我将如何进行设置?
答案 0 :(得分:5)
EDIT :Farget现在支持EFS作为持久性存储。因此,您无需使用S3FS之类的东西或任何其他hacky解决方案:
原始答案(不再相关):
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任务都会收到以下存储。 任务存储是短暂的。 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"
}
]
}
]
再次
Fargate任务不支持host和sourcePath参数。