ブログリレー

【Kinesis】AWSサービスしりとりリレー 第4日目

皆さんこんにちはyanaiです。
APNアドバンストコンサルティングパートナー昇格記念「AWSサービスしりとりリレー」の4日目です。
頭文字が"k"から始まるサービスということで
[kinesis]について紹介していきます。
kから始まるサービス名を予想されていた方は当たってましたでしょうか?
「とはいえ、頭文字が"k"のAWSのサービスなんてkinesisくらいでは?」と思い、
調べてみるとAmazon KendraKMSなどそこそこ引っかかり
さすがAWS、サービスの数が多いなと書いてるときに改めて実感しました。

そんなわけで今回は縁の下の力持ち的なサービス[Kinesis]について書いていこうと思います。

Kinesisについて

Kinesisは主に4つの機能に分かれています。

  • Kinesis Data Stream
    大規模にスケーラブルで持続的なリアルタイムのデータストリーミングサービスです。大量のデータをリアルタイムでキャプチャして分析のサービスに渡すことなどが可能です。

  • Kinesis Data Firehose
    リアルタイムのストリーミングデータをS3やRedShift、Elasticsearchなどのデータストア、分析ツールに配信するAWSのマネージドサービスです。
    Kinesis Data Streamとの違いとして、あまり複雑な設定が必要なくサービスを設定したらデータが簡単に流すことができる点が挙げられます。

  • Kinesis Video Streams
    大規模にスケーラブルで持続的なリアルタイムのデータストリーミングサービスです。

  • Kinesis Data Analytics
    ストリーミングデータをリアルタイムで変換および分析できるサービスです。SQL, Java、Pythonなどの言語をサポートしており、これらの言語で結合、時間枠の集計、フィルターなどを実行するアプリケーションを構築できることが特徴として挙げられます。

以上がKinesisの簡単な紹介になります。
共通点としてストリーミングデータをさばくことがサービスのキモになっています。
ストリーミングデータとは、数千ものデータソースによって継続的に生成されるデータのことを指します。
streamが「流れ」の意味を持っているので英語で覚えておくとイメージしやすいですね。
全部の機能を詳細に説明すると膨大な文章量になってしまうので、一番私が慣れ親しんでいる
Kinesis Data Firehoseについて焦点を絞って解説していきます。

Kinesis Data Firehoseの仕組み


上記の図が完結で分かりやすいかと思います。
若干前の機能説明と重複しますが、データの送信元があり、Kinesis Data Firehoseがデータを受けて他の分析、ストレージなどのサービスにデータを流すといった仕組みが実現できるようになっています。

Kinesis Data Firehoseの構成要素

  • 配信ストリーム
    データ配信の単位です。コンパネ作成時に最初に作成する要素になります。

  • データプロデューサー
    Kinesis Data Firehose へのデータの送信元のことを指します。

  • バッファサイズ/バッファ間隔
    Kinesis Data Firehose が送信元から送信先にデータを配信するまでのバッファのサイズ、期間
    です。

料金

Kinesis Data Firehose では、取り込まれたデータの量に基づき料金が発生します。
東京リージョンの場合の料金は以下のようになります。

ユースケース

  • IoT分析
    家庭用電化製品、埋め込みセンサー、テレビ用セットトップボックスといった接続機器から継続的にデータをキャプチャできます。Kinesis Data Firehose ではデータが指定の送信先にロードされるため、ほぼリアルタイムでメトリクス、インサイト、ダッシュボードにアクセスが可能です。

  • ログ分析
    Amazon Kinesis Agent を利用するとサーバーに容易にインストール、設定でき、アプリケーションとサーバーログファイルを自動的に監視して、データを Kinesis Data Firehose に送信できます。Kinesis Data Firehose ではログデータを継続的に送信先にストリーミングするので、データを可視化、分析できます。

触ってみる

今回は簡単にEC2上に設定したwebサーバのアクセスログをkinesisを利用してS3に流す構成を作っていきたいと思います。

構成図

事前準備

1.EC2作成
主題ではないので省略させていただきます。
環境としては以下を利用しています。

OS:CentOS Linux release 7.9.2009 (Core)
webサーバ:Apache 2.4.6

2.IAMロール作成
サービスはEC2を選択して、
IAMロールにアタッチするポリシーは" AmazonKinesisFullAccess"を利用します。

3.ストリーミングデータ配送先のS3を作成
ログ保存用のバケットを作成します。
素直にコンパネから作るだけなので省略します。

Kinesis Data Firehose作成

次にKinesis Data Firehoseの作成をコンパネから行います。"Kinesis"をサービスから選択して、"配信ストリームの作成"をクリックします。

"Create delivery stream"で配信ストリームの名前を入力します。

"Process records"でデータの加工をする場合はLambdaを選べたり、Apache Parquetと連携するときのデータ加工を設定できますが今回はデフォルトのままどちらも"Disable"を選択します。

"Choose a destination"でストリーミングデータの配送先を選択します。今回はS3を選択します。

作成したバケットを設定します。

Prefixは特にいじらずにNextで次の画面へ移行します。

"Configure settings"はデフォルトの設定にしておきます。
Permissionsについてもデフォルトで作成されるIAMロールを適応します。

次の確認画面で問題なかったら"Create delivery stream"で作成します。
1~2分ほどで完成します。

Kinesis Agentのインストール

次にEC2にKinesis Agentをインストールします。

 yum install https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm

インストール出来たら設定ファイルを編集します。

cp -p /etc/aws-kinesis/agent.json{,.org}
vim /etc/aws-kinesis/agent.json

diff /etc/aws-kinesis/agent.json{.org,}
-----------------------
2,4c2,3
<   "cloudwatch.emitMetrics": true,
<   "kinesis.endpoint": "",
<   "firehose.endpoint": "",
---
>   "cloudwatch.emitMetrics": false,
>   "firehose.endpoint": "https://firehose.ap-northeast-1.amazonaws.com",
8,14c7,8
<       "filePattern": "/tmp/app.log*",
<       "kinesisStream": "yourkinesisstream",
<       "partitionKeyOption": "RANDOM"
<     },
<     {
<       "filePattern": "/tmp/app.log*",
<       "deliveryStream": "yourdeliverystream"
---
>       "filePattern": "/var/www/vhosts/example.com/LOG/access_log",
>       "deliveryStream": "yanai-test-firehose"
-----------------------
  • filePattern⇒/var/www/vhosts/example.com/LOG/access_log
  • deliveryStream⇒yanai-test-firehose
  • firehose.endpoint⇒https://firehose.ap-northeast-1.amazonaws.com
    を変更しています。こちらは作成いただいた環境に合わせて調整してください。

こちらが設定できたらログのパーミッションを変更して、サービスを起動します。

chmod 755 /var/www/vhosts/example.com/LOG/
chmod 644 /var/www/vhosts/example.com/LOG/access_log

systemctl enable aws-kinesis-agent
systemctl is-enabled aws-kinesis-agent
systemctl start aws-kinesis-agent
ps aux | grep kinesis

※ログのディレクトリは環境に合わせてください。

Apacheのログフォーマット変更

Athenaでの検索をできるようにするためにログのフォーマットをLTSV形式に変更します。

cp -p /etc/httpd/conf/httpd.conf{,_`date "+%Y%m%d"`}
vi /etc/httpd/conf/httpd.conf
diff /etc/httpd/conf/httpd.conf{_`date "+%Y%m%d"`,}
-----------------------
>     LogFormat "time:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o\tvhost:%{Host}i" ltsv
-----------------------

cp -p /etc/httpd/conf.d/virtual.conf{,_`date "+%Y%m%d"`}
vi /etc/httpd/conf.d/virtual.conf
diff /etc/httpd/conf.d/virtual.conf{_`date "+%Y%m%d"`,}
-----------------------
<   CustomLog /var/www/vhosts/example.com/LOG/access_log combined
---
>   CustomLog /var/www/vhosts/example.com/LOG/access_log ltsv
-----------------------

apachectl configtest
systemctl restart httpd

※設定ファイルの位置は環境に合わせてください。

動作確認

対象サーバにアクセスしてみてログを確認してみます。

http://{EC2のpublicIP}

tailf /var/log/aws-kinesis-agent/aws-kinesis-agent.log | grep success
-----------------------
2021-06-28 17:22:48.901+0900  (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 2 records parsed (15609 bytes), and 0 records sent successfully to destinations. Uptime: 360079ms
-----------------------

successでgrepをかけてログが出力されていたら問題なく動作しています。

S3に吐き出されるのはデフォルトだと5分かかるので少し待ってから確認しに行くと対象バケットにログが出ているのが確認できます。

まとめ

以上がKinesisについての説明になります。
リアルタイムでデータ収集出来て、マネージドのサービスであることが特徴的なサービスですね。
Kinesis Data Firehoseを中心に取り扱いましたが、数ステップでログをS3に渡す機能が実装できました。
今回紹介できなかったKineis Data Firehose以外についても今後記事にしていきたいと思います。
それでは、明日は頭文字"S"から始まるAWSサービスについての記事になります。"S"から始まるサービス結構ありますよね。よかったら何が紹介されそうかちょっと予想してみてください。それでは、読んでいただきありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA