4
0

More than 3 years have passed since last update.

【aws-cli】EC2インスタンスを起動停止時刻でフィルタする

Last updated at Posted at 2021-07-24

aws-cliではec2 describe-instancesを利用してEC2インスタンスの一覧を取得できます。
ここではインスタンス一覧取得時にインスタンスの起動時刻・停止時刻でフィルタするサンプルとなります。

先に結果を書いてしましますが、インスタンスの開始時刻についてはフィルタするのに問題はないのですが。

停止時刻の方についてはマネージメントコンソールやCLIでAPIを利用してシャットダウンした場合は停止時刻を後から確認できますが、OSからシャットダウンをすると現状、ec2 describe-instancesで停止時刻を取得する方法はなさそう?

利用するaws-cliのバージョン

今回利用しているaws-cliのバージョンについては下記となります

  • aws-cli/2.2.22 Python/3.8.8 Windows/10 exe/AMD64 prompt/off

ec2 describe-instancesのドキュメント

describe-instances

起動時刻でフィルタする

describe-instancesドキュメントを確認すると、EC2インスタンスの起動時刻はLaunchTimeを参照すればよさそうな事がわかります。

またfiltersオプションでlaunch-timeフィルタ項目としても提供されている事もわかります。

filtersオプションでフィルタする

まずはfiltersオプションで提供されているlaunch-timeを利用してフィルタしてみます。

LaunchTime項目はyyyy-MM-ddThh:mm:ss+0000の形式となっている。

現在、起動しているインスタンスで、起動時刻が2021年1月となっているインスタンスを取得する場合は下記の用に記載する
※あくまで2021年1月に起動なので、2021年1月以降ではない点に注意

# 現在起動していて2021年1月に起動したインスタンスを取得
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" "Name=launch-time,Values=2021-01*"

filtersオプションはワイルドカードが利用できますが、これだけだと◯月☓日以降といった細かい条件を指定しての抽出できません。

queryオプションでフィルタする

もうすこし細かくフィルタしたい場合は、queryオプションを利用してフィルタします。
下記のようにすると、2021年1月1日以降に起動して、現在も起動しているインスタンスの一覧を抽出できます。

# 2021年1月1日以降に起動して現在も起動しているインスタンスを取得
# queryオプション Instances[?LaunchTime>=`2021-01-01`][] 
# queryオプションで出力する項目をtag-Name,InstanceId,LaunchTime,Stateを指定
aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" --query 'Reservations[].Instances[?LaunchTime>=`2021-01-01`][].{Name:Tags[?Key==`Name`]|[0].Value,InstanceId:InstanceId,LaunchTime:LaunchTime,State:State.Name}'

停止時刻でフィルタする

describe-instances

aws-cliのドキュメントを確認した所、インスタンスを停止した時刻を直接持つ項目はなさそうです。

色々と項目を確認してみると、StateTransitionReasonにAPIからインスタンスを停止した場合に下記形式で停止時間が表示されるようなので、今回はこれを利用してフィルタしてみます。

User initiated (yyyy-MM-dd hh:mm:ss GMT)

※注意点

StateTransitionReason項目とは別にStateReasonという項目が存在し。
これはAPIドキュメントのStateReasonの値が入っていそうです。

StateReason

APIドキュメントを確認すると

  • APIを利用してシャットダウンをした場合は Client.UserInitiatedShutdown
  • OSからshutdown -hでシャットダウンした場合は Client.InstanceInitiatedShutdown

とシャットダウンの方法によりコードが分けられています。

これはちょっとStateReasonによって、StateTransitionReasonの出力形式も別になってきそう? な気配がするので確認してみます。

2021年7月現在実際に試してみると下記のようになります。(マネージメントコンソールでもaws-cliでも同様でした)

  • Client.UserInitiatedShutdown(APIでシャットダウン)ではStateTransitionReasonに時刻が表示される。
  • Client.InstanceInitiatedShutdown(OSからシャットダウン)ではStateTransitionReasonに時刻が表示されない。

Client.UserInitiatedShutdown

Client.InstanceInitiatedShutdown

ここでは試していませんがスポットインスタンスで入札価格をスポット価格が上回って停止した場合はまた別のメッセージが表示されそうですし、AWS基盤障害等で停止した場合は更に別のメッセージが入りそうな気はします。

ですので今回紹介する方法で停止時刻をフィルタできるのは、あくまで、APIでインスタンスを停止したインスタンスのみとなりそうです。

この点、注意が必要となります。

# 2021年1月1日以前に停止して現在も停止しちえるインスタンスを取得(APIを利用して停止したインスタンスのみ)
aws ec2 describe-instances --filters "Name=instance-state-name,Values=stopped" --query 'Reservations[].Instances[?StateTransitionReason<=`User initiated (2021-01-01 00:00:00 GMT)`][].{InstanceId:InstanceId,LaunchTime:LaunchTime,StateTransitionReason:StateTransitionReason,Name:Tags[?Key==`Name`].Value|[0],State:State.Name,Message:StateReason.Message}'

総評

起動開始時刻は項目として用意されているので容易に取得することができます。

停止時刻はAWS側で項目として用意されていないようなので、複数項目を組み合わせて抽出できるかとも思いましたが。

APIを利用せずにOSからシャットダウンしたケース等ではec2 describe-instancesでは停止時刻を参照できる項目はなさそうに思います。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0