8

JavaでAmazonEC2APIを使い始めたところです。

ec2.runInstances(runInstancesRequest);を使用してインスタンスを作成しました。

ただし、インスタンスが起動するまでには少し時間がかかります(通常は1〜2分)。JavaEC2APIを介してマシンのパブリックDNSを取得する必要があります。

インスタンスが「保留中」の状態から「処理済み」の状態にいつ変化するかを知るにはどうすればよいですか。また、EC2APIを介してEC2インスタンスのパブリックDNSを取得するにはどうすればよいですか。

前もって感謝します。かんな

4

2 に答える 2

9

EC2オブジェクトが状態を変更したときに通知するイベントモデルやその他のシグナルはSDKによって生成されません。これを確認する唯一の方法は、オブジェクトに対して、たとえば30秒ごとにDescribeXXXXXXXX呼び出しを繰り返し発行することです。状態フィールドが変更されます。

呼び出しが実行されて応答するための最小時間は有限であるため、前の要求が完了する前に要求が発生しない間隔を見つける必要があります。または、単に応答を待ってから、さらに「n」秒待ってから呼び出しを再発行します。また、応答の合間にタイミングが設定されている場合でも、迅速なリクエストでAWSAPIをスパムすることは望ましくありません。私のコントローラーアプリケーションでは、間隔を30秒に設定し、要求を発行して応答を待ってから、間隔から経過時間を差し引いて、その時間スリープします。マルチスレッドモデルでは、ローカルCPUまたはAPIを圧倒することなく、多くのオブジェクトの状態変化を同時に追跡できます。

状態の変化が検出されると(そして、新しい状態が期待どおりであると仮定すると、障害モードを処理することを忘れないでください)、パブリックDNSアドレス(インスタンスオブジェクトの場合)を含むさまざまな説明情報を取得できます。 API応答オブジェクトで返された構造から。

于 2011-10-04T23:28:03.640 に答える
-1

実際には、POLLを使用してインスタンスのステータスを確認できます。これを行うためのBashコードをいくつか示します。JAVAに適合させてください。JavaからBashを実行する必要がないように、JavaSDKにも同様のコマンドを含めることができます。コマンド「ec2-describe-instances」は、AmazonAWSCLIから取得されます。関数またはメソッドを開始して、実行状態を待機し、インスタンスが「保留中」であるかどうかをテストし、開始していない場合または「保留中」である場合は失敗します。次に、時間を記録し、最大で3分としましょう。ループ内で「実行中」のステータスをポーリングし続け、3分の制限を確認します。「開始されていない」、「起動時間が超過した」、または「実行中」のいずれか早い方の呼び出しポイントに戻ります。

    setInstanceStatus () {
  instanceStatus=`ec2-describe-instances $INSTANCE_ID -C $CERTIFICATE_FILE -K $PRIVATE_KEY --region $REGION -U $AWS_URL`

  is_pending="`echo $instanceStatus|grep -c " pending "`"
  is_running="`echo $instanceStatus|grep -c " running "`"
  is_shutting_down="`echo $instanceStatus|grep -c " shutting-down "`"
  is_terminated="`echo $instanceStatus|grep -c " terminated "`"
  is_stopping="`echo $instanceStatus|grep -c " stopping "`"
  is_stopped="`echo $instanceStatus|grep -c " stopped "`"

  if   [ "$is_pending" -eq "1" ]; then
    status="pending"
  elif [  "$is_running" -eq "1" ]; then
    status="running"
  elif [  "$is_shutting_down" -eq "1" ]; then
    status="shutting-down"
  elif [  "$is_terminated" -eq "1" ]; then
    status="terminated"
  elif [  "$is_stopping" -eq "1" ]; then
    status="stopping"
  elif [  "$is_stopped" -eq "1" ]; then
    status="stopped"
  else
    status="bad-instance-state"
  fi
}
于 2016-06-05T22:30:33.823 に答える