在ECS容器服务上使用EFS文件服务提供持久化存储

一、背景

EFS文件系统可以提供可靠的、持续的文件系统给多种服务,这其中也包括ECS容器服务。在容器场景上使用EFS的主要优势是可以简化管理,借助托管服务快速部署无须复杂运维,让ECS容器镜像的构建只需要关心应用程序本身,不需要将配置文件、数据文件打包到容器中。由此可实现容器的运行时和数据的分离。ECS Fargate和Fargate Spot都支持使用EFS文件系统,其中在Fargate Spot服务上搭配EFS,更可以借助EFS的持久化,避免Spot中断时候的数据持久保存问题。

在ECS服务的容器中使用EFS文件系统,无须事先为ECS容器镜像安装任何软件包,以支持NFS协议的Amazon Linux 2和Ubuntu作为容器镜像的基础版本即可。

本文在ECS Fargate和ECS Fargate spot上测试通过,在AWS中国区有效。

二、EFS创建和使用

正常创建一个EFS,并使用EC2验证EFS可正常访问和挂载。关于EFS的创建和使用,可参考这篇文章。

如下截图。

通过EC2验证EFS挂载正常,即可开始下一步ECS服务的配置。

三、ECS服务使用EFS

1、正常启动ECS集群和任务

正常启动过一个ECS集群和任务。此步骤的意义是,验证集群、任务和服务配置正确,避免ECS服务本身配置错误导致调试EFS时候排除故障的复杂度增加。如下截图。

2、容器定义修改

接下来修改上一步已经运行成功的容器任务定义配置文件。进入EFS服务,找到之前配置好的任务定义,例如当前任务定义的版本是2,点击创建新修订(Create new revision) 。如下截图。

在创建新版容器服务的界面,将页面向下滚动到最下方,在卷菜单下,点击添加卷(Add volume)链接。如下截图。

在弹出的对话框内,进行如下配置:

  • 配置的卷名称(友好化名称,注意这不是挂载目录名)
  • 从下拉框选择卷类型是EFS
  • 然后选择EFS的文件系统ID(自动显示本Region内存在的多个EFS文件系统)
  • Access point ID功能如果事先没有在EFS上配置,那么这里默认是None,不需要调整即可正常访问
  • 根目录(Root directory)这里,输入EFS上的存储卷名称,在本文的例子中,EFS文件系统上的根目录有多个文件和子目录,其中wwwroot子目录下有index.php文件会稍后用于ECS服务的web服务使用。
  • 其他参数保持默认即可。

最后点击添加按钮。如下截图。

添加完毕后,弹出窗口消失,任务配置界面的卷位置可以显示EFS信息了。如下截图。

接下来进一步操作,向上滚动页面,来到容器镜像配置位置。找到之前的容器镜像定义,点击编辑现有配置。如下截图。

找到存储和日志配置菜单位置,在挂载点(Mount points)菜单上,默认是None,点击下拉框,选择上一步配置的EFS服务。如下截图。

从下拉框中选择上一步配置的EFS服务的友好名称,然后在下方挂载路径位置输入/var/www/html表示在容器内EFS将会挂载到这个目录。这个目录是Apache服务的默认的web目录。也就是会将EFS上指定的/wwwroot目录作为容器中的/var/www/html目录。配置完成后点击Update按钮。如下截图。

修改容器定义完成后,页面返回到更新任务定义的界面,点击右下角的创建按钮,将会创建一个新版本的容器定义。如下截图。

创建新版本成功。任务定义版本从版本2来到了版本3。如下截图。

至此更新容器任务定义完成。

3、启动新任务

进入到ECS集群界面,查看现有运行的服务(Service),可以看到右下角显示的任务定义是版本2,接下来我们要将其修改为版本3,也就是配置了挂载EFS存储目录的版本。选中这当前服务,然后点击Update更新按钮。如下截图。

进入编辑服务界面,将任务定义版本从2升级到3,然后选中强制新的部署(Force new deployment)。本页面其他设置不需要调整,将鼠标移动到最下方,点击下一步。如下截图。

接下来修改服务定义向导的后三个步骤,都保持默认值,不需要再修改。一路确定,启动新的任务。

启动新的任务完成,页面显示如下。如下截图。

现在进入服务的部署(Deployments)标签页,可以看到新发布的两个新版本任务。如下截图。

进入任务界面,查看本服务包含的任务(容器),可以看到之前有两个使用任务定义版本2的服务,现在又新建了两个任务版本定义版本3的任务,且启动成功。如下截图。

现在通过ECS关联的ALB,测试下对外访问,即可发现容器的/var/www/html目录下暴露的文件就是EFS存储上/wwwroot路径下的文件了。

但ALB的健康检查验证新版本任务发布成功后,旧版本会在几分钟后自动从ALB注销,并且被ECS自动删除。因此不需要人工干预ECS的任务。

4、通过ECS Exec和Session Manager登陆到容器内验证

在别的文章中介绍过,通过ECS Exec和Session Manager登陆可到容器内验证,请参考这篇文章。现在使用这个特性,登陆到容器内确认下目录挂载正常。

使用ECS Exec和Session Manager登陆到容器内之后,查看挂载点/var/www/html目录其中的内容,可确认与EFS存储的/wwwroot路径内的文件内容一致。如下截图。

为了进一步确认容器内的/var/www/html路径是来自EFS挂载点,可在容器内执行mount命令,然后查看输出结果,即可看到这个目录是EFS上的/www/root挂载到容器上的。如下截图。

至此ECS服务使用EFS文件系统配置完成。

四、参考文档

官网文档:

https://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/tutorial-efs-volumes.html

知识库:

https://aws.amazon.com/cn/premiumsupport/knowledge-center/ecs-fargate-mount-efs-containers-tasks/

全文完。