BETA

Datadog & APIGateway & LambdaでNginxの自動再起動を実装してみた

投稿日:2019-02-23
最終更新:2019-05-05
※この記事は外部サイト(https://jj-tech-blog.com/datadog-apigatewa...)からのクロス投稿です

Introduction

こんにちは、JJ(@JJ_1123_I)です!

仕事柄、自社クラウドはじめ、AWSなど様々なクラウドサービスを利用する機会が多いのですが、今はモニタリングサービスにも手を出してます。

そこで今一番が関心があるのが「Datadog」です!
AWSやAzureのほか、250以上の環境やツールとのAPI連携で簡単に連携出来るし、インフラだけではなくフロントまでもDatadogのダッシュボード画面上で統合的にモニタリング可能なところがかなり良さげです。

今回は、このサイトを参考にDatadogを活用し、 EC2で走っているNginxプロセスが停止した際、自動で再起動する仕組みを実装してみようと思います。

完成イメージ

このサイトでやっている事を再現したい。

EC2準備

「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」の「t2.micro」で立てました。
作成方法よくわからない方はここを参考まで。

エージェントをインストール

1. EC2にSSH接続

下記コマンドをエディタから実行し、「Amazon Linux AMI」と表示されればOKです。

$ cd ~  
$ mv Downloads/自身のキーペア名.pem .ssh/  
$ cd .ssh/  
$ chmod 600 自身のキーペア名.pem  
$ ssh -i 自身のキーペア名.pem [email protected]インスタンスと紐付けたElastic IP  
(Elastic IPが123.456.789であれば、shh -i 自身のキーペア名.pem [email protected]

####2. Nginxをインストール
下記コマンドをエディタから実行してください。
無事完了出来ていれば、Nginxがインストールされています。

sudo yum install nginx  

####3.Datadog Agentをインストール
下記コマンドをエディタから実行し、「Complete!」と表示されればOKです。
めっちゃ簡単です!

Instructions > Agent > Amazon Linux

DD_API_KEY=自身のAPIキー bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)"  

4. Datadog Live Process Monitoringを有効化

process検知はデフォルト無効となっているのでLive Process Monitoringを有効に変更します。
エディタでコンフィグファイルを開きます。

sudo vim /etc/datadog-agent/datadog.yaml  

「process_config:」と「enabled: "true"」を有効にしてあげてください。

# clustername: cluster_identifier  

# Process agent specific settings  
#  
# process_config:  
process_config:  
#   A string indicating the enabled state of the Process Agent.  
#   If "false" (the default) it will only collect containers.  
#   If "true" it will collect containers and processes.  
#   If "disabled" it will be disabled altogether and won't start.  
#   enabled: "true"  
 enabled: "true"  
#   The full path to the file where process-agent logs will be written.  
#   log_file:  
#   The interval, in seconds, at which we will run each check. If you want consistent  
#   behavior between real-time you may set the Container/ProcessRT intervals to 10.  
#   Defaults to 10s for normal checks and 2s for others.  
#   intervals:  
#     container:  
#     container_realtime:  
#     process:  
#     process_realtime:  
#   A list of regex patterns that will exclude a process if matched.  
#   blacklist_patterns:  

少し時間を置いた後にプロセス一覧で該当サーバのnginx processが取れていればOKです!
Infrastructure > processes

#API Gatewayの実装

1. API Gatewayの作成

API Gatewayを利用してLambdaを叩くAPIを作成します。

AWS マネージメントコンソールからAPI Gateway > APIの作成
今回は「REST」「新しいAPI」「任意のAPI名」「リージョン」で作成しました。

2. リソース作成

アクション > リソースの作成 でAPIのリソースを作成します。
「任意のリソース名」のみ入れて作成しました。

3.メソッド作成

アクション > メソッドの作成 で先ほど作ったリソースにメソッドを追加します。
今回はPOSTにしてます。

ここまでやったら次はLambdaを作成していきます。

#Lambdaの実装

1. Lambdaの作成

AWS マネージメントコンソールからAPI Gateway > 関数作成
今回は「一から作成」を選択し、以下のように項目を埋めてます。IAMロールはこのサイトを参考に作成しました。

2. Lambdaにコードをデプロイ

Lambdaにはコードをパッケージ化してアップロードします。
対象のEC2サーバへSSH接続し、ソースコードを作成します。

 cd ~  
 mkdir lambda名  
 cd lambda名  
 vi lambda_function.py  

ソースコードは参考サイトを元にこんな感じです。

import json  
import boto3  
import paramiko  

def lambda_handler(event, context):  
    s3_client = boto3.client('s3')  
    # Download pem from S3 bucket  
    s3_client.download_file('S3のバケット名',  
            'ご自身のキーぺア.pem', '/tmp/ご自身のキーぺア.pem')  

    key = paramiko.RSAKey.from_private_key_file("/tmp/ご自身のキーぺアpem")  
    client = paramiko.SSHClient()  
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  

    host='自身のIP'  
    print "Connecting to " + host  
    client.connect( hostname = host, username = "ec2-user", pkey = key )  
    print "Connected to " + host  

    commands = [  
        "sudo service nginx stop",  
        "sudo service nginx start"  
        ]  
    for command in commands:  
        print "Executing {}".format(command)  
        stdin , stdout, stderr = client.exec_command(command)  
        print stdout.read()  
        print stderr.read()  

    return {  
        'statusCode': 200,  
        'body': json.dumps('script cmleted')  
    }  

次にparamikoを使っているので有効にしていきます。
必要なライブラリがあるのでyumでインストールしておきます。

sudo yum -y install gcc gcc-c++ kernel-devel python-devel libxslt-devel libffi-devel openssl-devel  

paramikoをインストールします。

pip install paramiko -t .  

最後にLambda Functionを含め、ルートディレクトリ以下を全てzipファイルにまとめてLambdaへデプロイします。

zip -r deploy.zip .  
$ aws lambda update-function-code --function-name ご自身のLambda名 --zip-file fileb://deploy.zip  

次にソースの通り、キーペアをS3から取得しているのでこれをやっていきます。

#S3のバケットにキーペアを保管
S3バケットを作成し、該当サーバのキーペアを保管します。
バケット名は上記ソースで指定したパケット名にしてください。

保管したら、LambdatとAPI Gatewayのテストでこんな感じで成功すればOKです。

Lambda

API Gateway

#Datadogのアラート設定

1. DatadogでProcessのアラート設定

Monitor > Process から設定を行います。

こんな感じで閾値が1以下であれば、アラートをあげるようにすれば良いかと思います。

2.Webhooksの設定

Integrations > Webhooks から設定を行います。
URLは、APIGatewayの入れればOKです!
APIGatewayでAPIキーを有効にしている場合は、HeadersにAPIキーをいれてあげてください。

#動作確認
動作確認は、EC2にSSH接続し、Nginxを落として再起動が自動で行われる事を確認します。
以下のコマンドをエディタに入力し、Nginxを停止させます。

sudo nginx -s stop  

5分待ちDatadog上でエラーを検知し、1分後に復旧の通知を確認出来ればOKです。

#まとめ
ほぼ素人の当方でもなんとか実装出来ました。
プロセス再起動を自動化できたのはかなり勉強になったので、今後もこういった自動化の仕組みを検討し、実装していこうと思います。

#参考
https://blog.mmmcorp.co.jp/blog/2017/06/30/integrate_datadog_lambda/
https://dev.classmethod.jp/etc/datadog-live-process-monitoring/
https://dev.classmethod.jp/etc/aws-lambda-paramiko
https://qiita.com/Quikky/items/2897573a42fd71cfc47f

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

テクノロジーに関する情報、学んだ事を発信します!

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!