无法通过 SSH 连接到从自动缩放组启动的 EC2 实例

Can't SSH into EC2 instance launched from an autoscale group

TL;DR: 我正在使用自动缩放组生成一个 EC2 实例,我可以 连接 到它。但是我无法使用我在自动缩放组中指定的 SSH 密钥对成功登录 到该实例。


我已经使用 Terraform 创建了一个自动缩放组来启动 EC2 实例。这是自动缩放组:

module "ssh_key_pair" {
  source  = "cloudposse/key-pair/aws"
  version = "0.18.3"

  name      = "myproj-ec2"

  ssh_public_key_path = "."
  generate_ssh_key    = true
}

module "autoscale_group" {
  source  = "cloudposse/ec2-autoscale-group/aws"
  version = "0.30.0"

  name      = "myproj"

  image_id                    = data.aws_ami.amazon_linux_2.id
  instance_type               = "t2.small"
  security_group_ids          = [module.sg.id]
  subnet_ids                  = module.subnets.public_subnet_ids
  health_check_type           = "EC2"
  min_size                    = 1
  desired_capacity            = 1
  max_size                    = 1
  wait_for_capacity_timeout   = "5m"
  associate_public_ip_address = true
  user_data_base64            = base64encode(templatefile("${path.module}/user_data.tpl", { cluster_name = aws_ecs_cluster.default.name }))

  key_name = module.ssh_key_pair.key_name

  # Auto-scaling policies and CloudWatch metric alarms
  autoscaling_policies_enabled           = true
  cpu_utilization_high_threshold_percent = "70"
  cpu_utilization_low_threshold_percent  = "20"
}

user_data.tpl 文件如下所示:

#!/bin/bash
echo ECS_CLUSTER=${cluster_name} >> /etc/ecs/ecs.config

# Set up crontab file
echo "MAILTO=webmaster@myproj.com" >> /var/spool/cron/ec2-user
echo " " >> /var/spool/cron/ec2-user
echo "# Clean docker files once a week" >> /var/spool/cron/ec2-user
echo "0 0 * * 0 /usr/bin/docker system prune -f" >> /var/spool/cron/ec2-user
echo " " >> /var/spool/cron/ec2-user

start ecs

实例生成,当我第一次使用 DNS 名称 SSH 进入生成的实例时,我可以成功连接。(SSH 服务器returns 第一次连接时的主机密钥,与实例控制台输出中列出的主机密钥相同。批准后,主机密钥被添加到 ~/.ssh/known_hosts。)

然而,尽管创建了 ssh_key_pair 并在创建自动缩放组时指定了密钥对 key_name,但我无法成功 登录到生成的实例。 (我已经检查过,密钥对存在于 AWS 控制台中,使用预期的名称。)当我在命令行上使用 SSH 时,指定创建的密钥对的私钥一半,上面的握手成功,但随后连接最终失败:

debug1: No more authentication methods to try. ec2-user@myhost.us-east-2.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

当我使用 AWS 控制台中的“连接”按钮并单击“SSH 客户端”选项卡时,它显示:

No associated key pair

This instance is not associated with a key pair. Without a key pair, you can't connect to the instance through SSH.

You can connect using EC2 Instance Connect with just a valid username. You can connect using Session Manager if you have been granted the necessary permissions.

我也无法使用 EC2 Instance Connect,它失败了:

There was a problem connecting to your instance

Log in failed. If this instance has just started up, wait a few minutes and try again. Otherwise, ensure the instance is running on an AMI that supports EC2 Instance Connect.

我正在使用带有正则表达式 amzn2-ami-ecs-hvm.*x86_64-ebsmost_recent AMI,据我所知,它预装了 EC2 Instance Connect。

我是否遗漏了 user_data 模板中的一个步骤?我还在某处读到一些关于实例角色可能会影响这一点的内容,但我无法弄清楚如何使用像这样自动生成的实例来配置它。

您现在发布的内容以及您之前的问题都是正确的。没有理由不能通过 ssh 进入实例。 您必须确保在 ssh 命令中使用 myproj-ec2 私有 ssh 密钥,例如:

ssh -i ./myproj-ec2 ec2-user@<instance-public-ip-address>

ec2-instance-connect 也没有安装在 ECS-optimized 个实例上。如果要使用它,则必须手动安装它。

p.s。我不会检查您的 user_data 或任何 iam 角色,因为它们与您的 ssh 问题无关。如果您对这些有疑问,应该提出新问题。