无法通过 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-ebs
的 most_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 问题无关。如果您对这些有疑问,应该提出新问题。
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-ebs
的 most_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 问题无关。如果您对这些有疑问,应该提出新问题。