尝试使用terraform将EBS卷附加/挂载到ECS实例

时间:2019-06-03 14:35:53

标签: terraform terraform-provider-aws

terraform中的aws_volume_attachment资源需要instance_id ...我的问题是我要将卷安装到的实例是ECS群集的一部分,在传递实例的实例ID时我似乎找不到任何聪明的例子将ECS群集添加到aws_volume_attachment,以便我可以安装现有的EBS卷。

使用ARN不起作用。

resource "aws_volume_attachment" "ebs_att" {
  device_name = "/dev/sdp"
  volume_id   = "${aws_ebs_volume.example.id}"
  instance_id = "${aws_instance.web.id}"
}

编辑 我基本上为实例增强了脚本,而我的地形看起来像这样:

data "template_file" "fleet-boothook" {
  template = "${file("${path.module}/boothook.tpl")}"

  vars {
    ecs_cluster_name = "${aws_ecs_cluster.this.name}"
    ebs_volume_id    = "${var.singleton_cluster_ebs_volume}"
  }
}

1 个答案:

答案 0 :(得分:0)

我也正在研究这个问题,我即将接受的结论是,没有简单的方法可以做到这一点。该结论得到this issuethis other one的支持。我已经看到了第三方解决方案like this one,但我不愿意在基础架构中诉诸第三方应用。

相反,this repo声称已经实现了向节点提供EFS的方法。我知道它不是EBS,但是它可以提供一种在容器和主EC2实例之间共享数据的方法,而不管容器运行在哪个特定实例上。

也许您可以找到一种将现有EC2实例附加到群集的方法,以便在配置它们时有更多控制权。这可能是我要尝试的方法,但是我意识到它不能达到使用ecs的目的的一半,后者是抽象化启动容器而不关心基础主机基础结构的方式。


修改

我设法创建了一个ECS集群,其中所有实例都安装了EFS分区。

  • 在与创建集群[1]相同的可用性区域中创建EFS卷。确保在专用子网中创建它。

  • 修改启动配置UserData [2]脚本以安装amazon-efs-utils [3]。如果您使用的是经过ecs优化的Amazon linux映像,只需将以下内容添加到脚本中:

  sudo yum install -y amazon-efs-utils
  • 添加一个步骤来创建安装点并将先前创建的EFS卷安装在UserData bash脚本中:
  mkdir -p /mnt/efs
  mount -t efs fs-12345678:/ /mnt/efs

fs-12345678更改为EFS卷的ID。

我想您可以使用诸如samba之类的东西来公开EBS卷,但是EFS不需要提供专用的EC2实例,它可以接收dns并可以直接挂载。

[1] https://docs.aws.amazon.com/efs/latest/ug/troubleshooting-efs-mounting.html#mount-fails-dns-name

[2] https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-shell-scripts

[3] https://docs.aws.amazon.com/efs/latest/ug/using-amazon-efs-utils.html