ssh:握手失败:ssh:无法验证,已尝试方法 [none publickey],没有支持的方法

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

我正在尝试使用 Terraform 供应器 remote-exec 在 ec2 实例上安装 Nginx,但我一直 运行 进入此错误。

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

这就是我的代码的样子

resource "aws_instance" "nginx" {
  ami                    = data.aws_ami.aws-linux.id
  instance_type          = "t2.micro"
  key_name               = var.key_name
  vpc_security_group_ids = [aws_security_group.allow_ssh.id]

  connection {
    type        = "ssh"
    host        = self.public_ip
    user        = "ec2-user"
    private_key = file(var.private_key_path)
    

  }

  provisioner "remote-exec" {
    inline = [
      "sudo yum install nginx -y",
      "sudo service nginx start"
    ]
  }
}

安全组规则设置为允许从任何地方使用 ssh。 而且我可以从我的本地机器通过 ssh 进入盒子。

不确定我在这里是否真的遗漏了。我尝试了更新版本的 Terraform,但还是同样的问题。

如果您的 EC2 实例正在为使用 cloud-init 的操作系统使用 AMI(大多数 Linux 发行版的默认图像都使用),那么您可以避免 Terraform 登录的需要SSH 通过使用 user_data 参数将脚本传递给 cloud-init:

resource "aws_instance" "nginx" {
  ami                    = data.aws_ami.aws-linux.id
  instance_type          = "t2.micro"
  key_name               = var.key_name
  vpc_security_group_ids = [aws_security_group.allow_ssh.id]

  user_data = <<-EOT
    yum install nginx -y
    service nginx start
  EOT
}

对于包含cloud-init的操作系统,系统将运行cloud-init作为系统启动的一部分,它会访问the metadata and user data API to retrieve the value of user_data. It will then execute the contents of the script, writing any messages from that operation into the cloud-init logs

我上面描述的是 the official recommendation for how to run commands to set up your compute instance. The documentation says that provisioners are a last resort,给出的原因之一是避免必须正确配置 SSH 连接和身份验证的额外复杂性,正是这种复杂性导致您问这个问题,所以我认为尝试遵循文档中的建议是解决它的最佳方法。