Micro ec2インスタンスを作成しました。必要なすべてのWebソフトウェア、mysqlおよびgitをインストールしました。そのインスタンスからAMIを作成しました。そのインスタンスはEBSをルートデバイスとして使用していたため、AMIを作成するときにEBSスナップショットも取得しました。
実行中のインスタンスを終了しました。その後、Amazonマシンイメージ(AMI)からインスタンスを作成してみました。新しいインスタンスは、インスタンスにアタッチされる新しいEBSボリュームと共に開始されました。
これで、キーペアを使用して、sshキーを介してパブリックDNSアドレスへのコマンドでそのインスタンスにログインすると、
ssh -i aws/mykey.pem ubuntu@thepublicdnsname
それは言う
ssh: connect to Host <thepublickdnsname> port 22: Connection refused
なんでこんなことが起こっているの。 sshを介して同じキーで最初のインスタンスに接続できました。これで、新しいインスタンスは正確なコピーであり、ログインできません。これに関するヘルプ... ...何か不足していますか?
同じキーペアを使用して、AMIから2番目の新しいインスタンスを作成しました。
EC2インスタンスが起動して初期化されるまでに時間がかかることがわかりました。 1つは、ec2-run-instancesを呼び出してから、インスタンスの状態が「保留」から「実行中」に変わるまでの時間です。その後、sshサーバーが準備完了になるまでの追加時間があります。その時間は数分かかることがあります。
私は同じ問題を抱えていました。私の問題は、インスタンスにボリュームをアタッチしてから、ボリュームをデタッチして削除したことです。 aws docs に従ってインスタンスをマウントし、/ etc/fstabを編集しました。これが問題でした。ボリュームを切り離し、インスタンスを再起動(または停止して起動)しようとすると、このファイルに移動し、存在しないボリュームをアタッチしようとしますが、sshデーモンは起動しません。
解決策はです:別のインスタンスを作成し、問題のあるインスタンスからボリュームをデタッチし、mounted_point/etc/fstabファイルを編集して、存在しないインスタンスをマウントしようとして、問題のあるインスタンスにボリュームを再接続すると、すべて正常に機能しました。
これはおそらく元の質問に対する答えではありませんが、これはEC2への接続の問題に関してGoogleの最上位にあるため、マシンからSSH2を許可するようにセキュリティグループを必ず構成してください。
AWSは、AMIからインスタンスを起動するのに時間がかかります。接続を速すぎたり、頻繁にしようとすると、ボックスが応答しなくなります。以下の完全なスクリプトは、AMIを起動し、IPアドレスを決定し、システムが接続できるようになるまで待機します。接続に必要な時間が大幅に異なる可能性があるため、現在の価格に近いか、それ以下のスポットインスタンスでは非常にうまく機能します。
次のループにより、sleepステートメントがコメント化されたときに接続拒否エラーが発生し、インスタンスの開始後すぐに開始されました。また、スクリプトサーバーで多くの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
接続拒否ポート22エラーの別の潜在的な原因は、パブリックDNS名のつづりの間違いです。たとえば、私の一部には.compute.
と私は.computer.
そして、それはホストが存在しないようなより賢明な何かの代わりに私にポート22エラーを与えました。
インスタンスのIPアドレスを確認しましたか?固定IPを選択しない限り、実行するたびに変更されます。
同様の問題が発生しましたが、インスタンスが準仮想化の仮想化で作成されていることに気付き、hvmを使用して再作成した後、問題は解決しました。
私は別の(そして正直なところ非常に愚かな)問題を抱えていました。他の人に役立つ場合に備えて、この回答をここに投稿してください。
デバッグの一環として、いくつかの新しいインスタンスを起動しましたが、いずれも接続できなかったため、マシンを再起動しました。
今すぐ動作します! :D