连接被拒绝到我正在运行的Amazon EC2实例

时间:2011-02-27 13:32:54

标签: amazon-ec2

我创建了一个微型ec2实例。安装了所有必要的网络软件,mysql和git。从该实例中创建了一个AMI。由于该实例使用EBS作为其根设备,因此在创建AMI时也使用了EBS快照。

我终止了正在运行的实例。然后,我尝试创建一个亚马逊机器映像(AMI)的实例,新实例启动以及新的EBS卷附加到实例。

现在当我使用我的密钥对通过我的ssh密钥登录到该实例时,使用命令

来登录其公共DNS地址
ssh -i aws/mykey.pem ubuntu@thepublicdnsname

它说

ssh: connect to host <thepublickdnsname> port 22: Connection refused

为什么会这样。我能够通过ssh使用相同的密钥连接到我的第一个实例。现在新实例是精确的副本,我无法登录它。对此有任何帮助......?我错过了什么吗?

我使用相同的密钥对从AMI创建第二个新实例。

8 个答案:

答案 0 :(得分:17)

我发现EC2实例需要花费不同的时间才能启动并初始化。一个是调用 ec2-run-instances 之间的时间,直到实例状态从“pending”变为“running”。之后,ssh服务器准备就绪时还有一段时间。那个时间可能是几分钟。

答案 1 :(得分:9)

我遇到了同样的问题:我的问题是我的实例附加了一个卷,然后我将卷分离并删除了它。我跟着aws docs挂载了我的实例并编辑了/ etc / fstab。这就是问题:当分离卷并且您尝试重新启动(或停止并启动)实例时,它会转到此文件并尝试附加不存在的卷,并且ssh守护程序未启动。

解决方案:我必须创建另一个实例,从有问题的实例中分离卷然后编辑mounted_point / etc / fstab文件以注释它尝试挂载不存在的实例的行,将卷重新附加到有问题的实例,然后一切正常。

答案 2 :(得分:6)

这可能不是原始问题的答案,但由于这是针对EC2连接问题的Google问题,因此请确保将安全组配置为允许来自您计算机的SSH2:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AccessingInstances.html#authorizing-access-to-an-instance

答案 3 :(得分:4)

AWS需要时间从AMI调出实例。如果您尝试连接太快,而且频繁,则该框无法响应。下面的完整脚本启动AMI,确定IP地址,并等待系统准备好连接。对于接近或低于当前价格的现货实例,它可以很好地工作,因为连接所需的时间可能差异很大。

当睡眠语句被注释掉时,以下循环导致连接拒绝错误,并且在实例启动后它开始得太快。它还在脚本服务器上消耗了大量的CPU,并制作了大量的错误日志。

   `nc -z $ip_address -w 20 22` 1>/dev/null 2>&1; result=$?;
    while [ $result -eq 1 ]
      do
      #echo $ip_address booting
      `nc -z $ip_address -w 30 22` 1>/dev/null 2>&1; result=$?;
      sleep 30
    done

这是一个完整的脚本来启动实例,标记它,等待它完全启动,然后连接。

 instance_id=$(aws ec2 run-instances --region us-east-1 --count 1 --instance-type $AMItype --image-id $ami --security-group-ids $sg_group --output text --query 'Instances[*].InstanceId' )

 aws ec2 create-tags --resources $instance_id --tags "Key=Name, Value=$AMIname
 #delay until AWS says instance is running
 start_state=0
 while [ $start_state -ne 16 ]
        do
         start_state=$(aws ec2 start-instances --instance-ids $instance_id --query 'StartingInstances[*].PreviousState[*].Code[*]' )
         start_state=$(echo $start_state | tr -d '" []')
         sleep 10
 done
 ip_address=$(aws ec2 describe-instances --instance-ids $instance_id --output text --query 'Reservations[*].Instances[*].PrivateIpAddress')

 `nc -z $ip_address -w 20 22` 1>/dev/null 2>&1; result=$?;
        while [ $result -eq 1 ]
          do
           #waiting for routing updates and connectivity
           `nc -z $ip_address -w 30 22` 1>/dev/null 2>&1; result=$?;
           sleep 30
        done

答案 4 :(得分:3)

连接拒绝端口22错误的另一个可能原因是拼写错误的公共DNS名称。例如,我的一部分包含.compute.并且我放了.computer.并且它给了我一个端口22错误而不是像主机不存在那样更合理的东西。

答案 5 :(得分:2)

您检查了实例的IP地址吗?除非我选择固定IP,否则我每次运行时都会更改。

答案 6 :(得分:0)

我遇到了类似的问题,我发现实例是使用准虚拟化虚拟化创建的,并且在使用hvm进行增量创建后,问题得以解决。

答案 7 :(得分:-1)

我有一个不同的(而且非常愚蠢)问题。在这里发布这个答案,以防它帮助其他人。

作为我调试的一部分,我启动了几个新实例,但没有一个可以连接,所以我只是重新启动了我的机器!

现在有效! :d