サーバーレス

Datadog × API Gateway × Lambda × AWS Systems Manager でプロセスの再起動を自動化する

gene

監視していたサーバーで何らかの障害が発生した際などに、取り急ぎWebサーバーを自動的に再起動したいというケースはよくあることかと思う。
つい先日も、 Application Load Balancer からのヘルスチェックが、 healthyunhealthy を繰り返す状況が発生し、 apache の再起動で正常復旧したことがあった。

以前、下記のブログエントリーにて、 EC2ノード上で走っているはずのnginxプロセスが止まっていた場合、自動で再起動する ということをやった。

Datadog × API Gateway × Lambdaでプロセスの再起動を自動化する | MMMブログ

その際には、 AWS Lambda からSSHで再起動コマンドを実行した。
今回は、そのSSHで実行した部分を、 AWS Systems Manager を使用して行ってみたいと思う。
今回は、

  • apache のプロセスダウンを Datadog で検知
  • DatadogAPI GatewayWebhook 実行
  • API GatewayLambda 実行
  • Lambda から AWS Systems Manager 経由で、 apache 再起動コマンド実行

という流れでやってみる。

EC2の準備

まずは、EC2インスタンス作成をする。
この際に、注意する必要があるのは、 AWS Systems Manager を実行できる IAM ロールを付与してやること。
今回は、AWS 管理ポリシー AmazonSSMManagedInstanceCore を使って、下記のようにロールを作成、EC2に付与している。

作成したロールをEC2に付与。

【参考】
ステップ 4: Systems Manager の IAM インスタンスプロファイルの作成 - AWS Systems Manager

apacheDatadog のエージェントをインストールしておく。

apache のプロセス監視は、設定が必要なため以下のように設定ファイルをコピー、編集する。

cp /etc/datadog-agent/conf.d/process.d/conf.yaml.example /etc/datadog-agent/conf.d/process.d/conf.yaml
vi /etc/datadog-agent/conf.d/process.d/conf.yaml

下記のように設定する。

  - name: httpd
    search_string: ['httpd']

設定後に、

systemctl restart datadog-agent

でエージェントの再起動を行う。

API Gatewayを作成

API Gateway を作成する。
手順等は、 こちら と同じなので、割愛。

Lambdaファンクションを作成

Lambda ファンクションを作成する。
Python 3.6 での実装。

import boto3
import logging
import os


logger = logging.getLogger()
logger.setLevel(logging.INFO)

INSTANCE_ID = os.environ['INSTANCE_ID']


def lambda_handler(event, context):

    ssm = boto3.client('ssm')
    res = ssm.send_command(
        InstanceIds=[INSTANCE_ID],
        DocumentName="AWS-RunShellScript",
        Parameters={
            "commands": [
                "systemctl restart httpd"
            ],
            "executionTimeout": ["60"]
        },
    )

    if res['ResponseMetadata']['HTTPStatusCode'] != 200:
        print('FAILED to execute ssm.send_command().')

    return
    {
        'message': "script completed."
    }

commands のところで、 apache 再起動コマンドの "systemctl restart httpd" を指定している。
環境変数に、作成したEC2のインスタンスIDを設定する。

今回は最低限の実装にしているが、成功時や失敗時に Slack 通知なども追加した方が、運用する際には便利かと思う。

Datadog設定

Datadog コンソールから Webhooks Integration を作成する。
URLに、先ほど作成した、 API Gateway のURLを入力する。

Datadog のプロセス監視のアラート設定する。

Pick a ProcessHttpd を選択。

アラート通知先に作成した Webhook を選択。

動作確認

apache を停止する。
しばらくすると、 Datadog でアラートがあがり、その後期待通り AWS Systems Manager 経由で、 apache 再起動コマンド実行されて、自動的にアラート復旧まで動作した。

まとめ

Datadog × API Gateway × Lambda × AWS Systems Manager でプロセスの再起動を自動化をやってみた。
Lambda からSSHでプロセス再起動する方法と比べると、

  • セキュリティグループでSSHポートを外に開放しなくていい

というメリットがある。
手順もSSH接続する場合より簡単だった。
障害発生時の定型的なオペレーションは、自動化することで、オペレーションミスもなくせるというメリットもあるので、今後も積極的に行っていきたい。

参考

AUTHOR
gene
gene
記事URLをコピーしました