[CDK For Terraform]RDSのイベント通知実装

# RDSのイベントサブスクリプションはChatbot非対応

前回の記事でも触れたのですが、RDSのイベントサブスクリプションはChatbotに対応していません。

https://qiita.com/Myabaou/items/3f34864eb66560c77304

RDSのイベント通知を行うためのEventBridgeで実装した内容を記載します。

## サンプルコード

```typescript
// CDK For Terraform EventBridge SNS

import { Construct } from 'constructs';
import * as aws from '@cdktf/provider-aws';
import { List } from 'aws-sdk/lib/model';


export function eventBridgeSns(scope: Construct,
 SourceClusterIdentifier: List, // RDS Aurora Cluster
 SourceIdentifier: List, // RDS Aurora Cluster Instances
 snsTopicName: string,

) {

 // EventBridge Slack 通知

 // RDS Cluster Event
 const eventBridgeRdsCluster = new aws.cloudwatchEventRule.CloudwatchEventRule(scope, "snsRdsClusterNotification", {

  name: `${process.env.ENV_ID}-sns-rds-cluster-notification`,
  eventPattern: JSON.stringify({
   source: [
    "aws.rds"
   ],
   "detail-type": [
    "RDS DB Cluster Event"
   ],
   detail: {
    "SourceIdentifier": SourceClusterIdentifier,
    "SourceType": [
     "DB_CLUSTER"
    ],
    EventCategories: [
     "failure",
     "failover",
     "maintenance",
    ]
   }
  }),
 });

 // RDS Instance Event
 const eventBridgeRdsInstance = new aws.cloudwatchEventRule.CloudwatchEventRule(scope, "snsRdsInstanceNotification", {
  name: `${process.env.ENV_ID}-sns-rds-instance-notification`,
  eventPattern: JSON.stringify({
   source: [
    "aws.rds"
   ],
   "detail-type": [
    "RDS DB Instance Event"
   ],
   detail: {
    "SourceIdentifier": SourceIdentifier,
    "SourceType": [
     "DB_INSTANCE"
    ],
    EventCategories: [
     "availability",
     "creation",
     "failover",
     "failure",
     "maintenance",
     "recovery",
     "restoration",
    ]
   }
  }),
 });




 const snsRds = new aws.dataAwsSnsTopic.DataAwsSnsTopic(scope, "snsRdsName", {
  name: snsTopicName

 });

 new aws.cloudwatchEventTarget.CloudwatchEventTarget(scope, "snsRdsClusterNotificationTarget", {
  rule: eventBridgeRdsCluster.name,
  arn: snsRds.arn,
 });


 new aws.cloudwatchEventTarget.CloudwatchEventTarget(scope, "snsRdsInstanceNotificationTarget", {
  rule: eventBridgeRdsInstance.name,
  arn: snsRds.arn,
 });



}
```

- 入力パラメータ

```typescript
    eventBridgeSns(
      this,
      [
        "sample-aurora-cluster"
      ], // 監視対象RDSクラスター
      [
        "sample-aurora-instance1",
        "sample-aurora-instance2",
      ],// 監視対象RDSインスタンス
      "SampleSNSName" // SNS Topic Name 
    )
```

## 解説

SNSはコード内でARN情報を取得し設定するようにしています。


このサンプルだとRDSのインスタンスをハードコードしていますが、
実際はインスタンスの増減が発生した場合を考慮して動的に
取得するようにしています。

```typescript
    const auroraInstanceNameBase = "sample-aurora-instance"
    // Aurora Instance 内のインスタンス情報取得function
    function createAuroraInstanceNames(auroraInstanceNameBase: string, instanceCount: number): string[] {
      // ステップ 1: 初期配列の作成
      const names = [auroraInstanceNameBase];

      // ステップ 2: ループ処理
      for (let i = 0; i < instanceCount; i++) {
        // ステップ 3: 配列への追加
        names.push(`${auroraInstanceNameBase}${i + 1}`);
      }

      // ステップ 4: 結果の配列を返す
      return names;
    }

    // 関数を呼び出し、結果を変数に格納
    const auroraInstanceNames = createAuroraInstanceNames(auroraInstanceNameBase, instanceCount);
```

利用した場合のコードは以下になります。

```typescript
    eventBridgeSns(
      this,
      [
        "sample-aurora-cluster"
      ], // 監視対象RDSクラスター
      auroraInstanceNames// 監視対象RDSインスタンス
      "SampleSNSName" // SNS Topic Name 
    )
```