AutoScalingで監視から外れたEC2を監視し続けたいインフラエンジニアの奮闘記＃1

# 0.はじめに
ついこの前からAWSの運用監視をするようになり、ふと気になった掲題の問題について
せっかくなので色々なアプローチで解決してみたいなと思いました。
同じく運用をされている方からのフィードバックを心待ちにしております！

# 1.検証環境の構成と想定
・構築済みの環境(監視対象環境)をクロスアカウント機能を使い、モニタリング環境で
　監視することを想定する
・構築済みのリソースの設定は極力変更しないものとする
・AutoScalingによるEC2のスケールイン・スケールアウトによるインスタンスの入れ替わりは
　Cloudwatch・EventBridge・Lambda・SNS等を使って検知してみる
・ざっくりな構成図は以下の通り
|![cloudwatch-autoscaling-monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987950/91f5b927-2f4d-41c7-6b07-99c42da4b66b.png)|
|:--|

# 2.実際にやってみる（監視対象環境編）
## 2.1.EventBridge編
まずはEC2の起動・停止をトリガーとするEventBridgeを作成します。
参考にしたのは以下サイトですが、まずイベントバス(default)とルールを作成します。
参考サイト：https://dev.classmethod.jp/articles/cross-account-delivery-of-eventbridge-event-buts/

～ルール作成～
監視対象環境のイベントバス(default)に対応させるルールを作成します。

|設定項目名|設定値|備考|
|---|---|---|
|イベントソース|その他|別のAWSアカウントへ連携する際はその他を選択する|
|サンプルイベント|AWSイベント|今回は特に設定しないためデフォルトのまま|
|作成のメソッド|パターンフォームを使用する|次項目のイベントパターンをサクッと設定できるよう選びます|

続いてイベントパターンの作成に移ります。
この項目でどのインスタンスのどんなステータスをトリガーにするか設定します。
|設定項目名|設定値|備考|
|---|---|---|
|イベントソース|AWSのサービス|-|
|AWSのサービス|AutoScaling|サービスを選択すると下部にイベントタイプが表示される|
|イベントタイプ|Instance Launch and Terminate|インスタンスのスケールイン(アウト)の検知はこれを選択する|
|特定のインスタンスイベント|EC2 Instance Launch Successful、EC2 Instance Terminate Successful|インスタンスの起動と停止を検知するにはこれらを選択する|
|任意のグループ or 特定のグループ|任意で選択|監視対象を絞る際は後者を選択する|

※画像は参考例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987950/74983d1c-9fa3-c2e7-441e-f0ca09aed4fe.png)

次にターゲットの選択に進みます。
|設定項目名|設定値|備考|
|---|---|---|
|ターゲットタイプ|EventBridgeイベントバス|別のAWSアカウントへ連携する際はこちらを選択します|
|ターゲットタイプ|別のアカウントまたはリージョンのイベントバス|上記を選択すると表示されます|
|ターゲットとしてのイベントバス|モニタリング環境側のイベントバス|送信先がモニタリング環境側になるためコピペする|
|実行ロール|この特定のリソースについて新しいロールを作成|別アカウントへの共有を許可するロールが自動作成できる※|

※AWSのドキュメントに記載あり
(https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-cross-account.html)

これで監視対象側の設定は完了です。

# 3.実際にやってみる（モニタリング環境編）
## 3.1.EventBridge編～イベントバス設定～
モニタリング環境側で監視対象環境の情報を取得するにはまず、イベントバスの設定を実施します。

モニタリング環境側でEventBridge＞イベントバス> defaultを選択し、アクセス許可を管理を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987950/634e32b0-14e7-c576-585f-1cffd183046e.png)

”テンプレートをロード”を押下し、以下のコードのように
監視対象環境側の設定を追記します。(テンプレートに記載のコメントも削除すること)
```json:リソースベースのポリシー
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "allow_account_to_put_events",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"←監視対象環境側のAWSアカウントIDを入力する
    },
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:yyyyyyyyyyyy:event-bus/default"
  }, {
    "Sid": "allow_all_accounts_from_organization_to_put_events",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:ap-northeast-1:yyyyyyyyyyyy:event-bus/default",
    "Condition": {
      "StringEquals": {
        "aws:PrincipalOrgID": "xxxxxxxxxxxx"←監視対象環境側のAWSアカウントIDを入力する
      }
    }
  }, {
    "Sid": "allow_account_to_manage_rules_they_created",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
    },
    "Action": ["events:PutRule", "events:PutTargets", "events:DeleteRule", "events:RemoveTargets", "events:DisableRule", "events:EnableRule", "events:TagResource", "events:UntagResource", "events:DescribeRule", "events:ListTargetsByRule", "events:ListTagsForResource"],
    "Resource": "arn:aws:events:ap-northeast-1:yyyyyyyyyyyy:rule/default",
    "Condition": {
      "StringEqualsIfExists": {
        "events:creatorAccount": "xxxxxxxxxxxx"
      }
    }
  }]
}

※xxxxxxxxxxxxは監視対象環境側のAWSアカウントID
※yyyyyyyyyyyyはモニタリング環境側のAWSアカウントID

```
これで監視対象側のEventBridgeの情報を受け取れるようになりました！


次回はEventBridgeで取得したデータを基にCloudWatchLogsにログを記録するところまで執筆したいと思います。