タダです.
Aurora レプリカ Auto Scaling で追加されたイベントをトリガーに EC2 の Apache を再起動(graceful)を実行したいと思い,Lambda を発火させるようにしてみたのでこの記事でまとめていきます.
経緯
Aurora レプリカ Auto Scaling で増えたインスタンスに対して接続数が増えない事象がありました.読み込みエンドポイントを使っていれば,負荷が分散されるはずなのにうまく Auto Scaling を活用できていませんでした.
Aurora Auto Scaling から益を得るには、お使いのアプリケーションが新しい Aurora レプリカへの接続をサポートしている必要があります。これを行うには、Aurora 読み込みエンドポイントを使用することをお勧めします。
増えたレプリカに負荷が分散されてないイメージ
調査していたところ Apache を載せた EC2 からの接続が増える前のレプリカに繋いだままになっていました.Apache を再起動(gracefule)してみたところ Auto Scaling で増えたレプリカにも接続が増えたため,Auto Scaling を有効活用を目的にした Aurora レプリカ Auto Scaling のイベントをトリガーに Apache 再起動(graceful)をする Lambda を作ることにしました.
実装
EventBridge のルール
Auto Scaling のイベントを拾うための EventBridge のルールを以下の定義で設定しました.application-autoscaling-
のプレフィクスがついたリソースが作成・削除されたらイベントを拾うようにしており,このイベントをトリガーに SNS -> Chatbot で通知が来るかをまず確認したところ期待通りの通知が来ました.なお,この設定に至るまでに AWS サポートの方々にご協力いただきました,ありがとうございました!🙇♂️
{ "source": ["aws.rds"], "detail": { "EventCategories": ["creation", "deletion"], "SourceIdentifier": [{ "prefix": "application-autoscaling-" }] } }
Chatbot で通知されたイベント
EventBridge で意図したイベントを拾うことができたので,次に Lambda のコードを書いていきます.
Lambda のコード
Lambda のコードとして次のようなコードを Python 3.8 で書いていきました.Name
タグでhoge
とついた EC2 に対して SSM RunCommand 経由でsystemctl reload httpd
を実行するようなコードにしました.当然ですが,IAM ロールに SSM RunCommand を実行する権限をつけておきます.
コード例
import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) ssm = boto3.client('ssm') def lambda_handler(event, context): try: logger.info('Start RunCommand Execution') response = ssm.send_command( Targets = [{ 'Key':'tag:Name', 'Values': [ 'hoge' ] }], DocumentName='AWS-RunShellScript', Parameters = { 'commands': [ 'sudo su -', 'systemctl reload httpd' ], 'executionTimeout': ['3600'] } ) logger.info('Function complete') return "Complete."
Aurora Auto Scaling イベント発生時の Lambda 動作確認
スケジュールの Auto Scaling でレプリカを2台に増やす設定を入れてイベント発火の動作確認します.Read replica(s) application-autoscaling-4d16462e-0d83-44cc-8c27-2bbc9e06779f were successfully added by rds.
のイベントがログに記録され,Aurora レプリカが追加されたことを確認できました.
同時刻に Lambda が発火されていることをログより確認できましたので意図通りの動作確認ができました.
START RequestId: 88dbdbb0-5909-4360-8298-1e6318335067 Version: $LATEST [INFO] 2021-08-02T07:57:42.810Z 88dbdbb0-5909-4360-8298-1e6318335067 Start RunCommand Execution [INFO] 2021-08-02T07:57:43.110Z 88dbdbb0-5909-4360-8298-1e6318335067 Function complete END RequestId: 88dbdbb0-5909-4360-8298-1e6318335067
まとめ
Aurora レプリカ Auto Scaling イベント時に発火する Lambda の コードと EventBridge の設定をまとめてみました.Aurora レプリカ Auto Scaling をスケジュールで使っていてスケールアウトはすぐだけどスケールインがタイミングがわからず困っていたので,EventBridge で拾ってイベント駆動の仕組み化できたのはよかったです.同じような悩みを持つ方の参考になれば嬉しいです.