AWS Kinesis Firehoseを動かして見る

## はじめに

2015/10のAmazon re:Invent 2015でKinesis Firehoseが発表されました。

* [AWSが外部に一般供用するKinesis FirehoseはIoTなどのセンサデータをクラウドへ直接送る](http://jp.techcrunch.com/2015/10/08/20151007aws-introduces-kinesis-firehose-to-move-sensor-data-to-cloud/)
* [Amazon Kinesis StreamsとAmazon Kinesis Firehoseは何が違うのか](http://dev.classmethod.jp/cloud/aws/difference-between-kinesis-streams-and-kinesis-firehose/)

これみて、ビビッと来ました。(Client appやIOT機器で)Logを収集するServerを持っていない場合でも、溜めるだけならServerメンテ0でLogをS3やRedshiftに溜められるジャン！Google Analytics library見たいに、Beacon APIをCallすれば、何も考えずにRedshiftにLogが溜まって、Data解析超楽ジャン！これで、Amazonの掲げる[2 tier Architecture](http://www.slideshare.net/AmazonWebServicesJapan/aws-lambda-2tier)に更に近づいたジャン！

と言う訳で、Firehoseの設定、Python scriptなど、調べた結果をチラシの裏しておきます。なお、この記事は、2015/11時点での調査結果なので、ご了承下さい。


## 結論

先に結論を書くと、Kinesis Firehoseの用途は、現時点では以下の様になっています。

* Android Client Appや、Web Pageでの、使用/操作Logを取るためのBeaconっぽい用途には(まだ)使えない
* [Kinesis SDKのSupport 言語](http://docs.aws.amazon.com/firehose/latest/dev/before-you-begin.html)を見ると、`Java`, `Node`, `Python`, `Ruby`, `AWS Cli`となっており、主にServer側のアプリへの埋め込みを想定して居る。NodeやRubyなどのServer側のLogを簡単にS3やRedshiftに放り込んでおける、と言うのがメインの用途な模様 
* 合わせて[kinesis agent](http://dev.classmethod.jp/cloud/aws/aws-kinesis-firehose-announced/)という常駐serviceもReleaseしており、このfluentdっぽいServiceで、ServerのAccess/error Logなどを簡単にS3/Redshiftに放り込む事もできる

ちなみに、Java版AWS Firehose SDKをAndroid Appに組み込もうとしましたが、私のAndroid戦闘力が低すぎるのか、AWS Java SDKとAndroid Java Libraryの競合が解決出来ず、組み込む事は出来ませんでした。

と言う訳で、以下、FirehoseをPythonで動かして見ます。

## Kinesis Firehoseの設定を行う
まず、受け取ったLogをS3に保存する、と言うCase想定で、Firehose側の設定を行います。AWS ConsoleのKinesisから、`Go to Kinesis Firehose`を選択し、`Create Delivery Stream`を選択します。
(なお、Kinesis Firehoseは、現時点でUS Oregon等の一部Regionのみサポートです、Tokyoは動きません)

### Step1 `Create Delivery Stream`
まず、受け取ったLogをどこに渡すか、の設定をします。

* `Destination`に`Amazon S3`に選びます
* `Delivery stream name`は適当な名前を(ここでは`Kinesis-S3-Test`としています)
* `S3 bucket`は、受け取ったLogを保存するS3 bucketを選択します(ここでは`kinesis-firehose-test1`としています)
* `IAM　role`は、Kinesis→S3保存の為のroleです、`Create - New Firehose Deliery IAM role`で専用のroleを作ります

![Step1.png](https://qiita-image-store.s3.amazonaws.com/0/67592/896cd529-17e0-b981-49f9-eb41d10e810b.png)

### Step2 `Configuration`
受け取ったLogをS3に書き出すTiming, 圧縮の有無などを設定します。Defaultのままでも良いですが、`60秒毎に`S3に書き出す設定にする為に、`Buffer interval`を60に変えています(最小は60秒)。これで、Logが来ていれば、60秒毎にS3にfileとしてLogが書き出されます。

![Step2.png](https://qiita-image-store.s3.amazonaws.com/0/67592/65bbb3c8-0ac9-9712-9598-899520e74654.png)

### Step3 `Review`
最終確認です。特に問題なければ、`Create Delivery Stream`で設定完了です。
![Step3.png](https://qiita-image-store.s3.amazonaws.com/0/67592/e7cb2de6-887b-3042-f291-2243dca9a8bf.png)


## Python上でKinesis FirehoseにLogを送り付ける

つづいて、Python Scriptから作成した`Kinesis-S3-Test`と言うDelivery Streamsに、logを送り付けます。

### IAM Userの設定
Python scriptからKinesisにアクセスする為のIAM Userを作成します。`AmazonKinesisFirehoseFullAccess`のPermissionを付与して、API/Secret Keyを払い出します。


### Python Scriptの設定
以下のPython codeを作成します。


* `accesskey`, `secretkey`は払い出したAPK/Secret Keyに変えて下さい(以下のCodeは適当なkeyです)
* `region`はここではUS Oregon(=us-west-2)としていますが、適宜変えて下さい
* `DeliveryStreamName`を先ほど作成した、`Kinesis-S3-Test`と設定して下さい
* `pip install boto3`でboto3を入れて下さい。以前boto3を入れた人は`pip install -U boto3`でUpdateを一旦掛けて下さい

やっている事は、1秒毎に`client.put_record`でKinesis Firehoseに`2015-11-13 13:34:21`というformatの現時刻を送り付けています。

```py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import boto3, datetime, time

def main():
  accesskey = 'AKIAABCDEFGHIJK2345PQ'
  secretkey = 'CUQVma+ilWkC7FOU8isueWKWUGk7GB'
  region    = 'us-west-2'
  client = boto3.client('firehose', aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region)

  count = 0
  while count < 100 :
    response = client.put_record(
        DeliveryStreamName='Kinesis-S3-Test',
        Record={
            'Data': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        }
    )
    print(response)
    count += 1
    time.sleep(1)

if __name__ == '__main__':
  main()


```

### S3 bucketの確認
AWS ConsoleのS3に行き、`kinesis-firehose-test1`というBucketを開きます。
`kinesis-firehose-test1/YYYY/mm/DD/hh`というフォルダの下に、Log fileが出来ていると思います。Python scriptで送ったlogが保存されているか確認して見て下さい。

![Step4.png](https://qiita-image-store.s3.amazonaws.com/0/67592/741d95d9-b510-5c6e-5c4d-bb35aa10cd48.png)


## まとめ
とりあえず、PythonからKinesis FirehoseにLogを送り付けてみました。kinesis agentと組み合わせてfluentdの置き換え用途には良いと思います。S3のBucketにLogを置いて、それをTriggerにLambda functionでAmazon Elasticsearchに登録をすれば、Elasticsearch/KibanaもAmazon管理でまかなえます。

ですが、`Android`, `javascript`が今後サポートされれば、Beaconっぽく使えるはずなので、サポートおなしゃす。