脱AWS初心者!AWSのCloudTrailとCloudWatchを使って他リージョンの異常なイベントを監視・通知する


やりたいこと

国内向けのサービスをAWS上で運営しているが東京リージョンしか使っていない。
そこで、何かの拍子に他のリージョンにec2が大量に作られるなどした場合に検知できるようにしておきたい。

概要

調べたところ 以下のような手順でできそう・・

  1. Cloudtrailでイベントのログを取る
  2. CloudWatch LogでログのフィルターとSNSをトリガー
  3. SNSで通知する

手順

Cloudtrailでイベントのログを取る

Cloudtrailの設定については調べれば出てくるので割愛します。

CloudWatch Logのフィルター

フィルターをかけるところまでいったらここからが本題です。

今回の要件/実装方針は
1. 東京リージョン以外のイベントを検知したい
2. ログインは発生するのでそれらは除く
3. 他にもログなどの書き込みなどありそうだがそこは少しずつフィルターを育てて改善する

の2つです。

仕様に落とし込むと
1. regionは ap-northeast-1 以外で絞る
2. "invokedBy": "signin.amazonaws.com" かつ "userName": "someUser" を弾く

実装

1. ロググループ選択

OtherRegionLogGroup という名前でグループを作りましたのでそれをクリックする。

2. イベント一覧

イベントの一覧です。リストの中身を見ればイベントの詳細情報がわかります。
ここでフィルターをいろいろ試しながら自分が使いたいフィルターを決めます。

CloudWatch フィルターとパターンの構文一覧はこちら

条件としては下記の形になりました。

{
  ($.awsRegion != "ap-northeast-1") && (
    ($.userIdentity.invokedBy != "signin.amazonaws.com") &&
    ($.userIdentity.invokedBy != "cloudtrail.amazonaws.com")
  )
}

ap-northeast-1 以外かつ発火ユーザーが signin, cloudtrail 以外としています。

2.5 json filterのネストの書き方

少しだけ詰まったので補足説明です。
例: { $.requestParameters.instanceId = "some-instance-id"

SELECTOR
どのJSON プロパティを確認するかを指定します。プロパティセレクタは常に、JSON のルートを示すドル記号 ($) から始まります。
プロパティセレクタは英数字の文字列であり「-」および「_」をサポートします。
配列要素は [NUMBER] 構文で示され、プロパティに従う必要があります。
例は次のとおりです。$.eventId、$.users[0]、$.users[0].id、$.requestParameters.instanceId。

3 メトリクスフィルタの作成

フィルターが決まったらそれを適用させます。
ロググループ一覧に戻り、グループを選んだ状態でメトリクスフィルタの作成を押します。

そこにフィルタパターンを入れて「メトリクスの割り当て」を押します。

そうしたらこんな画面になるかと。

4. アラームの設定

上図の「アラームの作成」を押してアラームを作成しましょう。
今回は1度でもイベントがあるとアラームがくるようにしています。

5. アラームのチェック

試しにus-east-1リージョンでec2を作成してアラームが来るか検証してみましょう。来ていたら成功です

最後に

以外と後回しにしがちですが、1時間ほどあればとりあえずの設定はできるのでおすすめです!
もし何かありましたらコメントお願いします