EC2インスタンスをオンデマンドで開始し、一定期間アイドル状態になったときに停止したいのですが(たとえば、1時間以上ネットワークアクティビティがない場合)、標準的な方法がわかりません。 AWSがwake-on-LANをサポートしていないことを考えると、AWSでこれを行うことは次のようになります。
実行する予定のサービスには、永続的なネットワーク接続が必要です。 ssh。
私が目指しているユーザーエクスペリエンスは次のようになります。
ここでの私の動機は、主にコスト削減です。需要は非常に予測不可能であり(したがって、スケジュールされたインスタンスは適切ではありません)、おそらく1日あたりのアクティブ時間は12時間未満であり、ユーザーはサービスが開始されるまで数分待つことをいとわないでしょう。また、リザーブドインスタンスの価格設定で1年以上の期間に縛られたくありません。
私はまた、これをどのように達成するかについていくつかの野蛮な刺し傷を持っています、そしてそれらがどれほどもっともらしい/賢明であるかについてのフィードバックをいただければ幸いです:
ありがとう!
Lambdaはこのように機能しますが、代わりにアプリを起動するまでユーザーを待機させます。 Lambdaでは、管理するインスタンスはありませんが、すべて内部で実行されます。
また、LambdaとRoute53フェイルオーバーチェックを含む何かを実行できるかどうかを確認します。たとえば、インスタンスがダウンしている場合はユーザーがLambdaをヒットし、アップしている場合はインスタンスをヒットします。ただし、これはLambdaでは機能しない可能性があります。特定のホストヘッダーが必要です。
または、R53フェイルオーバーを再度使用して、予約済みインスタンスt2.nanoを実行して「待合室」を実行し、起動したら別のインスタンスにプロキシまたはリダイレクトします。
他のサービスを使用せずに、次のようなことを行うことができます。
import boto3
import json
def lambda_handler(event, context):
ec2 = boto3.resource('ec2')
instance = ec2.Instance(event['instance_id'])
if instance.state['Code'] == 16:
# Instance is running, do what you want
Elif instance.state['Code'] == 80:
# Instance is stopped, start it
instance.start()
return { 'status': 'instance-unavailable' }
else
# Instance is in another state
この場合、instance_id
はパラメーターによって受信されますが、もちろん、ハードコーディングすることもできます。