Datadog × EventBridge でプロセス自動再起動を実装してみた
挨拶
こんにちは!yuhanです。
今回は、Datadog と AWS の EventBridge を連携して、プロセスの再起動を自動化する実装を行ったので、そちらを紹介したいと思います。
過去のブログでも、プロセスの自動再起動について紹介していますが、今回の実装では EventBridge を使用してよりシンプルな実装にしています。
具体的な構成としては、下記のようなイメージになります。
Datadog にてサーバーのプロセス監視を行い、アラートが発報したらEventBridge が発火して、Systems Manager の Run Command で、プロセスの再起動を実行するというものです。
前提
- Datadog を利用している。
- AWSアカウントの Integration が済んでいる。
- Datadog Agent を監視対象のインスタンスにインストール済み。
※ Datadog Agent のインストール については、別のブログ記事があるので、こちらをご参照ください。
プロセス監視モニターの設定
サーバーでの設定
※Amazon Linux における Datadog Agent の基本的な使用方法は 公式ドキュメント を参照してください。
今回はプロセス監視の設定を行うので、 /etc/datadog-agent/conf.d/process.d
配下に設定ファイルを作成します。
cd /etc/datadog-agent/conf.d/process.d
サンプルファイルがあります。
細かい設定については、こちらのコメントを参照したり公式ドキュメントを参照してください。
[ec2-user@ip-172-31-16-122 process.d]$ ls -l
total 8
-rw-r--r--. 1 dd-agent dd-agent 7529 Jun 1 08:08 conf.yaml.example
今回はシンプルに設定したいので、下記のように設定します。
監視するプロセスは、プロキシサーバーで使用される squid
を指定します。
init_config:
instances:
- name: squid
search_string: ['squid']
exact_match: False
ignore_denied_access: True
設定ファイルを追加したら、Datadogエージェントを再起動します。
sudo systemctl restart datadog-agent
モニターの作成
Datadog コンソールで、プロセス監視のモニターを作成します。
※最低限の設定をするため、細かい設定内容の解説は省きます。詳細な設定項目については、公式ドキュメントを参照してください。
Monitors
から New Monitor
をクリックします。
新規モニター作成画面に遷移するので、こちらで、 Process Check
を選択します。
Pick a Process
で、 Squid
を選択します。
※ここで、セレクトボックスに選択肢が出てこない場合は、datadog-agent の設定を見直したり、datadog-agent の再起動を行なってください。
Pick monitor scope
で、対象インスタンスのホスト名を指定しておきます。
3回の連続失敗でWarning、5回の連続失敗でAlert、発報後に3回連続成功したら回復したと見なすように設定しています。
簡易的に通知内容を設定します。
再通知については、今回は設定を省きます。
一番下の Create
ボタンをクリックしてモニターを作成します。
緑色で正常にモニターが動作していればOKです。
EventBridge の設定
IAMロールの権限確認
EventBridge と Datadog を連携させるための設定を行います。
まず、Datadog と AWS の Integration 設定から、設定しているIAMロールを確認します。
Datadog のコンソールで、 Integrations
から Integrations
をクリックします。
Amazon Web Services
にカーソルを合わせます。
表示が変わるので、 CONFIGURE
をクリックします。
Account Details
をクリックします。
スクロールすると、AWS と Datadog の連携に使用しているロールが記載されているので、こちらに適用されている権限をAWSコンソールなどで確認します。
もし、下記の権限が不足している場合は、EventBridge との連携に必要なため追加しておきます。
events:CreateEventBus
events:PutPartnerEvents
Datadog コンソールで Event Bus の作成
Integrations
から Integrations
をクリックします。
Amazon EventBridge
があるので、こちらにカーソルを合わせます。
CONFIGURE
をクリックします。
Configuration
タブの中で、 アカウントが表示されている箇所をクリックします。
Event Buses
が表示されるため、 Add Event Bus
をクリックします。
任意の名前とリージョンを設定して、 Save
をクリックして保存します。
※権限が不足しているときは、下記のようなエラーが出ます。
この場合は、確認したIAMロールに events:CreateEventBus
が許可されていることを確認してください。
AWSコンソールでEventBridgeの設定
EventBridge のページで、 イベントバス
をクリックします。
カスタムイベントバス
に Datadog のコンソールで作成したイベントバスが表示されていることを確認します。
EventBridge の左のメニュータブから、ルール
をクリックします。
ルールを作成
をクリックします。
任意の名前を設定し、イベントバスは Datadog コンソールから作成したものを選択します。
次に進み、イベントパターンの設定をしていきます。
イベントソースは AWS イベントまたは EventBridge パートナーイベント
を選択します。
サンプルイベントはオプションなので今回は省略します。
作成のメソッドにて、 パターンフォームを使用する
を選択します。
イベントパターンで、イベントソースに EventBridge パートナー
を選択します。
パートナーに Datadog
、イベントタイプに すべてのイベント
を選択します。
次に進み、ターゲットの選択をします。
ターゲットタイプは、AWS のサービス
ターゲットは、Systems Manager 実行コマンド
ドキュメントは、 AWS-RunShellScript
ターゲットキーは、 InstanceIds
それぞれ設定していきます。
ターゲット値に、対象のEC2インスタンスのインスタンスIDを設定します。
右にある 追加
ボタンをクリックしてください。
自動化パラメータでは、 定数
を選択して Commands に sudo systemctl restart squid
と入力します。
※squid プロセスの再起動コマンド
※ここでも、追加
ボタンをクリックするのを忘れないようにしましょう。
ロールなどは自動的に設定されているもので、次に進みます。
タグの設定は必要であればしてください。
最後に確認に進むので、設定内容を確認して問題なければ一番下の ルールの作成
をクリックして作成します。
作成されましたね!
イベントバスとモニターを連携させる
作成したモニターを開き、歯車マークをクリックします。
メニューが出てくるので、Edit
をクリックして編集画面を開きます。
通知の設定箇所にて、 @awseventbridge-<作成したイベントバス名>
を通知先に追加します。
それ以外は変更せずに、 Save
で変更内容を保存します。
これで、Datadogのモニターと EventBridge が連携されました!
期待通りに動作するかテストしていきましょう。
テスト
Datadog で作成したモニターが、 正常な状態であることを確認します。
サーバーに接続して、squid
プロセスを停止します。
sudo systemctl stop squid
systemctl status squid
を実行して、停止していることを確認しておきます。
[ec2-user@yuhan-test ~]$ systemctl status squid
● squid.service - Squid caching proxy
Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
Active: inactive (dead)
:
:
プロセスの停止を検知して、アラートが発報されます。
この状態で、しばらく何もせずに待ってみましょう。
squid
のプロセスを確認すると、起動しています。
[ec2-user@yuhan-test ~]$ systemctl status squid
● squid.service - Squid caching proxy
Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
Active: active (running) since 火 2023-08-01 12:47:50 UTC; 1min 0s ago
Process: 17635 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
Process: 17608 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
Main PID: 17644 (squid)
CGroup: /system.slice/squid.service
├─17644 /usr/sbin/squid -f /etc/squid/squid.conf
├─17649 (squid-1) -f /etc/squid/squid.conf
└─17650 (logfile-daemon) /var/log/squid/access.log
:
:
アラートも回復しています。
感想
思っていたよりも簡単にサービスを連携させて、自動化を実装することができました!
プロセス再起動以外にも、アラート発報時に自動的に行いたい処理は、積極的に自動化を行い、運用負担を減らしていきたいですね......!