opswitchで停止保護が設定されたEC2インスタンスを停止できるか試してみた

答えは「停止できません」なのですが、結論はさておき、記事を通じてopswitchはいいぞ!!!が伝わればいいと思います。
2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは。

AWS事業本部コンサルティング部の芦沢(@ashi_ssan)です。

少し前にEC2の停止保護機能がアップデートで追加されたことは記憶に新しいかと思います。

このアップデートを機に数々のブログが執筆されました。

弊社メンバーの関心が高いアップデートだったことが伺えます。

そんな数々のブログを読みながら私は思いました。停止保護を有効にするとopswitchからの停止もできなくなるのかな、と。

。。。。。。

答えはもちろん「停止できません」なのですが、opswitchの紹介も兼ねてブログにしてみました。最後までご覧いただけると幸いです。

opswitch とは?

opswitchは弊社クラスメソッドが自社開発しているAWSのジョブ実行を誰でも簡単にスケジューリングできるサービスです。

私もお客様のAWS環境構築をする際に、EC2の停止起動のスケジューリングやAMI取得を自動化する際にいつもお世話になっているサービスです。

使い始め方は簡単。以下の4ステップで誰にでも作成できます。

  • 1.opswitchのアカウントを作る
  • 2.組織を作成する
  • 3.AWSアカウントを連携する
  • 4.タスクとジョブを作成する

詳細の手順はこちらのブログやopswitchサポートページを確認してみてください!

opswitchからEC2を停止してみた

EC2を起動するタスク、停止するタスクがそれぞれ既に作成できている状態から、今回のやってみたは始まります。


まず、テストのためにこんなジョブを作成してみました。

ジョブ内にEC2を停止させるタスク、EC2を起動させるタスクを登録し、ジョブを実行すると停止→起動の順に実行されます。

次に、EC2インスタンスの停止保護をオフにした状態でジョブを実行してみます。

ジョブの実行履歴はこちらから確認できます。

タスクが成功しているので、問題なく停止できたようですね。

opswitchの実行ログはこちらから確認できます。

以下実行ログからの抜粋ですが、インスタンスに対しStop instanceを実行し、その後3回のステータスチェックが実行されているように見えます。タスクの実行結果も成功になっています。

[2022-07-07 20:12:22,931] INFO  - Subtask: --------------------------------------------------------------------------------
[2022-07-07 20:12:22,931] INFO  - Subtask: Starting attempt 1 of 10
[2022-07-07 20:12:22,931] INFO  - Subtask: --------------------------------------------------------------------------------
[2022-07-07 20:12:22,931] INFO  - Subtask: 
[2022-07-07 20:12:23,493] INFO  - Subtask: Run job: Ec2StartStop-Job
[2022-07-07 20:12:24,342] INFO  - Subtask: Stop instance from task id: ec2-stop
[2022-07-07 20:12:24,342] INFO  - Subtask: 139917698094848 Get credentials for aws account  123456789012
[2022-07-07 20:12:24,342] INFO  - Subtask: 139917698094848 Get instance for region: ap-northeast-1
[2022-07-07 20:12:24,342] INFO  - Subtask: 139917616215808 Stop instance id:  i-xxxxxxxxxxxxxxxxx  ... 
[2022-07-07 20:12:24,700] INFO  - Subtask: 139917616215808 Job check-status instance i-xxxxxxxxxxxxxxxxx
[2022-07-07 20:12:39,840] INFO  - Subtask: 139917616215808 Check status instance i-xxxxxxxxxxxxxxxxx - check count 1 - status stopping
[2022-07-07 20:12:59,904] INFO  - Subtask: 139917616215808 Check status instance i-xxxxxxxxxxxxxxxxx - check count 2 - status stopping
[2022-07-07 20:13:19,983] INFO  - Subtask: 139917616215808 Check status instance i-xxxxxxxxxxxxxxxxx - check count 3 - status stopping
[2022-07-07 20:13:40,060] INFO  - Subtask: 139917616215808 State last : stopped
[2022-07-07 20:13:41,042] INFO  - Subtask: タスク名: ec2-stop 
[2022-07-07 20:13:41,042] INFO  - Subtask: タスク種別: EC2インスタンスの起動・停止 
[2022-07-07 20:13:41,042] INFO  - Subtask: ターゲットタグKey: Ec2StartStop 
[2022-07-07 20:13:41,042] INFO  - Subtask: ターゲットタグValue: on 
[2022-07-07 20:13:41,042] INFO  - Subtask: タスク実行結果: 成功
[2022-07-07 20:13:41,042] INFO  - Subtask: 開始日時: 2022-07-07 20:12:24
[2022-07-07 20:13:41,042] INFO  - Subtask: 終了日時: 2022-07-07 20:13:40
[2022-07-07 20:13:41,042] INFO  - Subtask: -------------------------------------------------------------------------------------------
[2022-07-07 20:13:41,043] INFO  - Subtask: 
[2022-07-07 20:13:41,043] INFO  - Subtask: 停止したEC2インスタンス数: 1
[2022-07-07 20:13:41,043] INFO  - Subtask: -------------------------------------------------------------------------------------------


続いて停止保護を有効に変更してから再度ジョブを実行しました。

ジョブの実行履歴を確認するとリトライを10回繰り返したのち、ジョブは失敗しているようです。

停止失敗時の実行ログはこちらです。

Stop instanceが実行されましたが、その後のステータスチェック×3でエラーが出ており、「タスク実行結果: 失敗」と表示されていますね。停止保護のパワーです。

[2022-07-07 20:18:27,784] INFO  - Subtask: --------------------------------------------------------------------------------
[2022-07-07 20:18:27,785] INFO  - Subtask: Starting attempt 1 of 10
[2022-07-07 20:18:27,785] INFO  - Subtask: --------------------------------------------------------------------------------
[2022-07-07 20:18:27,785] INFO  - Subtask:
[2022-07-07 20:18:28,514] INFO  - Subtask: Run job: Ec2StartStop-Job
[2022-07-07 20:18:29,373] INFO  - Subtask: Stop instance from task id: ec2-stop
[2022-07-07 20:18:29,373] INFO  - Subtask: 140162607990528 Get credentials for aws account 123456789012
[2022-07-07 20:18:29,373] INFO  - Subtask: 140162607990528 Get instance for region: ap-northeast-1
[2022-07-07 20:18:29,373] INFO  - Subtask: 140162591180544 Stop instance id:  i-xxxxxxxxxxxxxxxxx  ...
[2022-07-07 20:18:29,724] INFO  - Subtask: 140162591180544 [2022-07-07 20:18:29 ]  - File: botoextent_insightwatch - Line: 439}  - Type: ClientError - Error: An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
[2022-07-07 20:18:29,724] INFO  - Subtask: 140162591180544 Stop instance error An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
[2022-07-07 20:18:29,725] INFO  - Subtask: 140162591180544 [2022-07-07 20:18:29 ] File: task_ec2_instance_stop_start Line : 28  - Type: ClientError - Error: An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
[2022-07-07 20:18:30,014] INFO  - Subtask: タスク名: ec2-stop
[2022-07-07 20:18:30,014] INFO  - Subtask: タスク種別: EC2インスタンスの起動・停止
[2022-07-07 20:18:30,014] INFO  - Subtask: ターゲットタグKey: Ec2StartStop
[2022-07-07 20:18:30,014] INFO  - Subtask: ターゲットタグValue: on
[2022-07-07 20:18:30,014] INFO  - Subtask: タスク実行結果: 失敗
[2022-07-07 20:18:30,014] INFO  - Subtask: 開始日時: 2022-07-07 20:18:29
[2022-07-07 20:18:30,014] INFO  - Subtask: 終了日時: 2022-07-07 20:18:29
[2022-07-07 20:18:30,014] INFO  - Subtask: -------------------------------------------------------------------------------------------
[2022-07-07 20:18:30,014] INFO  - Subtask: EC2インスタンスID: i-xxxxxxxxxxxxxxxxx
[2022-07-07 20:18:30,014] INFO  - Subtask: エラーメッセージ: Error change state instance : An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxxxxxxxxx' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.
[2022-07-07 20:18:30,014] INFO  - Subtask: -------------------------------------------------------------------------------------------
[2022-07-07 20:18:30,014] INFO  - Subtask:
[2022-07-07 20:18:30,015] INFO  - Subtask: 停止したEC2インスタンス数: 0
[2022-07-07 20:18:30,015] INFO  - Subtask: -------------------------------------------------------------------------------------------

まとめ

停止保護が有効なEC2インスタンスはopswitchでも停止できません。

と結論は明白な検証でしたが、以下のような

  • 停止起動操作が1ボタンで実行できる
  • タスク失敗時にリトライ処理を実施してくれる
  • ジョブの実行ログの確認が簡単

opswitchのいいところがふんだんに詰め込まれた検証ブログをかけた!と自負しています。

読者の皆様に伝わっていれば幸いです。

最後に

今回のブログでは、opswitchで停止保護が設定されたEC2インスタンスを停止できるかの検証とともに、opswitchの紹介をしてみました。

opswitchの良さがさらに伝わり、さらにたくさんの方々に利用いただけるようになればいいなぁと思いながら本エントリを終了します。

最後に、クラスメソッド19回目の創立記念日おめでとう!!!!

以上、AWS事業本部コンサルティング部の芦沢(@ashi_ssan)でした。