AWS RDSのイベントをNew Relicで監視してみる

Amazon SNSで、メッセージの配信先として新しくAmazon Kinesis Data Firehoseを指定できるようになった！とのことで、タイムリーなお仕事をしたので、メモを兼ねて手順を記載。

# 目的
マルチAZなRDSでフェイルオーバーが起こった際にNew Relicでアラートを発生させたい。
けど、New RelicとAWSのインテグレーションを結んだだけでは検知できない…
よし、AWS SNSからKinesis Data Firehoseが呼び出せるようになったのでそれを使って通知をしてやろう。
サービスには影響ないが、AZをまたぐレイテンシーの増加が許容できないなど厳しい案件には有用？

# 必要なAWSコンポーネント

- RDS（当然）
- Kinesis Data Firehose
- SNS

# 流れ
RDS(Event subscriptions) → SNS → Kinesis Data Firehose → New Relic Logs

# 手順
## Kinesis Data Firehoseでdelivery streamsを作成する
### 事前準備
Kinesis Data Firehose delivery steramの配信エラーログを格納するS3バケットを作成する。
全てデフォルト設定でOK。
### 作成開始
![スクリーンショット 2021-01-28 19.14.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/431e187d-c7f6-fa8c-9897-6de8a1ae8132.png)
Kinesisのページで「Kinesis Data Firehose」を選択し、「Create delivery stream」をクリック

### Step1: Name and source
![スクリーンショット 2021-01-28 19.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/dd09d05c-4cd9-15e9-76bf-b90feee22d08.png)
任意のストーリム名を入力し、その他はデフォルトのまま次へ

### Step2: Process records
![スクリーンショット 2021-01-28 19.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/c12bc96a-12a8-6351-f73f-3b71b70486ee.png)
デフォルトのまま次へ
※配信されてくるレコードのやフォーマットの変換が必要な場合は適宜設定をする。

### Step3: Choose a destination
![スクリーンショット 2021-01-28 19.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/34da495c-3988-2197-2076-0aa02fbb8ff7.png)
※上の画像は途中で切っています。
以下を設定し次へ

| 項目 | 値 | 備考 |
| --- | --- | --- |
| Destination | Third-party service provider ||
| Third-party service provider | New Relic |  |
| HTTP endpoint URL | https://aws-api.newrelic.com/firehose/v1 | デフォルトで入力済み |
| API Key | New Relicの**<span style="color: #d61b09">Insert API Key**</span> | 作成方法は欄外（※）を参照 |
| S3 backup mode | Failed data only | 成功ログも格納する場合はAll dataを選択 |
| S3 backup | 事前準備したS3バケット |  |
※New Relic Insert API Keyの作成
https://docs.newrelic.com/docs/telemetry-data-platform/ingest-manage-data/ingest-apis/introduction-event-api#register
### Step4: Cofigure setting
![スクリーンショット 2021-01-28 19.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/f94cfc79-ffd1-7687-bab0-50902d299a2b.png)
デフォルトのまま次へ
※上の画像は途中で切っています。
※バッファやタグ、IAMロールの独自命名が必要な場合は適宜設定をしてください。
### Step5: Review
![スクリーンショット 2021-01-28 19.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/09cb240e-0df3-881c-7738-ed3376601d8f.png)
設定を確認し「Create delivery stream」をクリック
※上の画像は途中で切っています。

## SNSトピックを作成する
### 事前準備
SNSのサブスクリプションでKinesis Data Firehoseを実行できるように下記のIAMロールを作成しておいてください。

| 項目 | 値 | 備考 |
| --- | --- | --- |
| 信頼されたエンティティ | sns.amazon.com ||
| ポリシー 1 | AmazonSNSRole |AWSマネージドポリシー|
| ポリシー 2 | 任意の名前 | ポリシー内容は下記に記載 |

#### ポリシー2の内容
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "firehose:DescribeDeliveryStream",
                "firehose:ListDeliveryStreams",
                "firehose:ListTagsForDeliveryStream",
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Resource": [
                "＜＜作成したKinesis Data Firehose delivery streamのarn＞＞"
            ],
            "Effect": "Allow"
        }
    ]
}
```
### 作成開始
![スクリーンショット 2021-01-28 19.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/653727e0-de0b-f910-2905-200a8871f67b.png)
AWS SNSのページで「Create topic」をクリック

### トピックの作成
![スクリーンショット 2021-01-28 19.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/19467011-fcad-6f70-0e8e-625686361e9a.png)
以下を設定しトピックを作成する

| 項目 | 値 | 備考 |
| --- | --- | --- |
| タイプ | スタンダード ||
| 名前 | 任意 ||

### サブスクリプションの作成
![スクリーンショット 2021-01-28 19.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/bece8d43-312f-c1c4-86ff-cb71c7df8c9d.png)
作成したトピックで以下を設定しサブスクリプションを作成する

| 項目 | 値 | 備考 |
| --- | --- | --- |
| トピックARN | 作成したトピックのARN |デフォルトで入力済み|
| プロトコル | Amazon Kinesis Data Firehose ||
| エンドポイント | 作成したdelivery streamのARN |  |
| サブスクリプションロールのARN | 事前準備したSNS用IAMロールのARN |  |

## RDSのイベントサブスクリプションを作成する
### 作成開始
![スクリーンショット 2021-01-28 19.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/a518f867-1018-6c64-700b-b37f50fc8bd4.png)
RDSのイベントサブスクリプションページで「Create event subscription」をクリック
以下を設定しRDSイベントサブスクリプションを作成する

| 項目 | 値 | 備考 |
| --- | --- | --- |
| 名前 | 任意 ||
| ターゲット | ARN |  |
| ARN | 作成したSNSを選択 |  |
| ソースタイプ | インスタンス |  |
| インスタンスを含みます | 監視するインスタンスを選択 |  |
| イベントカテゴリを含みます | 特定のイベントカテゴリを選択 |  |
| 特定のイベントカテゴリ | failover、failure、recovery | 要件に合わせて適宜調整 |

以上でNew Relic Logsへイベント通知が配信されます。


```
SELECT count(*) FROM Log WHERE `Message.Event Message` LIKE '%failover started%' SINCE 1 day ago TIMESERIES
```
![スクリーンショット 2021-01-28 20.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188475/c6c5f408-197d-1ef6-ba86-20d922fb29a2.png)

配信されると以下のNRQLなどでメトリクスとして検出可能なので、Conditionを作成する。
LIKEに指定する文言は適宜調整する。


できました。

# 参考URL
- [Amazon SNS が、Kinesis Data Firehose サブスクリプションを介してメッセージのアーカイブと分析のサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2021/01/amazon-sns-adds-support-for-message-archiving-and-analytics-via-kineses-data-firehose-subscriptions/)
- [Stream logs using Kinesis Data Firehose](https://docs.newrelic.com/docs/logs/enable-log-management-new-relic/enable-log-monitoring-new-relic/stream-logs-using-kinesis-data-firehose)