Closed10

AWS LambdaのログをS3に出力してAthenaでクエリする方法

katoakikatoaki

やりたいこと:
・Lambdaでイベントが発生→ログをFirehoseにputRecord
・Glueのクローラで定期的にETL
・Athenaでクエリ

ログの形式:

const log = {
  "operated_at" : "1572539601000",
  "mailAddress" : "hogehoge@gmail.com",
  "tenant" : "testTenant",
  "dataType" : "dataType",
  "operationType" : "",
  "operationDetail" : "操作の詳細がここに入ります"
}
katoakikatoaki

まずはKinesisで配信ストリームを作成する。

  • ストリーム名を dev-log-stream と指定

  • Sourceは Direct PUT〜 を指定。

  • Encryption typeはUse AWS-owned CMKに

  • 特にデータ変換などはなし

  • katoaki-dev-log-stream-bucket というバケットを作って宛先に指定

  • バッファサイズは最小に、GZIP圧縮、S3 encryptionはEnabled

  • 確認してCreate
katoakikatoaki

Createしたらエラー出た・・

何故かストリーム名が漏れていたので、設定して再作成。(dev-log-stream

無事ストリームが作成できた。

katoakikatoaki

作成したストリームにログをはいてみる。

app.js
const AWS = require("aws-sdk");
const region = process.env.AWS_REGION || 'ap-northeast-1';

AWS.config.update({ region: region });

const DELIVERY_STREAM_NAME = "dev-log-stream";

const log = {
  "operated_at" : "1572539601000",
  "mailAddress" : "hkato.bel@gmail.com",
  "tenant" : "testTenant",
  "dataType" : "dataType",
  "operationType" : "",
  "operationDetail" : "操作の詳細がここに入ります"
}

// See: https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/writing-with-sdk.html
const params = {
  DeliveryStreamName: DELIVERY_STREAM_NAME,
  Record: {
    Data: JSON.stringify(log)
  }
}

const firehose = new AWS.Firehose({apiVersion: '2015-08-04'});
firehose.putRecord(params, function(err, data){
  if (err) console.log(err, err.stack);
  else console.log(data);
})
$ node app.js 
{
  RecordId: 'HgovHkx6fkug---',
  Encrypted: true
}
katoakikatoaki

出力されてた。
中身は多分見れない。エンコードされているので。

そのためデータの内容まではここではチェックしない。

katoakikatoaki

Glueでクローラを作成する

  • クローラの名前:dev-log-stream-crawler
  • Specify crawler source type
    • すべてデフォルトのまま
  • データストアの追加
    • すべてデフォルトのまま
  • データストアの追加
    • インクルードパス: s3://katoaki-dev-log-stream-bucket
    • 他はデフォルトのまま
  • 別なデータストアの追加
    • すべてデフォルトのまま
  • IAM ロールの選択
    • IAMロールを作成→ AWSGlueServiceRole-dev-log-stream-bucket
  • スケジュール
    • すべてデフォルトのまま(オンデマンド)
  • クローラの出力を設定する
    • データベース:dev-log-stream-bucket-db(新規作成したもの)
katoakikatoaki

Athenaの設定をする

  • Data sourcesを開く
  • Connect data sourceを選択
  • S3、Glueを選択(デフォルト)してNext
  • 「AWS Glue Data Catalog in this account」「Create a crawler in AWS Glue」を選択(デフォルト)してConnect to AWS Glue

このスクラップは2021/07/13にクローズされました