如何在 ecs 中启动时连接、格式化和安装卷?

如何在 ecs 中启动时连接、格式化和安装卷?

我希望我的持久性 (ebs) 卷与我的自动扩展组启动配置分开。这样它就不会被 terraform 或其他东西意外自动删除。我还可以做类似的事情,/mnt/taskname这样我就可以为每个需要数据的任务设置不同的持久性卷。

我认为它的工作原理如下。

  1. 安装 aws-cli 但由于某种原因缺少它(云初始化中的软件包),这会很晚发生吗?
  2. 使用 aws 命令附加卷
  3. 使用 cloud init 中的 fs_setup 格式化卷
  4. 使用 cloud init 中的挂载来挂载分区

问题是,这行不通,因为 1 直到 3 和 4 之后才会发生(我认为),而且我不确定 2 是否是连接卷的正确方法。

也许我不应该使用 ecs 优化图像?这似乎可以解决我的问题,但随后我必须弄清楚如何更改 amazon(基础?)图像,以使其配置为像 ecs 图像一样?也许除了命令之外还有其他方法来连接卷aws?也许还有其他我完全没有考虑过的魔法?

答案1

这只是部分答案,因为我仍在研究它,首先,我使用的是普通的 Amazon Linux AMI,而不是 ECS 优化的 AMI(已经过时了......)

data "template_file" "AttachVolume" {
  template = "${file("cloudinit/attach_volume.sh")}"

  vars {
    volume = "${aws_ebs_volume.Nexus.id}"
  }
}

data "template_cloudinit_config" "CloudInit" {
  part {
    filename     = "fs.cfg"
    content_type = "text/cloud-config"
    content      = "${file("cloudinit/fs.yml")}"
  }
  part {
    filename = "attach_volume.sh"
    content_type = "text/cloud-boothook"
    content = "${data.template_file.AttachVolume.rendered}"
  }
}

这是最重要的部分,它将attach_volume.sh附加卷,然后对其进行分区并在必要时进行格式化。

#!/bin/sh
set -x
EC2_VOLUME_ID="${volume}"
EC2_INSTANCE_ID="`curl --silent http://169.254.169.254/latest/meta-data/instance-id`"
aws ec2 attach-volume --volume-id $EC2_VOLUME_ID --instance-id $EC2_INSTANCE_ID --device /dev/xvdh --region us-east-1
while [ ! -d /sys/block/xvdh ]; do sleep 1; done
if [ ! -d /sys/block/xvdh/xvdh1 ]; then
    echo -e "g\nn\np\n1\n\n\nw" | fdisk /dev/xvdh
    mkfs.ext4 /dev/xvdh1
fi

然后我们可以使用标准云配置来挂载它

#cloud-config
---
mounts: 
 - [ xvdh, '/srv/nexus', 'auto', 'defaults,noexec', '0', '0' ]
runcmd: 
 - [ cloud-init-per, instance, chmod, chmod, 1777, /srv/nexus ] # make like temp, then docker can write whatever user directories in their
 - [ cloud-init-per, instance, docker, service, docker, start ] # start docker
 - [ cloud-init-per, instance, ecs, start, ecs ] # start ecs

相关内容