在 EBS 卷上创建文件系统,将其挂载到 EC2 实例并在将实例替换为 CDK 时持久化数据
Posted
技术标签:
【中文标题】在 EBS 卷上创建文件系统,将其挂载到 EC2 实例并在将实例替换为 CDK 时持久化数据【英文标题】:Creating a file system on EBS volume, mounting it to EC2 instance and persisting data when instance is replaced with CDK 【发布时间】:2022-01-10 16:14:07 【问题描述】:我正在使用 CDK 部署一个 EC2 实例,该实例将在单节点 docker swarm 集群中运行应用程序。这不适用于关键的生产工作负载,主要用于运行副项目和试验。在大多数情况下,它工作得很好,我可以通过互联网访问我的应用程序。
这是我的问题:当我重新部署应用程序时,它会替换 EC2 实例,并且所有数据都丢失了,因为它使用实例的根卷来存储数据。我现在正在尝试将 EBS 卷挂载到实例并在该挂载的 EBS 卷上挂载 docker 卷,以便在堆栈更新之间保留数据。以下是有关我正在开发的应用程序的一些信息以获取更多上下文:
我在 docker swarm 中部署的堆栈具有以下服务:
traefik nginx django 芹菜 postgres redis我想在 traefik、postgres 和 redis 上挂载一个 EBS 卷,并且可能只为所有三个服务使用相同的卷以保持简单。
我一直在这里查看 EBS 的文档:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-using-volumes.html
我认为我需要在我的 UserData
脚本中做这样的事情:
# mount the EBS volume
sudo mkdir /data # make a directory on the EC2 machine
sudo mkfs -t xfs /dev/sda1 # create an xfs file system on /dev/sda1
sudo mount /dev/sda1 /data # mount the volume on the directory that was created
我认为这已接近我的需要,但它会在我每次启动或更换 EC2 实例时格式化卷的数据。
我应该使用 fstab 吗?我正在尝试将此添加到我的 UserData
脚本中:
sudo mkdir /data
echo "/dev/sda1 /data xfs defaults 0 0" >> /etc/fstab
这仍然不是持久化数据。我正在通过向/data
添加一个文件来测试这一点,重新部署并检查在替换 EC2 实例后该文件是否存在。
我正在使用我的 CDK 堆栈中定义的 CloudFormationInit 脚本来安装 docker、初始化 swarm 集群、下载 stack.yml 文件并将其部署到 swarm 集群。然后我创建一个指向 EC2 实例的公共 IP 的 Route 53 记录。
这是我正在为在 EC2 上的 docker swarm 中运行我的 Django 应用程序而开发的 CDK 结构的链接:https://github.com/briancaffey/django-cdk/blob/main/src/docker-ec2.ts
【问题讨论】:
【参考方案1】:你几乎得到它 - 你只需安装它就可以了。格式化确实会擦除数据,解决方法就是跳过这一步。
您为解决此问题而链接的文档:
(视情况而定)如果您在上一步中发现设备上有文件系统,请跳过此步骤。如果您有一个空卷,请使用 mkfs -t 命令在该卷上创建一个文件系统。
警告。 如果要挂载已包含数据的卷(例如,从快照创建的卷),请不要使用此命令。否则,您将格式化卷并删除现有数据。
所以以下应该可以工作:
# mount the EBS volume
sudo mkdir /data # make a directory on the EC2 machine
sudo mount /dev/sda1 /data # mount the volume on the directory that was created
【讨论】:
以上是关于在 EBS 卷上创建文件系统,将其挂载到 EC2 实例并在将实例替换为 CDK 时持久化数据的主要内容,如果未能解决你的问题,请参考以下文章
Terraform - 创建 EBS 的快照,然后将快照转换为 EBS 并附加到 EC2
在启动 Amazon EC2 Linux 实例时自动挂载 EBS 卷