NewRelicのSlack監視アラートにメンションを付けてみた

はじめに
---
株式会社medibaのSRE Unitでインフラエンジニアをしている@jc-kimです。
この記事は <a href="https://qiita.com/advent-calendar/2022/mediba">mediba Advent Calendar 2022</a>の25日目です。

この間、NewRelicの監視運用でSlackに通知しているアラートが分かりにくいということで、@channelのメンションを付けてほしいという依頼があったため、対応した内容を書いてみたいと思います。

前提
---
- NewRelicでAPI Keyを発行済みである
- AlertCondition (Policy)は既に作成してある
- SlackのIncoming WebHookは設定は既にされている

仕組み
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/42733c79-f300-188b-fd8a-5452ff5d0be2.png)
上記の図のように２つのWorkflowを使用してSlackチャンネルに2回（①エラー内容、②@channelメンション付き）の送信になります。

Workflow作成 （①エラー内容通知用）
----
NewRelicのメイン画面から左側のナビゲーションパネルの
<em>**Alerts & AI**</em> → <em>**Workflows**</em>を選択し, <em>**Add a Workflow**</em>　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/dcfe4867-ef3a-c6de-956d-1d256e775ce5.png)
上記の画面から
- Workflow名を指定
- <em>**Filter data**</em>で対象になる``AlertCondition（Policy）``を選択
- <em>**Notify**</em>の方で``Slack``を選択し、SlackのDestinationを選択
- アラートを通知するチャンネルを選択し<em>**Send test notification**</em> のボタンから通知のテスト
- <em>**Test notification sent successfully.**</em>の表示が出たらSlackのチャンネルから通知を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/c044b303-ddab-e535-f366-05893d8f846b.png)
:::note warn
Workspaceがない場合は、<em>**Create new destination**</em> から <em>**Authenticate one click**</em>で Slackとの連携
:::

Workflow作成 （②メンション付き用）
----
①の手順のように<em>**Add a Workflow**</em>からWorkflow作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/7aaf967a-613f-2675-e380-9e18e1ddff3e.png)
- Workflow名を指定
- <em>**Filter data**</em>で①と同じ``AlertCondition（Policy）``を選択
- <em>**Notify**</em>の方で``AWS EventBridge``を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/9d8975e5-7701-9f94-eba1-ee7bf79c5e45.png)
- <em>**Destination**</em> から <em>**Create new destination**</em>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/1cfb7592-3f95-a795-ebb1-45d0ef29cf25.png)
- Destination名を指定
- <em>**AWS region**</em>は 東京リージョン（<em>**Asia Pacific(Tokyo)**</em>) を選択
- <em>**AWS acciount ID**</em>は 対象のAWSアカウントのIDを指定　
- <em>**Save Destination**</em>
- Destination作成したら以下のように<em>**Event Source**</em>項目出るので選択
- AWSEvent Bridgeのイベントソース名指定して作成（<em>**Create a new event source:...**</em>）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/5635e87f-25bb-e56f-64c8-63deeb9c3a7b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/9591a04b-c77f-154b-d142-881ac52cde66.png)
- <em>**Done**</em> ボタンを押すと上記のように <em>**Associate event source in EventBridge**</em>　画面が表示されるのでAWS マネジメントコンソールにログインして``AWSEvent Bridge``の設定を行う

AWSEvent Bridgeのイベントバス設定
---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/53c4c6b7-8246-5e2c-6796-b088fe24e25c.png)
- ``AWSEvent Bridge``の画面から左側のナビゲーションパネルの<em>**パートナーイベントソース**</em>を選択するとステータスが「保留中」のイベントソースがあるので選択して<em>**イベントバスと関連付ける**</em>を行う
- ステータスが <em>**アクティブ**</em> になったら左側のナビゲーションパネルの <em>**イベントバス**</em> に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/c9ee6232-fff5-8947-2a61-dc6b090dcd8f.png)
- <em>**Not initiated**</em> の状態のイベントバスがあるので<em>**アクション**</em>から<em>**検出を開始する**</em> で <em>**Started**</em> 状態にする

AWS Lambda関数の設定
---
- 次にイベントバスのルールを作成する前にターゲットにする``AWS Lambda``のLambda関数を先に作成
- `<WebHooks URL>`にてSlackのIncoming Webhookの<em>**Webhook URL**</em>を指定
- 文字通りに`<LambdaからSlackへ送信するメッセージ>`にてチャンネルに送信するメッセージを指定
（今回は@channelのメンションのみ送信するので`"<!channel>"`だけ入力）
```python:lambda_function.py
import json
import urllib.request

def post_slack(argStr):
    message = argStr
    send_data = {
        "text": message,
    }
    send_text = json.dumps(send_data)
    request = urllib.request.Request(
        "<WebHooks URL>", 
        data=send_text.encode('utf-8'), 
    )

    with urllib.request.urlopen(request) as response:
        slack_message = response.read()

def lambda_handler(event, context):
    post_slack("<LambdaからSlackへ送信するメッセージ>")

```
AWSEvent Bridgeのルール設定
---
- ``AWSEvent Bridge``に戻って左側のナビゲーションパネルの <em>**ルール**</em> に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/49a4967c-0819-5a14-0b65-1e335128ca0f.png)
- 対象の<em>**イベントバス**</em>を選択し、<em>**ルールを作成**</em>
    - ステップ１ [ルールの詳細を定義]
      名前と説明を指定し、対象のイベントバスを選択

    - ステップ２ [イベントパターンを構築]
      一番下の項目の<em>**イベントパターン**</em>の項目以外はデフォルトのまま
      <em>**イベントパターン**</em>は以下のように設定
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/8fe758c0-5fd9-2d11-9ca3-d242b63d2659.png)
    - ステップ３ [ターゲットを選択]
      先ほど作成したLambda関数をターゲットに選択
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/c355dcc9-ba8e-6365-8132-7509010c3220.png)
    - ステップ４・ステップ５はタグ付きやレビューをして<em>**ルールを作成**</em>
- Lambda関数の画面からトリガーが設定されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/270021f8-12cd-b18c-298b-983a2264fd8a.png)

最後に
---
- NewRelicの画面に戻って<em>**Done**</em> ボタン押し、<em>**Send test notification**</em>で通知のテストを行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/dacc18df-8bad-c43e-b649-24191dda98b5.png)
- Incoming Webhookを設定したチャンネルからメンション付きのメッセージ送信を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/c131e869-d7c1-6e88-002b-bc0d3c9c1543.png)

まとめ
---
``NewRelic`` の ``AlertCondition (Policy)``からアラートが発生したら2つのWorkflowのルートがSlackのチャンネルに通知する形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960702/e5e4af86-89bd-40d9-7d03-8b5c5dfd7ca8.png)
１つ目のWorkflowからはエラー内容を表示するメッセージで、２つ目のWorkflowは＠channelのメンションを付くメッセージが続いて通知されます。

今回の対応で監視アラートの確認漏れは減っていくかと思います。
足りないところが多いかと思いますが、少しでも役に立てればと思っております。
最後までご覧いただきありがとうございます。