Amazon Kinesisを使ってRedshiftにJSONを投入


事前準備

Redshiftの作成は省略します。
いい記事がたくさんあるので。。。

Redshiftにテーブルを作成

今回はこんなテーブルを作りました。

create table logs (
  id int not null,
  value varchar(30) not null,
  created_at timestamp not null
);

Kinesis streamsの作成

名前はlog-stream、Number of shards は1にしました。

Firehoseの作成

名前はlog-stream-firehoseにしました。

SourceでKinesis streamを選択、さっき作ったlog-streamを選んで

Step2: Process records

全てデフォルトで。。

Step3: Choose destination

Select destination

Amazon Redshiftを選択

Amazon Redshift destinationに事前に準備したRedshiftの情報を設定した後
Redshiftのセキュリティグループを編集してFirehoseからアクセスを許可します。
(水色の箱にFirehose IP addressが書かれているのでそれを許可してやる)

intermediate S3 destination

RedshiftにCOPYコマンドでデータを転送する前に一度S3にあげる先みたいです。
今回は新しく作りました。

Amazon Redshift COPY command

COPY optionsにJSON 'auto';を設定

Step 4: Configure settings

全てデフォルト値で。IAM roleも今回新しく作りました。

動作確認

AWS コマンドラインインターフェイスをつかってデータを登録してみます。

こんなファイルを作成

log.json
{
  "Records": [
    {
      "Data": "{\"id\": 12345, \"value\": \"click\", \"created_at\": \"2018-09-05 00:00:00\"}",
      "PartitionKey": "124"
    }
  ],
  "StreamName": "log-stream"
}

AWS CLIでデータを登録

$ aws kinesis put-records --cli-input-json file:///tmp/event.json

こんな値が帰ってきたら成功です

{
    "FailedRecordCount": 0,
    "Records": [
        {
            "ShardId": "shardId-000000000000",
            "SequenceNumber": "xxxxx"
        }
    ]
}

ちょっと待ってからRedshiftでlogsテーブルをselectしてみると。。

 select * from logs;
  id   | value |     created_at
-------+-------+---------------------
 12345 | click | 2018-09-05 00:00:00

注意点

JSONのキーはダブルクォーテーションで囲む

トラブルシューティング