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 是问题的一部分吗?

以下是您应该采取的步骤:

  1. 将卷附加到 EC2 实例。现在 lsblk 应该会显示设备。
  2. 将设备安装(并格式化)到 /data 这样的位置。设置权限等。
  3. 在任务定义中,声明一个指向 /data 的卷。
  4. 在您的容器定义中,声明一个挂载点。

您不能/不应将设备直接挂载到容器。


编辑:第 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