質問: ### 前提・実現したいこと cloudwatchのメトリクスをSDK(PHP)で取得して EC2のコスト削減ツールを作りたいです。 1稼働時間を監視して停止している時間にインスタンスを停止したい。 2インスタンスタイプに余剰があればサイズダウンしたい。 ### 発生している問題・エラーメッセージ 12のメトリクスがわからず困っています。 1稼働しているかどうかを判断するメトリクス 2インスタンスサイズの適正がわかるメトリクス 当方は開発担当でインフラの知識がなく 周りに聞ける人もいないため、どなたかご存知の方いらっしゃいましたら 教えてください。よろしくお願いいたします。 ### 試したこと 調査してのメトリクスが近いのでは?と思いました。 (標準メトリクス) ・CPUUtilizationを取得して、〇%以下の時間帯を取得する。 ・DiskReadBytes DiskWriteBytes が0の時間帯を取得する。 (カスタムメトリクス) ・MemoryUtilization ・MemoryUsed
回答: > > 1稼働しているかどうかを判断するメトリクス > > > 「インスタンスが稼働中」とは「インスタンスが『開始』されて(かつ OS が動作して)いる状態」であり、「停止」は「シャットダウン済みの状態」というのが一般的な解釈です。なので、用語の定義から再検討が必要そうです。 「ユーザが当該インスタンスを利用中」というのを検出するためのアイデアとしては、「ユーザ XX が利用開始したよ」「ユーザ XX が利用停止したよ」というフラグをどこか(ファイルやデータベース等)に書き込んで制御する、「ユーザが利用開始時に自動起動し、利用終了後に自動終了するプロセス」を動かすようにして、そのプロセスの存在を調べる、プロセス一覧の中に該当ユーザが所有するプロセスが含まれているかどうかで判断する、などが考えられるかと思います。 > > 2インスタンスサイズの適正がわかるメトリクス > > > これもまた、何をもって適正と判断するかが困難です。最近のOSは可能な限りメモリを有効活用しようとするので、空きメモリだけでは判断できそうにありません。 一般的にはインスタンスを定常的に監視しておき、「何らかの待ち行列が XX 個を超えたら過負荷とみなす≒インスタンスサイズを増やすことを検討」などと、個別のシステム毎に定義する必要がありそうです。 一番お手軽なのは scsi さまもご提案している通り、「稼働する曜日や稼働時間を規定し、それ以外の時間は自動停止する」というものです。以前、これを実現するための仕組み を作りましたので参考にされてください。ちなみに内部では aws-sdk-php も使っています。