はじめに
株式会社medibaのSRE Unitでインフラエンジニアをしている@jc-kimです。
この記事は mediba Advent Calendar 2022の25日目です。
この間、NewRelicの監視運用でSlackに通知しているアラートが分かりにくいということで、@channelのメンションを付けてほしいという依頼があったため、対応した内容を書いてみたいと思います。
前提
- NewRelicでAPI Keyを発行済みである
- AlertCondition (Policy)は既に作成してある
- SlackのIncoming WebHookは設定は既にされている
仕組み
上記の図のように2つのWorkflowを使用してSlackチャンネルに2回(①エラー内容、②@channelメンション付き)の送信になります。
Workflow作成 (①エラー内容通知用)
NewRelicのメイン画面から左側のナビゲーションパネルの
Alerts & AI → Workflowsを選択し, Add a Workflow
上記の画面から
- Workflow名を指定
-
Filter dataで対象になる
AlertCondition(Policy)
を選択 -
Notifyの方で
Slack
を選択し、SlackのDestinationを選択 - アラートを通知するチャンネルを選択しSend test notification のボタンから通知のテスト
-
Test notification sent successfully.の表示が出たらSlackのチャンネルから通知を確認
Workspaceがない場合は、Create new destination から Authenticate one clickで Slackとの連携
Workflow作成 (②メンション付き用)
①の手順のようにAdd a WorkflowからWorkflow作成
- Workflow名を指定
-
Filter dataで①と同じ
AlertCondition(Policy)
を選択 -
Notifyの方で
AWS EventBridge
を選択
-
Destination から Create new destination
- Destination名を指定
- AWS regionは 東京リージョン(Asia Pacific(Tokyo)) を選択
- AWS acciount IDは 対象のAWSアカウントのIDを指定
- Save Destination
- Destination作成したら以下のようにEvent Source項目出るので選択
- AWSEvent Bridgeのイベントソース名指定して作成(Create a new event source:...)
-
Done ボタンを押すと上記のように Associate event source in EventBridge 画面が表示されるのでAWS マネジメントコンソールにログインして
AWSEvent Bridge
の設定を行う
AWSEvent Bridgeのイベントバス設定
-
AWSEvent Bridge
の画面から左側のナビゲーションパネルのパートナーイベントソースを選択するとステータスが「保留中」のイベントソースがあるので選択してイベントバスと関連付けるを行う - ステータスが アクティブ になったら左側のナビゲーションパネルの イベントバス に移動
- Not initiated の状態のイベントバスがあるのでアクションから検出を開始する で Started 状態にする
AWS Lambda関数の設定
- 次にイベントバスのルールを作成する前にターゲットにする
AWS Lambda
のLambda関数を先に作成 -
<WebHooks URL>
にてSlackのIncoming WebhookのWebhook URLを指定 - 文字通りに
<LambdaからSlackへ送信するメッセージ>
にてチャンネルに送信するメッセージを指定
(今回は@channelのメンションのみ送信するので"<!channel>"
だけ入力)
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のルール設定
最後に
- NewRelicの画面に戻ってDone ボタン押し、Send test notificationで通知のテストを行う
- Incoming Webhookを設定したチャンネルからメンション付きのメッセージ送信を確認
まとめ
NewRelic
の AlertCondition (Policy)
からアラートが発生したら2つのWorkflowのルートがSlackのチャンネルに通知する形になります。
1つ目のWorkflowからはエラー内容を表示するメッセージで、2つ目のWorkflowは@channelのメンションを付くメッセージが続いて通知されます。
今回の対応で監視アラートの確認漏れは減っていくかと思います。
足りないところが多いかと思いますが、少しでも役に立てればと思っております。
最後までご覧いただきありがとうございます。