Почему нельзя терраформировать SSH в инстанс EC2, используя предоставленный пример?

Я использую двухуровневый пример AWS, и у меня есть прямое копирование - наклеил все это дело. terraform apply работает вплоть до того места, где пытается подключиться по SSH к созданному экземпляру EC2. Он повторяет несколько раз, выдавая этот результат, прежде чем окончательно терпит неудачу.

aws_instance.web (remote-exec): Connecting to remote host via SSH...
aws_instance.web (remote-exec):   Host: 54.174.8.144
aws_instance.web (remote-exec):   User: ubuntu
aws_instance.web (remote-exec):   Password: false
aws_instance.web (remote-exec):   Private key: false
aws_instance.web (remote-exec):   SSH Agent: true

В конечном итоге это не удается с:

Error applying plan:

1 error(s) occurred:

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

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.

Я искал и видел некоторые старые сообщения / проблемы, в которых говорилось, что перевернуть agent=false, и я пробовал это также без изменений или успеха. Я скептически отношусь к тому, что этот пример неисправен из коробки, но я не делал никаких доработок или модификаций, которые могли бы его сломать. Я использую terraform 0.6.11, установленный через homebrew на OS X 10.10.5.

Дополнительная деталь:

resource "aws_instance" "web" {
  # The connection block tells our provisioner how to
  # communicate with the resource (instance)
  connection {
    # The default username for our AMI
    user = "ubuntu"

    # The connection will use the local SSH agent for authentication.
    agent = false
  }

  instance_type = "t1.micro"

  # Lookup the correct AMI based on the region
  # we specified
  ami = "${lookup(var.aws_amis, var.aws_region)}"

  # The name of our SSH keypair we created above.
  key_name = "${aws_key_pair.auth.id}"

  # Our Security group to allow HTTP and SSH access
  vpc_security_group_ids = ["${aws_security_group.default.id}"]

  # We're going to launch into the same subnet as our ELB. In a production
  # environment it's more common to have a separate private subnet for
  # backend instances.
  subnet_id = "${aws_subnet.default.id}"

  # We run a remote provisioner on the instance after creating it.
  # In this case, we just install nginx and start it. By default,
  # this should be on port 80
  provisioner "remote-exec" {
    inline = [
      "sudo apt-get -y update",
      "sudo apt-get -y install nginx",
      "sudo service nginx start"
    ]
  }
}

И из файла переменных tf:

variable "key_name" {
  description = "Desired name of AWS key pair"
  default = "test-keypair"
}

variable "key_path" {
  description = "key location"
  default = "/Users/n8/dev/play/.ssh/terraform.pub"
}

но я могу использовать ssh с помощью этой команды:

ssh -i ../.ssh/terraform [email protected]

person n8gard    schedule 13.02.2016    source источник
comment
ты можешь подключиться по обычному ssh? У вас есть ключи в вашем агенте?   -  person Jakuje    schedule 13.02.2016
comment
я смог использовать ssh вручную. Я не уверен, что понимаю ваш второй вопрос, поэтому ответ, вероятно, «нет». Не могли бы вы объяснить?   -  person n8gard    schedule 13.02.2016
comment
Обновите вопрос, указав информацию как вы можете ssh из командной строки и как пройти аутентификацию.   -  person Jakuje    schedule 13.02.2016
comment
добавил некоторую информацию. Благодарность!   -  person n8gard    schedule 13.02.2016


Ответы (4)


У вас есть две возможности:

  1. Добавьте свой ключ в свой ssh-agent:

    ssh-add ../.ssh/terraform
    

    и используйте agent = true в своей конфигурации. Кейс должен работать на вас

  2. Измените свою конфигурацию, чтобы использовать ключ напрямую с

    secret_key = "../.ssh/terraform"
    

    или так. Пожалуйста, обратитесь к документации для более точного синтаксиса.

person Jakuje    schedule 13.02.2016
comment
@NathanHinchey не стесняйтесь использовать голоса за ответы, которые сработали для вас и помогли вам. - person Jakuje; 21.03.2018
comment
@Jakuje Я прокомментировал, потому что этому ответу более 2 лет, поэтому я хотел подтвердить, что это решение все еще актуально для текущих / ближайших будущих читателей - person Nathan Hinchey; 21.03.2018
comment
Если у вас уже установлен ssh-agent, возможно, вам просто нужно сделать ssh-add - person Paul Odeon; 31.05.2018
comment
@PaulOdeon ssh-add добавляет только ключи в расположение по умолчанию (id_(rsa|dsa|ecdsa|ed25519)), что явно не так. - person Jakuje; 31.05.2018
comment
@Jakuje, ты прав, хотя это не относилось ко мне, и Google привел меня сюда :) - person Paul Odeon; 31.05.2018

У меня была такая же проблема, и я сделал следующие конфигурации

connection {
    type = "ssh"
    user = "ec2-user"
    private_key = "${file("*.pem")}"
    timeout = "2m"
    agent = false
}
person Vasanth Umapathy    schedule 02.06.2016

Ниже приведен полный и автономный resource "null_resource" с remote-exec средством обеспечения с подключением SSH, включая необходимые аргументы, поддерживаемые типом подключения ssh:

  • private_key - содержимое ключа SSH, используемого для подключения. Их можно загрузить из файла на диске с помощью файловой функции. Это имеет приоритет перед паролем, если он указан.

  • type - тип подключения, который следует использовать. Допустимые типы: ssh и winrm. По умолчанию ssh.

  • пользователь - пользователь, которого мы должны использовать для подключения. По умолчанию используется root при использовании типа ssh и по умолчанию - Administrator при использовании типа winrm.

  • хост - адрес ресурса, к которому нужно подключиться. Обычно это указывается провайдером.

  • порт - порт для подключения. По умолчанию 22 при использовании типа ssh и 5985 при использовании типа winrm.

  • тайм-аут - тайм-аут ожидания, пока соединение станет доступным. По умолчанию это 5 минут. Должны быть представлены в виде строки, например, 30 или 5 метров.

  • агент - установите значение false, чтобы отключить использование ssh-agent для аутентификации. В Windows единственным поддерживаемым агентом аутентификации SSH является Pageant.

ресурс null_resource с remote-exec примером кода ниже:

resource "null_resource" "ec2-ssh-connection" {
  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y python2.7 python-dev python-pip python-setuptools python-virtualenv libssl-dev vim zip"
    ]

    connection {
      host        = "100.20.30.5"  
      type        = "ssh"
      port        = 22
      user        = "ubuntu"
      private_key = "${file(/path/to/your/id_rsa_private_key)}"
      timeout     = "1m"
      agent       = false
    }
  }
}
person Exequiel Barrirero    schedule 21.03.2019

  1. Проверьте имя пользователя, которое существует в базовом образе. Например, это может быть ubuntu для ОС Ubuntu или ec2-user для образов AWS.
    В качестве альтернативы, большинство облачных провайдеров позволяют Terraform создавать нового пользователя при первом запуске с помощью cloud-init config (проверьте документацию вашего провайдера):

    metadata = {
        user-data = "${file("./user-meta-data.txt")}"
    }
    

    user-meta-data.txt:

    #cloud-config
    users:
      - name: <NEW-USER-NAME>
        groups: sudo
        shell: /bin/bash
        sudo: ['ALL=(ALL) NOPASSWD:ALL']
        ssh-authorized-keys:
        - ssh-rsa <SSH-PUBLIC-KEY>
    
  2. Увеличьте настройки тайм-аута подключения, иногда для запуска облачной сети экземпляра с ssh требуется 1-2 минуты.

    connection {
       type = "ssh"
       user = "<USER_NAME>"
       private_key = "${file("pathto/id_rsa")}"
       timeout = "3m"
    }
    

Если не работает, попробуйте подключиться вручную по ssh с -v для verbose

ssh -v -i <path_to_private_key/id_rsa> <USER_NAME>@<INSTANCE_IP>
person Artru    schedule 03.04.2021