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



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服务器在第一次连接时返回一个主机密钥,与实例控制台输出中列出的主机密钥相同。批准后,主机密钥将添加到~/.ssh/known_hosts。)

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

debug1:不再尝试身份验证方法。ec2-user@myhost.us-east-2.compute.amazonaws.com:权限被拒绝(公钥、gssapi-keyex、带麦克风的gssapi)。

当我使用AWS控制台中的Connect按钮并单击;SSH客户端";标签,上面写着:

没有关联的密钥对

此实例未与密钥对相关联。如果没有密钥对,就无法通过SSH连接到实例。

您可以只使用有效的用户名使用EC2实例连接进行连接。如果您已被授予必要的权限,则可以使用会话管理器进行连接。

我也不能使用EC2实例连接,它失败了:

连接到实例时出现问题

登录失败。如果此实例刚刚启动,请等待几分钟,然后重试。否则,请确保实例在支持EC2实例连接的AMI上运行。

我使用的是带有regexamzn2-ami-ecs-hvm.*x86_64-ebsmost_recentAMI,据我所知,它是与EC2实例连接一起预装的。

我是否缺少user_data模板中的一个步骤?我在某个地方也读到了一些关于实例角色可能会影响这一点的内容,但我不知道如何用这样一个自动生成的实例来配置它。

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

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

另外,ECS优化实例上也没有安装ec2-instance-connect。如果你想使用它,你必须手动安装。

p.s.我不会检查您的user_data或任何iam角色,因为它们与您的ssh问题无关。若你们对这些问题有意见,那个么就应该提出新的问题。

最新更新