RedashでSendGridのActivityを見る(Amazon S3 -> Athena経由)
2017/12/10
Redash Advent Calendar 2017に参加しましたので、今年リリースの v2 でダイレクトでの接続が実装されたAmazon Athenaデータソースを使ってSendGridのActivityを見たことについて書きたいと思います。
v2より前はDockerを使ったProxy経由でAmazon Athenaデータソースに接続していました。
目次
概要
- SenGridのEvent WebHookでAmazon API GatewayへEventを送信
- Amazon API GatewayをトリガーにしたAWS LambdがEventを受け取ってCSV形式でAmazon S3へ格納
- Amazon S3 をデータソースにしてAmazon Athenaでテーブルを作成
- RedashでAmazon Athenをデータソースにしてクエリ実行、可視化
Amazon S3でCSVを格納するバケットを作成する
バケット名とリージョンだけ指定してあとは何も設定してません。
バケット名は「sendgrid.activity.yamamugi.com」、
リージョンはRedashのEC2を起動しているバージ二ア北部にしました。
AWS LambdaでSendGridのActivityをCSVに変換してS3バケットに格納する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
def lambda_handler(event, context): try: s3_bucket = boto3.resource('s3').Bucket(bucket_name) body = '' for e in event: rows = [] rows.append(get_value(e, 'email')) rows.append(get_value(e, 'timestamp')) rows.append(get_value(e, 'ip')) rows.append(get_value(e, 'sg_event_id')) rows.append(get_value(e, 'sg_message_id')) rows.append(get_value(e, 'useragent')) rows.append(get_value(e, 'event')) rows.append(get_value(e, 'response')) rows.append(get_value(e, 'tls')) body += ','.join(rows) body += '\n' key_name = '{time}{id}.csv'.format( time=datetime.now().strftime('%Y/%m/%d/%H/%M%S'), id=event[0].get('sg_event_id', '') ) s3_bucket.put_object( Key=key_name, Body=body, ContentType='text/csv' ) except: logger.error(traceback.format_exc()) send_message(traceback.format_exc(), slack_channel) |
S3のオブジェクトキーは年月日時間で階層のようなプレフィックスにしています。
大量にActivityが発生するような場合はキーをランダムにしたほうがいいと思います。
このあとのクエリーではオブジェクトキーは何であっても問題はありません。
環境変数でバケット名とSlackのURL,チャンネルを指定しています。
Slackはエラー通知用にしているだけです。
Lambdaの権限
Lambdaのロールには、作成したS3バケットにput objectを許可あしたポリシーを割り当てたロールを設定しました。
Amazon API Gatewayを設定する
作成したAWS LambdaがPOSTメソッドをトリガーに起動するようにAPI Gatewayを設定しました。
Lambda関数を指定する以外はデフォルトのままでデプロイしました。
SendgridのWebHookを設定する
SendGridのダッシュボード [Settings]-[Mail Settings]で、[Event Notification]をONにして[HTTP POST URL]にAmazon API GatewayでデプロイしたAPIのエンドポイントを設定します。
ここまでの設定で、SendGridで何かイベントがおこるとS3に格納されるようになりました。
Amazon Athenaの設定
次にAmazon S3に格納されたCSVからAmazomn Athenaのテーブルを作成します。
Amazon AthenaのQuery Editorで以下のSQLを実行しました。
- [add table]からGUIでテーブル作成を実行することも出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE EXTERNAL TABLE sendgird.activity ( `email` string , `timestamp` int, `event` string, `useragent` string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = ',', 'field.delim' = ',' ) LOCATION 's3://sendgrid.activity.yamamugi.com/' TBLPROPERTIES ('has_encrypted_data'='true'); |
プレビューをしてみると、S3に格納されたActivityデータが見えます。
RedashでAthenaのテーブルのデータを可視化する
さて、いよいよRedashです。
バージョンは、もちろんv2以上です。
公式のRedash Amazon Athena Setupを参照して設定しました。
AWS IAMユーザーの作成
ユーザーを作成してポリシーを割り当ててアクセスキーを発行します。
ドキュメントにもありますがポリシーは下記です。
* Athenaのクエリ結果が入っているバケット配下へのs3:GetObject
* Athenaのクエリ結果が入っているバケットヘのs3:GetBucketLocation , s3:ListBucket
* AWSQuicksightAthenaAccess
* AmazonAthenaFullAccess
Amazon Athenaデータソースの設定
- AWS Region: Amazon Athenaのリージョン
- AWS Access Key , AWS Secret Key : 先程作ったIAMユーザーのアクセスキーとシークレットキーです。
- S3 Staging Path : Amazon Athenaのクエリー結果が格納されているS3バケットを指定します。
実行してみた
クエリーでAmazon Ahenaを設定したデータソースを選択すると、左ペインにAmazon Athenaのテーブルが見えます。
クエリーペインでSELECT文を発行すると結果が返ってきました。
クエリー結果をビジュアライザーを用いてグラフにしてダッシュボードを作成することも出来ました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Re:dash CSVの出力コードをUTF-8から他の文字コードに変更する事が出来るようになります
先日、Re:dash CSVの出力文字コードをUTF-8からShift-JISに …
-
re:dashで 「Error running query: ‘ascii’ codec can’t encode」
re:dash の画面に表示されたエラー Error running query …
-
PentahoでMySQLテーブルデータソースを作成しようとした時のエラー対応
PentahoでMySQLのテーブルへデータソースを作成しようとしてエラーが発生 …
-
Re:dash CSVの出力文字コードをUTF-8からShift-JISに変更する
Re:dashの[Download Dataset] – [Down …
-
re:dashのパラメータクエリでシングルクォーテーションが文字参照に変わって検索できないので出来るようにする
re:dashでシングルクォーテーションをパラメータとして渡したい場合の方法に悩 …
-
Re:dashを0.12系から1.0系へアップグレードする
1.0系が正式リリースになったので0.12系からアップグレードしました。 .en …
-
勉強会用にre:dashの環境構築した記録
先日の「ヤマムギVol5 BI ファーストステップ ~re:dash , Pow …
-
Pentaho Communitation EditionをAWS EC2 Amazon Linux にインストールしてみました
BIというか、簡単なグラフが表示出来ればいいレベルでいいので、商用のBIを購入す …
-
re:dash Error running query: ‘ascii’ codec can’t encode characters
エラー内容 re:dashの画面に「Error running query: & …
-
TuneCoreの売上データCSVをS3に格納してAthenaのクエリをRe:dashのデータソースにして可視化する
先日参加しましたAWS Summit Tokyo 2017で、 [JapanTa …