0.はじめに
ついこの前からAWSの運用監視をするようになり、ふと気になった掲題の問題について
せっかくなので色々なアプローチで解決してみたいなと思いました。
同じく運用をされている方からのフィードバックを心待ちにしております!
1.検証環境の構成と想定
・構築済みの環境(監視対象環境)をクロスアカウント機能を使い、モニタリング環境で
監視することを想定する
・構築済みのリソースの設定は極力変更しないものとする
・AutoScalingによるEC2のスケールイン・スケールアウトによるインスタンスの入れ替わりは
Cloudwatch・EventBridge・Lambda・SNS等を使って検知してみる
・ざっくりな構成図は以下の通り
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 特定のグループ | 任意で選択 | 監視対象を絞る際は後者を選択する |
次にターゲットの選択に進みます。
設定項目名 | 設定値 | 備考 |
---|---|---|
ターゲットタイプ | EventBridgeイベントバス | 別のAWSアカウントへ連携する際はこちらを選択します |
ターゲットタイプ | 別のアカウントまたはリージョンのイベントバス | 上記を選択すると表示されます |
ターゲットとしてのイベントバス | モニタリング環境側のイベントバス | 送信先がモニタリング環境側になるためコピペする |
実行ロール | この特定のリソースについて新しいロールを作成 | 別アカウントへの共有を許可するロールが自動作成できる※ |
※AWSのドキュメントに記載あり
(https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-cross-account.html)
これで監視対象側の設定は完了です。
3.実際にやってみる(モニタリング環境編)
3.1.EventBridge編~イベントバス設定~
モニタリング環境側で監視対象環境の情報を取得するにはまず、イベントバスの設定を実施します。
モニタリング環境側でEventBridge>イベントバス> defaultを選択し、アクセス許可を管理を押下します。
”テンプレートをロード”を押下し、以下のコードのように
監視対象環境側の設定を追記します。(テンプレートに記載のコメントも削除すること)
{
"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にログを記録するところまで執筆したいと思います。