【问题标题】:Terraform ec2 instances + EBS issuesTerraform ec2 实例 + EBS 问题
【发布时间】:2018-11-17 12:41:52
【问题描述】:

在 Terraform 中遇到一些计数问题,想知道是否有人可以提供建议。我有一组三个实例,在我的一个模块中安装了 EBS 卷。请参阅下面的代码摘录:

  resource "aws_instance" "xxxx" {
  count = "${length(data.aws_availability_zones.all.names)}"

  ami                    = "${var.ami}"
  instance_type          = "t2.small"
  vpc_security_group_ids = ["${module.xxxx-sg.this_security_group_id}"]
  key_name               = "${var.key_name}"
  subnet_id              = "${element(module.vpc.xxxx_subnets, count.index)}"
  user_data              = "${module.xxxx-userdata.template_file}"

  tags {
    Name              = "${local.xxxx_name}"
  }

  root_block_device = [
    {
      volume_size           = 20
      volume_type           = "gp2"
      delete_on_termination = true
    },
  ]
}

这与以下代码配对以创建和附加 EBS 卷:

resource "aws_ebs_volume" "xxxx-ebs" {
  count = "${length(data.aws_availability_zones.all.names)}"

  availability_zone = "${element(data.aws_availability_zones.all.names, count.index)}"
  size              = 100
  type              = "gp2"

  tags {
    Name = "${local.xxxx_name}"
  }
}

resource "aws_volume_attachment" "xxxx-ebs-attachment" {
  count = "${length(data.aws_availability_zones.all.names)}"
  device_name = "/dev/sdg"
  volume_id   = "${aws_ebs_volume.xxxx-ebs.*.id[count.index]}"
  instance_id = "${aws_instance.xxxx.*.id[count.index]}"
}

所以上面使用的语法 (aws_ebs_volume.xxxx-ebs.*.id[count.index]) 最初是使用 Terraform 中的 element() 函数,但是当一个实例被终止/编辑时,我遇到了问题。 .Terraform 将尝试将所有 EBS 重新附加到所有实例,而不仅仅是已更改的实例。我修改了上面的语法,目前正在使用它,过去几周它一直运行良好,直到今天早上的 Terraform 运行引发了以下问题。

为了让您了解当前的状态,其中两个 xxxx 实例已终止,因此我希望它重新创建这两个实例并重新附加现有的 EBS 卷。以下错误

* module.prod-env0.aws_volume_attachment.xxxx-ebs-attachment: 2 error(s) occurred:

* module.prod-env0.aws_volume_attachment.xxxx-ebs-attachment[1]: index 1 out of range for list aws_instance.xxxx.*.id (max 1) in:
   ${aws_instance.xxxx.*.id[count.index]}

* module.prod-env0.aws_volume_attachment.xxxx-ebs-attachment[2]: index 2 out of range for list aws_instance.xxxx.*.id (max 1) in:
   ${aws_instance.xxxx.*.id[count.index]}

我很想看看其他人如何管理他们的 EBS 卷。

【问题讨论】:

  • 如果附件是在创建新实例之前创建的,您可以尝试向附件资源添加显式depends_on

标签: amazon-web-services terraform


【解决方案1】:

您的语法错误。你应该这样做

resource "aws_volume_attachment" "xxxx-ebs-attachment" {
  count = "${length(data.aws_availability_zones.all.names)}"
  device_name = "/dev/sdg"
  volume_id   = "${element(aws_ebs_volume.xxxx-ebs.*.id, count.index)}"
  instance_id = "${element(aws_instance.xxxx.*.id, count.index)}"
}

【讨论】:

  • 嗨,Koe,谢谢。我确实按照你提到的那样设置了它,但是我遇到了另一个错误。如果三个实例之一被更新/终止。它不仅尝试重新连接一个 EBS,还尝试在所有三个实例上重新连接 EBS。这显然会导致错误,因为您无法重新附加已附加的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2012-07-17
  • 2016-01-04
  • 2018-09-17
相关资源
最近更新 更多