Terraform AWS ASG: ошибка: тайм-аут - последняя ошибка: ssh: сбой при рукопожатии: ssh: невозможно выполнить аутентификацию - PullRequest
0 голосов
/ 05 июля 2019

Я использую 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
  }
}

1 Ответ

1 голос
/ 05 июля 2019

Вам необходимо предоставить сведения о соединении , чтобы поставщик файлов мог подключиться к экземпляру ASG.

К сожалению, ресурс ASG только косвенно управляет экземплярами, которые он создает, и поэтому не возвращает эту информацию.

Вы можете иметь aws_instance источник данных , зависящий от ASG, и использовать его для поиска экземпляров, которые он создает, но изменение экземпляра путем подключения к нему после того, как ASG создала, является анти-шаблоном и не поможет вам, если ASG заменит экземпляры, поскольку вы и ваше программное обеспечение для автоматизации (например, Terraform) не находятся в цикле в этой точке.

Вместо этого вы должны попытаться запечь любую общую конфигурацию (например, установку Ghost и его зависимостей в вашем случае, я думаю?) В AMI, используя что-то вроде Packer . Для всего, что должно отличаться в разных средах, используйте пользовательские данные для внесения этих изменений при создании экземпляра или что-то более динамичное и основанное на времени выполнения, например Consul .

...