【问题标题】:Terraform AWS ASG: Error: timeout - last error: ssh: handshake failed: ssh: unable to authenticateTerraform AWS ASG:错误:超时 - 最后一个错误:ssh:握手失败:ssh:无法进行身份验证
【发布时间】:2019-07-05 17:24:28
【问题描述】:

我正在使用 terraform 0.12 创建一个带有 aws 的自动缩放组,当我应用 terraform 时,我得到了:

aws_autoscaling_group.satellite_websites_asg: Still creating... [4m50s elapsed]
aws_autoscaling_group.satellite_websites_asg: Still creating... [5m0s elapsed]
aws_autoscaling_group.satellite_websites_asg: Still creating... [5m10s elapsed]
aws_autoscaling_group.satellite_websites_asg: Still creating... [5m20s elapsed]
aws_autoscaling_group.satellite_websites_asg: Still creating... [5m30s elapsed]


Error: timeout - last error: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none], no supported methods remain

如果我签入 aws,ASG 已经创建,我可以 ssh 到 ASG 中的实例

我的 .tf 文件

data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # Canonical

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
  }
}

resource "aws_launch_configuration" "satellite_websites_conf" {
  name_prefix          = "satellite_websites_conf-"
  image_id             = "${data.aws_ami.ubuntu.id}"
  instance_type        = "t3.micro"
  enable_monitoring    = "true"
  key_name             = data.terraform_remote_state.shared_infra.outputs.vpc_access_keyname
  iam_instance_profile = data.terraform_remote_state.shared_infra.outputs.ecs_iam_instance_profile
  security_groups      = [aws_security_group.ghost_ec2_http_https_ssh.id]
  user_data            = "${file("./boot-script.sh")}"

  lifecycle {
    create_before_destroy = true
  }
}


# ASG in which we'll host EC2 instance running ghost servers
resource "aws_autoscaling_group" "satellite_websites_asg" {
  name_prefix          = "satellite_websites_asg-"
  max_size             = 1
  min_size             = 1
  launch_configuration = "${aws_launch_configuration.satellite_websites_conf.name}"
  vpc_zone_identifier  = data.terraform_remote_state.shared_infra.outputs.vpc_private_subnets
  load_balancers       = ["${aws_elb.satellite_websites_elb.name}"]
  health_check_type    = "ELB"

  provisioner "file" {
    content = templatefile("${path.module}/ghost-config.json.template", {
         // somestuff
    })
    destination = "~/config.production.template"
  }
  provisioner "file" {
    source      = "${path.module}/boot-script.sh"
    destination = "~/boot-script.sh"
  }

  lifecycle {
    create_before_destroy = true
  }
}

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    您需要提供 connection details 以使文件配置器能够连接到 ASG 实例。

    不幸的是,ASG 资源仅间接管理它创建的实例,因此不会返回此信息。

    您可以拥有一个依赖于 ASG 的 aws_instance data source 并使用它来查找它创建的实例,但在 ASG 创建后通过连接到它来修改实例是一种反模式,如果 ASG 对您没有帮助替换实例,因为您和您的自动化软件(例如 Terraform)此时不在循环中。

    相反,您应该尝试使用Packer 之类的东西将任何通用配置(例如,我认为在您的情况下安装 Ghost 及其依赖项?)放入 AMI。对于需要在不同环境之间有所不同的任何内容,请使用用户数据在实例创建或更动态和基于运行时的内容(例如 Consul)上进行这些更改。

    【讨论】:

    • 谢谢,我们确实将这些东西移到了 user_data 中。
    • 只是我们阅读文档的时间不够长,但是是的,您不能“像这样”注入文件并且您必须具有 ssh 才能执行此操作是有道理的.
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2018-04-04
    • 2016-04-03
    • 2019-05-07
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多