質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

CloudWatchでのAPI検知機能について(AWS)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 322

Masa_g21

score 10

前提・実現したいこと

AWS環境で、WorkDocsというファイル共有システムで共有機能を利用したユーザを
CloudTrailで検知し、利用した本人にアラートメールを送信したい。

試したこと

CloudwatchのイベントからSNSで送信する。
→何故か、CloudwatchがWorkDocsのイベントをフィルタ検知できない。
(そしてSNSが事前のConfirmを前提としてしているため、不特定多数の配信ができない)

イベントフィルタ内容:
{
"detail-type": [
"AWS API Call via CloudTrail"
],
"detail": {
"eventSource": [
"workdocs.amazonaws.com"
],
"eventName": [
"GetResorceByMe" #ここは適宜調整する想定でおります。
]
}
}
"source": [
"aws.workdocs"
],

検証のために、EC2のtagを変更したイベントをフィルタ登録した際は以下の通り、検知があります。
フィルタ内容:
{
"source": [
"aws.tag"
],
"detail-type": [
"Tag Change on Resource"
]
}


massege:
{"version":"0","id":"b1a29cec-66cf-4824-7a42-53107dabf08a","detail-type":"Tag Change on Resource","source":"aws.tag","account":"xxxxxxxxxxxx","time":"2019-04-20T19:13:05Z","region":"ap-northeast-1","resources":["arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxxxx:alarm:CloudTrail/DefaultLogGroup_toSNS"],"detail":{"changed-tag-keys":[],"service":"cloudwatch","resource-type":"alarm","version":1.0,"tags":{}}}

②Cloudwatchlogsにアラーとを仕掛ける
Cloudwatchのログストリームに対してメトリクスを検知する方法を試しました。
件数や時刻などの通知を発生させることはできました。
ただしこの場合、json要素にユーザ名が無いため、本人に通知する、という要件を満たせませんでした。


もしかすると、CloudTrailからputしたS3Putイベントから
ファイル内容を読み取り検知するLambdaのほうが実現性が高いのかとも考えております。
迷走しておりますため、率直なアドバイスをいただけますと幸いです。

長文、申し訳ございませんが宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

質問内容がCloudWatchとCloudTrailが混ざっていて、どちらで検知したいかよく見えないですが、
どちらでも検知できれば良いという前提で書きます

少し調べてみましたが、CloudWatchから直接WorkDocsのEventは拾えないようです
参照:サポートされている各サービスからの CloudWatch イベント

CloudTrailのWorkSpaceログを利用して、CloudWatchで検知するというのはできるようです
参照:AWS CloudTrail を使用した Amazon WorkDocs API コールのログ記録

そのため、
①WorkDocsのAPIイベントログをCloudTrailで拾う
② ①のログをCloudWatchで検知する
という方法でいかかでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/03 01:00 編集

    ご回答ありがとうござます。①②で検知自体はできました。
    検知した際、そのユーザへのメール通知を行う方法について引き続きいろいろ試しております。

    いったん、CloudTrailログをAthenaに送ってテーブルを作ってみたところ、
    useridentityのカラムにJSONの構造がネストしていて、抽出したい
    usernamaeが単純にselectできないようでした。以下のような感じです。

    select useridentity
    from cloudtrail_logs_backetname
    where eventName = 'xxxx';

    結果:
    {type=IAMUser, principalid=AIDA2RLRVIHCTTWYYTE3Y, arn=arn:aws:iam::xxxxxxxxxxxx:user/testuser, accountid=xxxxxxxxxxxx, invokedby=signin.amazonaws.com, accesskeyid=xxxxxxxxxxxxxxxxxx, username=shareuserA, sessioncontext={attributes={mfaauthenticated=false, creationdate=2019-05-01T02:31:12Z}, sessionissuer=null}}

    ------------------------
    この、1カラムの中にある「username=shareuserA」だけ抽出する方法でアドバイスいただけると
    幸いです。初歩的ですみませんが宜しくお願いいたします。

    キャンセル

  • 2019/05/03 10:02 編集

    検知自体はできたようで良かったです。
    ↑について、抽出しようとしているAthenaの元データを貼り付けていただけないでしょうか

    以下あたりを参照すればできそうな気がします。
    https://docs.aws.amazon.com/ja_jp/athena/latest/ug/extracting-data-from-JSON.html
    https://dev.classmethod.jp/cloud/aws/athena-json/

    キャンセル

  • 2019/05/06 17:58

    kotatuさん
    ありがとうございます。
    ご教示いただきましたドキュメント参考に以下で抽出できました。
    ありがとうございます。

    select useridentity.username →jsonの配列から抽出
    from cloudtrail_logs_backetname
    where eventName = 'xxxx';

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる