AWS:使用 Batch / ECS 挂载模板磁盘
AWS: Mounting a template disk with Batch / ECS
我正在使用 AWS Batch,但希望增加我的容器可用的磁盘 space。我正在使用 CloudFormation 创建堆栈,并且添加了一个 EC2::LaunchTemplate 以将 100GB 磁盘添加到我的实例:(从堆栈中提取)
BigDiskTemplate:
Type: 'AWS::EC2::LaunchTemplate'
Properties:
LaunchTemplateData:
BlockDeviceMappings:
- DeviceName: '/dev/xvdcz'
Ebs:
Encrypted: true
VolumeSize: 100
VolumeType: gp2
LaunchTemplateName: BigDiskTemplate
MyComputeEnvironment:
Type: 'AWS::Batch::ComputeEnvironment'
Properties:
Type: MANAGED
ComputeEnvironmentName: MyEnv
ComputeResources:
Type: EC2
MinvCpus: 0
DesiredvCpus: 0
MaxvCpus: 256
LaunchTemplate:
LaunchTemplateName: BigDiskTemplate
InstanceTypes:
- optimal
- c5.large
Subnets:
- !Ref Subnet
SecurityGroupIds:
- !Ref SecurityGroup
InstanceRole: !Ref IamInstanceProfile
ServiceRole: !Ref BatchServiceRole
}
是的,我希望磁盘是临时的。是的,我知道一些 EC2 实例支持更大的磁盘,但我也想用 GPU 实例来做到这一点。
当我在容器中 运行 lsblk
时,我得到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme1n1 259:0 0 100G 0 disk
└─nvme1n1p1 259:6 0 100G 0 part
nvme0n1 259:1 0 8G 0 disk
├─nvme0n1p1 259:2 0 8G 0 part /etc/hosts
└─nvme0n1p128 259:3 0 1M 0 part
太棒了!这是我的 100GB 磁盘。
但我不知道如何安装它。
基于示例和教程(无可否认,对于 EC2)模板磁盘应该可以用类似的东西安装:
file -s /dev/nvme1n1
mkfs -t xfs /dev/nvme1n1
mkdir /data
mount /dev/nvme1n1 /data
然而,这些步骤中的大多数都会出错。如“/dev/nvme1n1: cannot open `/dev/nvme1n1' (No such file or directory)”; "mkfs.xfs: 没有那个文件或目录"; “装载:/数据:权限被拒绝”
我也尝试过不同的驱动器名称 - 例如。 /dev/nvme1n1p1、nvme1n1 或 /nvme1n1/nvme1n1p1
那么我如何将这个磁盘安装到我的容器中呢?
Docker 是问题的一部分吗?
以下是您应该采取的步骤:
- 将卷附加到 EC2 实例。现在
lsblk
应该会显示设备。
- 将设备安装(并格式化)到
/data
这样的位置。设置权限等。
- 在任务定义中,声明一个指向
/data
的卷。
- 在您的容器定义中,声明一个挂载点。
您不能/不应将设备直接挂载到容器。
编辑:第 2 步的详细信息
可以将用户数据脚本添加到您的启动配置中。这样您就可以挂载(和格式化)设备。以此脚本为例:
#!/bin/bash
# Device name. NOT block name like 'nvme0n1p1'.
device="/dev/sdp"
# Where to mount the device.
mountpoint="/data"
# Wait for device.
while [[ ! -b $(readlink -f ${device}) ]]; do
echo "waiting for ${device}">&2; sleep 2;
done
# Format if not already formatted.
blkid $(readlink -f ${device}) || mkfs -t ext4 $(readlink -f ${device})
# Mount.
mkdir -p ${mountpoint}
mount $(readlink -f ${device}) ${mountpoint}
chmod 666 ${mountpoint}
# Persist the volume in /etc/fstab so it gets mounted again.
echo "$(readlink -f ${device}) ${mountpoint} ext4 defaults,nofail 0 2" >> /etc/fstab
我正在使用 AWS Batch,但希望增加我的容器可用的磁盘 space。我正在使用 CloudFormation 创建堆栈,并且添加了一个 EC2::LaunchTemplate 以将 100GB 磁盘添加到我的实例:(从堆栈中提取)
BigDiskTemplate:
Type: 'AWS::EC2::LaunchTemplate'
Properties:
LaunchTemplateData:
BlockDeviceMappings:
- DeviceName: '/dev/xvdcz'
Ebs:
Encrypted: true
VolumeSize: 100
VolumeType: gp2
LaunchTemplateName: BigDiskTemplate
MyComputeEnvironment:
Type: 'AWS::Batch::ComputeEnvironment'
Properties:
Type: MANAGED
ComputeEnvironmentName: MyEnv
ComputeResources:
Type: EC2
MinvCpus: 0
DesiredvCpus: 0
MaxvCpus: 256
LaunchTemplate:
LaunchTemplateName: BigDiskTemplate
InstanceTypes:
- optimal
- c5.large
Subnets:
- !Ref Subnet
SecurityGroupIds:
- !Ref SecurityGroup
InstanceRole: !Ref IamInstanceProfile
ServiceRole: !Ref BatchServiceRole
}
是的,我希望磁盘是临时的。是的,我知道一些 EC2 实例支持更大的磁盘,但我也想用 GPU 实例来做到这一点。
当我在容器中 运行 lsblk
时,我得到:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme1n1 259:0 0 100G 0 disk
└─nvme1n1p1 259:6 0 100G 0 part
nvme0n1 259:1 0 8G 0 disk
├─nvme0n1p1 259:2 0 8G 0 part /etc/hosts
└─nvme0n1p128 259:3 0 1M 0 part
太棒了!这是我的 100GB 磁盘。 但我不知道如何安装它。 基于示例和教程(无可否认,对于 EC2)模板磁盘应该可以用类似的东西安装:
file -s /dev/nvme1n1
mkfs -t xfs /dev/nvme1n1
mkdir /data
mount /dev/nvme1n1 /data
然而,这些步骤中的大多数都会出错。如“/dev/nvme1n1: cannot open `/dev/nvme1n1' (No such file or directory)”; "mkfs.xfs: 没有那个文件或目录"; “装载:/数据:权限被拒绝” 我也尝试过不同的驱动器名称 - 例如。 /dev/nvme1n1p1、nvme1n1 或 /nvme1n1/nvme1n1p1
那么我如何将这个磁盘安装到我的容器中呢? Docker 是问题的一部分吗?
以下是您应该采取的步骤:
- 将卷附加到 EC2 实例。现在
lsblk
应该会显示设备。 - 将设备安装(并格式化)到
/data
这样的位置。设置权限等。 - 在任务定义中,声明一个指向
/data
的卷。 - 在您的容器定义中,声明一个挂载点。
您不能/不应将设备直接挂载到容器。
编辑:第 2 步的详细信息
可以将用户数据脚本添加到您的启动配置中。这样您就可以挂载(和格式化)设备。以此脚本为例:
#!/bin/bash
# Device name. NOT block name like 'nvme0n1p1'.
device="/dev/sdp"
# Where to mount the device.
mountpoint="/data"
# Wait for device.
while [[ ! -b $(readlink -f ${device}) ]]; do
echo "waiting for ${device}">&2; sleep 2;
done
# Format if not already formatted.
blkid $(readlink -f ${device}) || mkfs -t ext4 $(readlink -f ${device})
# Mount.
mkdir -p ${mountpoint}
mount $(readlink -f ${device}) ${mountpoint}
chmod 666 ${mountpoint}
# Persist the volume in /etc/fstab so it gets mounted again.
echo "$(readlink -f ${device}) ${mountpoint} ext4 defaults,nofail 0 2" >> /etc/fstab