AWS

Datadog × EventBridge でプロセス自動再起動を実装してみた

yuhan

挨拶

こんにちは!yuhanです。
今回は、Datadog と AWS の EventBridge を連携して、プロセスの再起動を自動化する実装を行ったので、そちらを紹介したいと思います。
過去のブログでも、プロセスの自動再起動について紹介していますが、今回の実装では EventBridge を使用してよりシンプルな実装にしています。

具体的な構成としては、下記のようなイメージになります。

スクリーンショット 2023-07-14 18.44.22.png (83.7 kB)

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 をクリックします。

スクリーンショット 2023-06-28 19.27.00.png (314.5 kB)

新規モニター作成画面に遷移するので、こちらで、 Process Check を選択します。

スクリーンショット 2023-06-28 19.29.00.png (88.1 kB)

Pick a Process で、 Squid を選択します。
※ここで、セレクトボックスに選択肢が出てこない場合は、datadog-agent の設定を見直したり、datadog-agent の再起動を行なってください。

スクリーンショット 2023-06-28 19.54.44.png (28.5 kB)

Pick monitor scope で、対象インスタンスのホスト名を指定しておきます。

スクリーンショット 2023-06-28 19.54.50.png (43.8 kB)

3回の連続失敗でWarning、5回の連続失敗でAlert、発報後に3回連続成功したら回復したと見なすように設定しています。

スクリーンショット 2023-06-28 20.21.32.png (189.0 kB)

簡易的に通知内容を設定します。

スクリーンショット 2023-07-03 15.52.31.png (238.8 kB)

再通知については、今回は設定を省きます。

スクリーンショット 2023-07-03 15.53.28.png (83.6 kB)

一番下の Create ボタンをクリックしてモニターを作成します。

スクリーンショット 2023-07-03 15.54.09.png (89.4 kB)

緑色で正常にモニターが動作していればOKです。

スクリーンショット 2023-07-03 16.20.13.png (296.8 kB)

EventBridge の設定

IAMロールの権限確認

EventBridge と Datadog を連携させるための設定を行います。

まず、Datadog と AWS の Integration 設定から、設定しているIAMロールを確認します。

Datadog のコンソールで、 Integrations から Integrations をクリックします。

スクリーンショット 2023-07-14 19.35.31.png (199.2 kB)

Amazon Web Services にカーソルを合わせます。

スクリーンショット 2023-07-03 19.24.20.png (510.1 kB)

表示が変わるので、 CONFIGURE をクリックします。

スクリーンショット 2023-07-03 19.24.36.png (54.1 kB)

Account Details をクリックします。

スクリーンショット 2023-07-03 19.26.04.png (245.4 kB)

スクロールすると、AWS と Datadog の連携に使用しているロールが記載されているので、こちらに適用されている権限をAWSコンソールなどで確認します。

スクリーンショット 2023-07-03 19.27.45.png (59.9 kB)

もし、下記の権限が不足している場合は、EventBridge との連携に必要なため追加しておきます。

  • events:CreateEventBus
  • events:PutPartnerEvents

Datadog コンソールで Event Bus の作成

Integrations から Integrations をクリックします。

スクリーンショット 2023-07-03 19.36.32.png (222.7 kB)

Amazon EventBridge があるので、こちらにカーソルを合わせます。

スクリーンショット 2023-07-03 19.38.50.png (833.8 kB)

CONFIGURE をクリックします。

スクリーンショット 2023-07-03 19.39.08.png (54.3 kB)

Configuration タブの中で、 アカウントが表示されている箇所をクリックします。

スクリーンショット 2023-07-03 19.40.46.png (269.3 kB)

Event Buses が表示されるため、 Add Event Bus をクリックします。

スクリーンショット 2023-07-03 19.42.38.png (87.8 kB)

任意の名前とリージョンを設定して、 Save をクリックして保存します。

スクリーンショット 2023-07-03 19.44.55.png (67.7 kB)

※権限が不足しているときは、下記のようなエラーが出ます。
この場合は、確認したIAMロールに events:CreateEventBus が許可されていることを確認してください。

スクリーンショット 2023-07-03 19.45.48.png (33.6 kB)

AWSコンソールでEventBridgeの設定

EventBridge のページで、 イベントバス をクリックします。

スクリーンショット 2023-07-14 18.50.13.png (587.2 kB)

カスタムイベントバス に Datadog のコンソールで作成したイベントバスが表示されていることを確認します。

スクリーンショット 2023-07-14 18.51.51.png (140.1 kB)

EventBridge の左のメニュータブから、ルール をクリックします。

スクリーンショット 2023-07-14 18.54.23.png (342.8 kB)

ルールを作成 をクリックします。

スクリーンショット 2023-07-14 18.55.26.png (275.6 kB)

任意の名前を設定し、イベントバスは Datadog コンソールから作成したものを選択します。

スクリーンショット 2023-07-14 19.05.53.png (231.4 kB)

次に進み、イベントパターンの設定をしていきます。

スクリーンショット 2023-07-14 19.08.58.png (407.6 kB)

イベントソースは AWS イベントまたは EventBridge パートナーイベント を選択します。

スクリーンショット 2023-07-14 19.07.44.png (113.9 kB)

サンプルイベントはオプションなので今回は省略します。
作成のメソッドにて、 パターンフォームを使用する を選択します。

スクリーンショット 2023-07-14 19.10.22.png (102.6 kB)

イベントパターンで、イベントソースに EventBridge パートナー を選択します。
パートナーに Datadog 、イベントタイプに すべてのイベント を選択します。

スクリーンショット 2023-07-14 19.12.38.png (152.2 kB)

次に進み、ターゲットの選択をします。

スクリーンショット 2023-07-14 19.15.05.png (353.3 kB)

ターゲットタイプは、AWS のサービス
ターゲットは、Systems Manager 実行コマンド
ドキュメントは、 AWS-RunShellScript
ターゲットキーは、 InstanceIds
それぞれ設定していきます。

スクリーンショット 2023-07-14 19.17.08.png (176.9 kB)

ターゲット値に、対象のEC2インスタンスのインスタンスIDを設定します。
右にある 追加 ボタンをクリックしてください。

スクリーンショット 2023-07-14 19.18.38.png (56.7 kB)
スクリーンショット 2023-07-14 19.19.21.png (68.8 kB)

自動化パラメータでは、 定数 を選択して Commands に sudo systemctl restart squid と入力します。
※squid プロセスの再起動コマンド
※ここでも、追加 ボタンをクリックするのを忘れないようにしましょう。

スクリーンショット 2023-07-14 19.20.54.png (71.7 kB)

ロールなどは自動的に設定されているもので、次に進みます。
タグの設定は必要であればしてください。

スクリーンショット 2023-07-14 19.23.46.png (255.0 kB)

最後に確認に進むので、設定内容を確認して問題なければ一番下の ルールの作成 をクリックして作成します。

スクリーンショット 2023-07-14 19.24.15.png (272.3 kB)

作成されましたね!

スクリーンショット 2023-07-14 19.25.49.png (262.4 kB)

イベントバスとモニターを連携させる

作成したモニターを開き、歯車マークをクリックします。
メニューが出てくるので、Edit をクリックして編集画面を開きます。

スクリーンショット 2023-07-14 19.41.22.png (274.9 kB)

通知の設定箇所にて、 @awseventbridge-<作成したイベントバス名> を通知先に追加します。

スクリーンショット 2023-07-14 19.43.46.png (159.1 kB)

それ以外は変更せずに、 Save で変更内容を保存します。

スクリーンショット 2023-07-14 19.45.08.png (167.1 kB)
スクリーンショット 2023-07-14 19.49.48.png (209.7 kB)

これで、Datadogのモニターと EventBridge が連携されました!
期待通りに動作するかテストしていきましょう。

テスト

Datadog で作成したモニターが、 正常な状態であることを確認します。

スクリーンショット 2023-07-14 19.30.41.png (215.9 kB)

サーバーに接続して、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)
:
:

プロセスの停止を検知して、アラートが発報されます。
この状態で、しばらく何もせずに待ってみましょう。

スクリーンショット 2023-07-14 19.51.48.png (233.0 kB)

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
:
:

アラートも回復しています。

スクリーンショット 2023-08-01 21.51.18.png (236.5 kB)

感想

思っていたよりも簡単にサービスを連携させて、自動化を実装することができました!
プロセス再起動以外にも、アラート発報時に自動的に行いたい処理は、積極的に自動化を行い、運用負担を減らしていきたいですね......!

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