Scalingグループ内のEC2インスタンスが起動、終了する際、一時的に起動、終了処理を停止し、その間にソフトウェアのインストールやログの退避などを行うことができます。グループにライフサイクルフックを追加する機能を提供します。インスタンスライフサイクルのイベントを認識し、対応するライフサイクルイベントが発生したときにカスタムアクションを実行できます。ライフサイクルフックこちらを利用して、予期せぬスケールイン(インスタンス終了)が発生した際に、障害調査用のAMIを取得する流れを実装することができたので紹介します。Scalingグループで予期せぬスケールインが発生したのですが、AMIの取得やログの退避をしておらず、障害調査ができなかったことがありました。Scalingグループに手動で変更を加えない予期せぬスケールイン発生時のみAMIを取得し、予定されたリリースなどによるCloudFormation実行時にはAMIを取得しない実装方法イメージ全体の流れは以下の図の通り。要件のうち3つ目の予期せぬスケールイン発生時のみAMIを取得し、予定されたリリースなどによるCloudFormation実行時にはAMIを取得しないをどのように判定するかで悩みましたが、サポートにS3,EFS,DynamoDBなどにリリース時かそうでないかを示す情報を記録しておき、Lambdaから都度参照することで判定するという方法を提案して頂き、これをヒントに以下のような実装としました。ない場合は、終了イベントを継続コードプログラムっぽく書くと以下のようなかたちになる。}}実際のソースコードはこちらにまとめました。ポイント環境変数を利用する過去のグループ名をすべて保持しておく必要がないため、DB系は使用しませんでした。古いグループ削除の順に行われるので、起動時に先に環境変数の更新が可能となっています。先に更新をかけることで、後の終了イベント発生時にAMIを取得しない判定となります。走りますが、同一グループからのイベントなので、実際は環境変数の値は保持されることになります。これにより後の終了イベント時にAMIを作成する判定となります。起動と終了のライフサイクルを使用する当初は終了イベントのみで考えていましたが、上記の通り、環境変数の更新が必要だったため、起動イベントのライフサイクルも使用しました。起動イベントでは5分間の待機時間を設定し、ALBへの登録を待機するようにしています。イベント継続リクエストライフサイクルフックにはHeartbeatTimeoutと呼ばれる時間があり、この時間の間は起動、終了処理は一時停止されます。APIで終了リクエストを送ることで、一時停止を解除することができる。秒)AMI取得には時間がかかる場合があるので、HeartbeatTimeoutを1800秒(30分)に設定し、継続リクエストは送信していません。Scalingライフサイクルフックを利用して、AMIを取得する方法を紹介しました。Scalingによる予期せぬインスタンス終了時に、手動でAMIを作るのは困難なので、ライフサイクルフックで自動化しておくことで、対応時間外でもAMIを取得でき、障害調査にもつなげやすくなりました。AMIを取得以外にもログの退避だけもできると思うので、今度やってみようと思います。ライフサイクルフックCompleteLifecycleActionmn87バッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。