Amazon EC2 Auto Scalingのライフサイクルフック
2021/08/04
EC2 Auto Scalingにライフサイクルフックという機能があります。
スケールアウト時にソフトウェアのデプロイを完全に完了したことを確認してからInServiceにしたり、スケールイン時に必要なデータのコピーを完了してからターミネートする場合などに利用できそうです。
起動テンプレート、オートスケーリンググループは特に何かアプリケーションとかはインストールせずにAmazon Linux2が起動するだけのものにしました。
目次
Amazon EC2 Auto Scalingライフサイクルフックの設定
スケールアウト時の設定です。
スケールイン時の設定です。
これでスケールアウト、スケールインの状態になるとPendingで停止します。
ライフサイクルフックの状態が完了したことを3600秒以内に送信すると、以下になります。
* スケールアウトしたインスタンスがオートスケーリンググループに含まれてInService状態になる。
* スケールインしたインスタンスがターミネートされる。
延長したい場合は、延長アクションも送信できるようです。
3600秒以内に送信しなければABANDON(放棄)なので、スケールアウトは起動したインスタンスの終了?、スケールインはターミネートせずにInServiceに戻るんでしょうか。
これは最後にハートビートタイムアウトを30秒に設定して試します。
Amazon Event Bridgeで通知の設定
ライフサイクルフックを設定したあとに、Event BridgeでLambdaをターゲットに設定しました。
イベントデータを確認したいためです。
LambdaはPythonで、
print(event)
だけ書き足しました。
スケールアウトで試す
希望する容量を1つ手動で増やして確認しました。
オートスケーリングのアクティビティ履歴でPreInServiceになりました。
追加されたインスタンスがPending: Waitになりました。
Lambdaイベント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ 'version': '0', 'id': '50362a17-f8d3-80e6-eefa-f0b5a87a8693', 'detail-type': 'EC2 Instance-launch Lifecycle Action', 'source': 'aws.autoscaling', 'account': '123456789012', 'time': '2021-07-23T16:52:37Z', 'region': 'us-east-1', 'resources': [ 'arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:d8684f94-57cc-4d68-b0da-ecf089019299:autoScalingGroupName/DemoASG' ], 'detail': { 'LifecycleActionToken': 'be52a503-779c-4ba5-b9f8-dacacb7b9135', 'AutoScalingGroupName': 'DemoASG', 'LifecycleHookName': 'DemoASGScaleOut', 'EC2InstanceId': 'i-0937ba087394016d0', 'LifecycleTransition': 'autoscaling:EC2_INSTANCE_LAUNCHING', 'Origin': 'EC2', 'Destination': 'AutoScalingGroup' } } |
ライフサイクルフックイベントが実行されたことと、EC2InstanceId、LifecycleActionToken、AutoScalingGroupName、LifecycleHookNameといったこのあと必要な情報がありました。
スケールアウトをPending→InServiceへ
CloudShellからコマンドで実行しました。
EC2InstanceIdを使用する方法と、LifecycleActionTokenを使用する方法があるようです。
EC2InstanceIdを使用する方法
1 2 3 4 |
aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --instance-id i-0937ba087394016d0 --lifecycle-hook-name DemoASGScaleOut \ --auto-scaling-group-name DemoASG |
LifecycleActionTokenを使用する方法
1 2 3 4 |
aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --lifecycle-hook-name DemoASGScaleOut --auto-scaling-group-name DemoASG \ --lifecycle-action-token be52a503-779c-4ba5-b9f8-dacacb7b9135 |
InServiceになりました。
アクティビティ履歴もSuccessfulに変わりました。
ちなみにタイムアウトを延長するコマンドはパラメータは同じで、
aws autoscaling record-lifecycle-action-heartbeat
でした。
スケールインで試す
オートスケーリンググループで希望する容量を減らしました。
アクティビティ履歴でMidTerminatingLifecycleActionになりました。
インスタンスはTerminateing: Waitになりました。
Lambdaイベント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ 'version': '0', 'id': 'ff98c138-ad00-77b7-5e61-00ba5ad1c03a', 'detail-type': 'EC2 Instance-terminate Lifecycle Action', 'source': 'aws.autoscaling', 'account': '123456789012', 'time': '2021-07-23T17:19:45Z', 'region': 'us-east-1', 'resources': [ 'arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:d8684f94-57cc-4d68-b0da-ecf089019299:autoScalingGroupName/DemoASG' ], 'detail': { 'LifecycleActionToken': '37abb1a4-9dbb-4c70-b7cf-ab0bd6068e96', 'AutoScalingGroupName': 'DemoASG', 'LifecycleHookName': 'DemoASGScaleIn', 'EC2InstanceId': 'i-07dc45f1e33ac0e2b', 'LifecycleTransition': 'autoscaling:EC2_INSTANCE_TERMINATING', 'Origin': 'AutoScalingGroup', 'Destination': 'EC2' } } |
スケールアウトのときとフォーマットは同じですね。
スケールインをPending→InServiceへ
スケールアウトのときはトークンを使ったので、今回はインスタンスIDでやってみます。
1 2 3 4 |
aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --instance-id i-07dc45f1e33ac0e2b --lifecycle-hook-name DemoASGScaleIn \ --auto-scaling-group-name DemoASG |
無事スケールインされました。
ABANDONのふるまい確認
ハートビートタイムアウトを30秒に変更しました。
スケールアウトさせて放置しました。
Pending:Waitになって、30秒経過すると、ターミネートされました。
でも希望する容量は+1の状態なので、次のインスタンスが起動してきて、また30秒経過してターミネートと繰り返されました。
次はスケールインして放置しました。
Terminating:Waitになって、30秒経過するとターミネートされました。
ABANDONの放棄は、リクエストの放棄ではなく、インスタンスを放棄するという意味だったのですね。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Amazon S3オブエジェクトへのリクエストをCloudTrail, Athenaで識別
こちらCloudTrail を使用した Amazon S3 リクエストの識別に書 …
-
AWS Managed Microsoft ADを構築してユーザー追加まで
事前準備 DNSホスト名と名前解決を有効にしたVPCを作成して、2つのAZにパブ …
-
EC2ユーザーデータからメタデータを取得してRocket.Chatで80ポートを使用する
Rocket.Chatのデフォルトポート番号は3000です。 80を使うようにす …
-
AWSのAmazon LinuxにGitマスターサーバをインストールしてRedmineリポジトリブラウザで見る
Amazon LinuxにGitをインストールする Gitをインストールして自動 …
-
Rocket.ChatにAWS Lambda(Python)から投稿する
Rocket.ChatにAPIで投稿するテスト(Postman)をやってみて、使 …
-
Amazon Aurora Serverlessを使い始めてみました(1日経過しての課金結果も)
祝!!! Amazon Aurora ServerlessがGAになりました! …
-
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー」執筆裏話
今日2019/4/20発売となりました「AWS認定資格試験テキスト AWS認定ク …
-
AWS Lambda(Python)でDynamoDB テーブルを日次で削除/作成(オートスケーリング付き)
この記事はAWS #2 Advent Calendar 2018に参加した記事で …
-
AWS EC2 Amazon Linux にEC-CUBE3をnginx+MySql環境へインストール(手順検証中)
EC2インスタンスを作成する 少し古い記事で恐縮ですが試したい事があるのでAWS …
-
GoogleForm,GASからAPI Gateway, Lambdaで入力情報をDynamoDBに格納する
vol.26 AWS認定試験テキスト認定クラウドプラクティショナーのデモ(Dyn …