您可以将 AWS Multi-Attach EBS 卷挂载到 Terraform 中的自动扩展组吗?

Posted

技术标签:

【中文标题】您可以将 AWS Multi-Attach EBS 卷挂载到 Terraform 中的自动扩展组吗?【英文标题】:Can you mount an AWS Multi-Attach EBS volume to an auto-scaling group in Terraform? 【发布时间】:2020-11-06 11:43:13 【问题描述】:

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

有效的代码:

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 共享而不是 “我们告诉你不要把代码放在那里” em> EFS 共享。

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

编辑 2: 我最终确定了 Terraform 中的 user_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 的人都可以使用比您在此处使用的密钥更好的密钥。

【问题讨论】:

这不起作用。如果它确实有效,那么如果 ASG 循环退出实例,您期望会发生什么?您可以在 ASG 中运行有状态应用程序,但我不会尝试重用 EBS 卷 我正在使用设计为附加到多个 EC2 实例的 Multi-Attach EBS。 【参考方案1】:

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

相反,您应该考虑为您的自动缩放组添加 lifecycle hook。

您可以将主题配置为trigger an SNS notification,它会调用Lambda 函数来附加到您的新实例。

【讨论】:

这似乎是唯一可行的方法。遗憾的是,Terraform 的几页和大约十几个资源需要,而不是 ASG 资源中的一行,但这就是生活。我怀疑这是因为附加 EBS 卷是从 EBS 完成的,而不是 EC2。

以上是关于您可以将 AWS Multi-Attach EBS 卷挂载到 Terraform 中的自动扩展组吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Lambda 函数的 AWS EBS 与 EFS

将 aws 快照复制到 S3 存储桶

在 AWS beanstalk 下将特定的 EBS 卷挂载到 Docker

如何更改 cloudformation 中的默认根 EBS 大小? [AWS]

将内容从旧 EBS 卷复制到 AWS 中的新 Nitro 系统 EBS 的最佳方式(最简单/最快)?

从 Dockerrun.aws.json -AWS 增加 EBS 中的命令超时