GuardDutyの結果をSNSで通知する #reinvent

2017.12.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Amazon GuardDuty はAmazon CloudWatch Eventsに基づいて通知を送信します。
ClodWatch EventsでLambdaを起動し、SNSにpublishしてみました。

SNSトピックの作成

東京リージョンに"sns-test"トピックを作成します。
サブスクリプションには、メールアドレスを登録しました。

Lambda関数の作成

ランタイムはPython 3.6を利用します。
eventデータをそのままsns-testトピックにpublishします。
関数名はGuardDutytoSNSとしました。

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('sns')
    response = client.publish(
        TopicArn='arn:aws:sns:ap-northeast-1:Account-ID:sns-test',
        Message=json.dumps({'default': json.dumps(event)}),
        MessageStructure='json',
        Subject='guardduty'
    )

LambdaのIAMロールには、AWSLambdaExecuteポリシー、AmazonSNSFullAccessポリシーを設定しました。

CloudWatch Eventsルールの作成

CloudWatchイベントルールを作成します。
ソースにguarddutyを指定します。

$ aws events put-rule --name GuardDuty-Publisher --event-pattern '{"source":["aws.guardduty"]}'

イベントルールとラムダ関数を関連づけます。

$ aws events put-targets --rule GuardDuty-Publisher --targets Id=1,Arn=arn:aws:lambda:ap-northeast-1:Account-ID:function:GuardDutytoSNS

ターゲットを呼び出す上で必要なアクセス許可を追加します。

$ aws lambda add-permission --function-name GuardDutytoSNS --statement-id 1 --action 'lambda:InvokeFunction' --principal events.amazonaws.com

通知の確認

GuardDutyコンソール>全般>結果サンプルの生成 を選択します。

以下のようにJSON形式で、SNSに設定したメールアドレスに通知されました。

おわりに

Amazon GuardDuty はAmazon CloudWatch Eventsに基づいて通知を送信します。
ClodWatch EventsでLambdaを起動し、Amazon SNSにpublishしてみました。
今回はメール通知を行いましたが、SNSに対応するサードパーティと連携すればより便利かもしれません。

参考