引导AWS服务器时Ruby Fog出现超时问题

引导AWS服务器时Ruby Fog出现超时问题,ruby,amazon-ec2,amazon-web-services,fog,Ruby,Amazon Ec2,Amazon Web Services,Fog,我已经尝试了一段时间,现在提供了一个关于AWS和fog库的小实例。我已经取得了一些成功(在我运行这段代码时,一个实例确实出现了故障),但在SSH部分我不断收到超时错误,当我深入研究时,我发现它们始终是“AuthentitActionFailed”问题 失败代码如下所示: require 'rubygems' require "fog" connection = Fog::Compute.new({ provider: "AWS", aws_secret_acc

我已经尝试了一段时间,现在提供了一个关于AWS和fog库的小实例。我已经取得了一些成功(在我运行这段代码时,一个实例确实出现了故障),但在SSH部分我不断收到超时错误,当我深入研究时,我发现它们始终是“AuthentitActionFailed”问题

失败代码如下所示:

require 'rubygems'
require "fog"

connection = Fog::Compute.new({
  provider:              "AWS",
  aws_secret_access_key: SECRET_KEY,
  aws_access_key_id:     ACCESS_KEY
})

server = connection.servers.bootstrap({
  private_key_path:  "~/.ssh/id_rsa", 
  public_key_path:   "~/.ssh/id_rsa.pub",
  username: "ubuntu"
})

大量阅读告诉我,有时这只是因为实例需要花费太长的时间才能启动,但这是非常一致的(每次我尝试它时都会发生)。有人知道我做错了什么吗

我推荐一些方法来诊断这个问题(如果你仍然有问题的话)

  • 检查您的安全组,确保端口22对您的IP/世界开放(0.0.0.0/0)
  • 尝试使用SSH手动连接
  • 如果仍然看到问题,请尝试

    ssh -v -v <normal options>
    
    ssh-v-v
    

    这将为您提供有关尝试连接到实例时发生的情况的更多信息。

    几天前我遇到了相同的问题,并且实际发现了我的案例和问题

    我的一位同事使用connection.bootstrap()时使用的AWS凭据相同,但SSH密钥不同。因此,“fog_default”公钥已经注册,尝试使用我的密钥对登录失败

    如果您遇到类似问题,请使用connection.key\u pairs.get('fog\u default')检查是否以前注册过fog\u default

    如果情况确实如此,您有三种选择来解决此问题:

    • 通过运行:connection.key\u pairs.get('fog\u default')删除fog\u default。通过bootstrap()销毁并注册新公钥
    • 在自定义名称下手动注册自定义密钥
    • 将Fog.credential设置为自定义名称,以便bootstrap()使用此名称而不是“默认”来注册公钥
    解决方案二如下所示:

    Fog.credentials = Fog.credentials.merge({
      :private_key_path => "./keys/my_custom_key",
      :public_key_path => "./keys/my_custom_key.pub"
    })
    
    if connection.key_pairs.get('my_custom_key').nil?
      public_key = IO.read('./keys/my_custom_key.pub')
      connection.import_key_pair('my_custom_key', public_key)
    end
    
    server = connection.servers.bootstrap(
      :key_name =>  'my_custom_key',
      ...
    )
    
    Fog.credential = :my_custom_key
    
    connection.servers.bootstrap(
      :private_key_path => './keys/my_custom_key',
      :public_key_path => './keys/my_custom_key.pub',
      ...
    )
    
    解决方案三,我更喜欢,因为我需要做的唯一更改是设置Fog.credential,如下所示:

    Fog.credentials = Fog.credentials.merge({
      :private_key_path => "./keys/my_custom_key",
      :public_key_path => "./keys/my_custom_key.pub"
    })
    
    if connection.key_pairs.get('my_custom_key').nil?
      public_key = IO.read('./keys/my_custom_key.pub')
      connection.import_key_pair('my_custom_key', public_key)
    end
    
    server = connection.servers.bootstrap(
      :key_name =>  'my_custom_key',
      ...
    )
    
    Fog.credential = :my_custom_key
    
    connection.servers.bootstrap(
      :private_key_path => './keys/my_custom_key',
      :public_key_path => './keys/my_custom_key.pub',
      ...
    )
    

    这似乎需要端口22,您无法将端口设置为其他任何端口,例如10022。这是真的吗?只需添加
    -p 10022
    即可连接到其他端口