我希望我的持久性 (ebs) 卷与我的自动扩展组启动配置分开。这样它就不会被 terraform 或其他东西意外自动删除。我还可以做类似的事情,/mnt/taskname
这样我就可以为每个需要数据的任务设置不同的持久性卷。
我认为它的工作原理如下。
- 安装 aws-cli 但由于某种原因缺少它(云初始化中的软件包),这会很晚发生吗?
- 使用 aws 命令附加卷
- 使用 cloud init 中的 fs_setup 格式化卷
- 使用 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