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
関連記事
-
AWS Certificate Manager証明書とAmazon Route 53でAmazon API GatewayのAPIのカスタムドメイン名前解決する
AWS Certificate ManagerとAmazon Route 53と …
-
AWS Transfer Family EFS向けのSFTP対応サーバー
EFSファイルシステムは作成済です。 AWS Transfer Family S …
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
ヤマムギ vol.8 (AWS)EC2でLinuxサーバー構築ハンズオン 手順
ヤマムギとは from Mitsuhiro Yamashita 「AWSではじめ …
-
slackのbotに天気を教えてもらう(Python on AWS Lambda + API Gateway)
slackのbotにAPIの定番ともいえる天気情報を教えてもらいました。 環境は …
-
AWS RDS でMySQLインスタンスを構築する
Amazon Web ServiceにはAmazon Relational Da …
-
JAWS FESTA 2017 Reverse X re:Birth
JAWS FESTA 2017 中四国 今年はブログタイトル「JAWS FEST …
-
VyOSにSSMエージェントをインストールしました
VyOSにSSHでログインするのも面倒なので、SSMエージェントをインストールし …
-
kintoneでEveryoneに権限が設定されているアプリをAWS Lambdaで一括チェックする
こないだ、kintone Cafeでユーザーが自由に作成している環境だと、どんな …
-
VyOSでssm-userからvyosユーザーに切り替える
EC2 VyOSで/etc/resolv.confを設定しました VyOSにSS …