継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Aurora レプリカ Auto Scaling のイベントをトリガーに Lambda を発火する

タダです.

Aurora レプリカ Auto Scaling で追加されたイベントをトリガーに EC2 の Apache を再起動(graceful)を実行したいと思い,Lambda を発火させるようにしてみたのでこの記事でまとめていきます.

経緯

Aurora レプリカ Auto Scaling で増えたインスタンスに対して接続数が増えない事象がありました.読み込みエンドポイントを使っていれば,負荷が分散されるはずなのにうまく Auto Scaling を活用できていませんでした.

Aurora Auto Scaling から益を得るには、お使いのアプリケーションが新しい Aurora レプリカへの接続をサポートしている必要があります。これを行うには、Aurora 読み込みエンドポイントを使用することをお勧めします。

増えたレプリカに負荷が分散されてないイメージ f:id:sadayoshi_tada:20210803091010p:plain

調査していたところ 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 で通知されたイベント f:id:sadayoshi_tada:20210803071628p:plain f:id:sadayoshi_tada:20210803071652p:plain

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 レプリカが追加されたことを確認できました.

f:id:sadayoshi_tada:20210803084348p:plain

同時刻に 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 で拾ってイベント駆動の仕組み化できたのはよかったです.同じような悩みを持つ方の参考になれば嬉しいです.