1

我创建了一个EBS卷,我可以使用 Terraform 将其附加到EC2实例,但我无法弄清楚如何让 EBS 连接到由自动缩放组创建的 EC2。

有效的代码:

resource "aws_volume_attachment" "ebs_name" {
  device_name = "/dev/sdh"
  volume_id   = aws_ebs_volume.name.id
  instance_id = aws_instance.server.id
}

不起作用的代码:

resource "aws_volume_attachment" "ebs_name" {
  device_name = "/dev/sdh"
  volume_id   = aws_ebs_volume.name.id
  instance_id = aws_launch_template.asg-nginx.id
}

我希望的是一个自动扩展的启动模板,它添加了一个已经存在的 EBS,允许高性能的 EBS 共享,而不是“我们告诉你不要把代码放在那里” EFS 共享。

编辑:我正在使用多附件EBS。我可以手动将它附加到多个ASG创建的EC2实例,它可以工作。我只是不能使用 Terraform 来做到这一点。

编辑 2:我最终确定了Terraformuser_data中的一个条目,该条目运行AWS命令​​行 bash 脚本来附加多附加 EBS。

脚本:

#!/bin/bash
[…aws keys here…]
aws ec2 attach-volume --device /dev/sdxx --instance-id `cat /var/lib/cloud/data/instance-id` --volume-id vol-01234567890abc
reboot

地形:

data "template_file" "shell-script" {
  template = file("path/to/script.sh")
}
data "template_cloudinit_config" "script_sh" {
  gzip = false
  base64_encode = true
  part {
    content_type = "text/x-shellscript"
    content      = data.template_file.shell-script.rendered
  }
}
resource "aws_launch_template" "template_name" {
  […]
  user_data = data.template_cloudinit_config.mount_sh.rendered
  […]
}

这里的风险是将用户的 AWS 密钥存储在脚本中,但由于脚本从不存储在服务器上,所以没什么大不了的。任何user_data有权访问的人都可以访问比您在此处使用的密钥更好的密钥。

4

1 回答 1

0

这将需要在每次创建新实例作为扩展事件的一部分时执行 Terraform,这需要自动调用。

相反,您应该考虑为您的自动缩放组添加生命周期挂钩

您可以将主题配置为触发 SNS 通知,该通知调用Lambda函数以附加到您的新实例。

于 2020-07-16T18:20:19.767 回答