1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

Kinesis エージェント インストール時の手順といろいろメモ

EC2 から Kinesis Firehose にデータを配信する際のKinesis エージェント インストールの手順を検証しました。
エラーやひっかかりポイントもメモしています。
殴り書きですが、誰かの助けになれば嬉しいです。

(Kinesis Datastream の場合もほぼ同様の手順で設定できます。
エージェントの設定ファイルで datastream.endpoint を記載する必要があります。)


Kinesis エージェントインストール前の環境準備

1. Agent をインストールする EC2 に IAM ロール付与

検証では S3 に配信する設定にしたので以下の権限を IAM ロールに設定しました。
 ・AmazonKinesisFirehoseFullAccess
 ・CloudWatchFullAccess
 ・AmazonS3FullAccess

必要な権限を Kinesis エージェントの設定ファイルに AWS アクセスキーとシークレットアクセスキーを設定する方法もあります。
また、Kinesis エージェントは他 AWS リソースに Put 権限が必要な操作がほとんどなので、必要な場合は更に権限を絞れると思います。

AWSドキュメント> Amazon Kinesis Data Streams > 前提条件


Kinesis エージェントの設定

1. エージェントインストール

インストールOS : Amazon Linux2

AWS ドキュメントの「Amazon Linux AMI を使用してエージェントを設定する」方法だと、以下のエラーが出てしまいます。(2020年4月時点の amazonlinux2)

$ sudo yum install –y aws-kinesis-agent
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                     | 2.4 kB  00:00:00     
No package aws-kinesis-agent available.
Error: Nothing to do

Kinesis エージェントの GitHub ページ(GitHub - awslabs/amazon-kinesis-agent: Continuously monitors a set of log files and sends new data to the Amazon Kinesis Stream and Amazon Kinesis Firehose in near-real-time.)を見に行くと README に以下の記載がありました。

Building from Source
The installation done by the setup script is only tested on the following OS Disributions:

Red Hat Enterprise Linux version 7 or later
Amazon Linux AMI version 2015.09 or later
Ubuntu Linux version 12.04 or later
Debian Linux version 8.6 or later

ということで今回は AWS ドキュメントに記載の「Red Hat Enterprise Linux を使用してエージェントを設定する」方法でインストールしちゃいます。

$sudo yum install –y https://s3.amazonaws.com/streaming-data-agent/aws-kinesis-agent-latest.amzn1.noarch.rpm
.
.
.
Complete!

ちょっと遠回りでしたがインストールできました。バージョンも確認しておきます。

$ yum list | grep aws-kinesis-agent
aws-kinesis-agent.noarch               1.1.4-1.amzn1                  installed 


2. Kinesis エージェント設定ファイルの編集

Kinesis エージェントの設定ファイルを編集して、Kinesis Firehose にデータ配信できるようにします。

vim /etc/aws-kinesis/agent.json

設定ファイルの処理オプション等の情報は、以下の AWS ドキュメントにまとまっています。
Agent Configuration Settings

今回は以下のように設定しました。

{
  "cloudwatch.emitMetrics": true,
  "cloudwatch.endpoint": "https://monitoring.ap-northeast-1.amazonaws.com",
  "firehose.endpoint": "https://firehose.ap-northeast-1.amazonaws.com",

  "flows": [
    {
      "filePattern": "/tmp/demo-app.log/*",
      "deliveryStream": "demo-firehose-stream",
      "initialPosition": "START_OF_FILE",
      "maxBufferAgeMillis": "2000",
      "dataProcessingOptions": [
        {
          "optionName": "LOGTOJSON",
          "logFormat": "COMBINEDAPACHELOG"
        }
      ]
    }
  ]
}

設定ファイルの内の "dataProcessingOptions" は Kinesis にデータ配信する前にログ処理(加工)ができる設定です。
"optionName": "LOGTOJSON" はログ形式が Apache log や Syslog の場合には有効な処理オプションです。

LOGTOJSON
ログ形式から JSON 形式にレコードを変換します。サポートされているログ形式は、Apache Common Log、Apache Combined Log、Apache Error Log、および RFC3164 Syslog です。
Use the Agent to Preprocess Data

他処理オプションだと CSV ファイル等も変換できます。
詳細は AWS ドキュメントに記載されています。
Use the Agent to Preprocess Data

3. Kinesis エージェント起動

以下コマンドでエージェントを起動します。

$ sudo service aws-kinesis-agent start

他コマンドもまとめて記載します。
※設定ファイル(/etc/aws-kinesis/agent.json)変更後は再起動をお忘れなく!

# サービス起動停止
$ sudo service aws-kinesis-agent start
$ sudo service aws-kinesis-agent restart
$ sudo service aws-kinesis-agent stop
$ sudo service aws-kinesis-agent status

# 自動起動の設定
$ sudo chkconfig aws-kinesis-agent on
$ sudo chkconfig aws-kinesis-agent off


その他メモ

  • Kinesis エージェントの設定ファイル例

AWS ドキュメントにエージェントの設定ファイル例があります。
AWSドキュメント> Amazon Kinesis Data Streams > エージェントの設定

GitHub にも参考になりそうな agent.json がありました。
amazon-kinesis-agent/configuration/example at master · awslabs/amazon-kinesis-agent · GitHub


  • Kinesis firehose 確認用 awscli コマンド Kinesis エージェントをインストールした EC2 上で、EC2⇔Firehose 間の疎通確認をした時のコマンドメモです。
# Kinesis firehose の設定値確認
$ aws firehose describe-delivery-stream --delivery-stream-name demo-firehose-stream

# Kinesis firehose でテストレコード配信
$ aws firehose put-record --delivery-stream-name demo-firehose-stream --record Data="some data\n"

# Kinesis firehose で JSON データでテストレコード配信
$ aws firehose put-record --delivery-stream-name demo-firehose-stream --record '{"Data":"{\"field1\":vlue1}"}'


  • S3 確認用 awscli コマンド ちゃんとログが S3 に配信されているか確認する時用のメモです。
$ aws s3 cp s3://${BUCKET_NAME}/2020/04/01/04/demo-firehose-stream-1-2020-02-13-04-13-17-xxx-xxx-xxx-xxx-xxx - | cat


aws s3 ls s3://${BUCKET_NAME} --recursive


  • Kinesis エージェントのログ確認 ログは /var/log/aws-kinesis-agent/aws-kinesis-agent.log に出力されます。 以下はデータ配信が上手くいかなかった時に出たエラーのメモです。
# パスが上手くいってない時のエラー
2020-02-13 05:42:03.245+0000  (FileTailer[fh:demo-firehose-stream:/home/ec2-user/apache-log*]) com.amazon.kinesis.streaming.agent.Agent [ERROR] FATAL: Thread FileTailer[fh:demo-firehose-stream:/home/ec2-user/apache-log*] threw an unrecoverable error. Aborting application
java.lang.RuntimeException: java.nio.file.AccessDeniedException: /home/ec2-user

# 必要な AWS サービスの権限が無い時のエラー
2020-02-13 06:59:04.043+0000  (sender-57) com.amazon.kinesis.streaming.agent.tailing.AsyncPublisher [ERROR] AsyncPublisher[fh:demo-firehose-stream:/tmp/demo-apache-log/*]:RecordBuffer(id=2,records=20,bytes=4626) Retriable send error (com.amazonaws.services.kinesisfirehose.model.AmazonKinesisFirehoseException: User: arn:aws:sts::123456789012:assumed-role/demo-firehose-stream/i-xxxxx is not authorized to perform: firehose:PutRecordBatch on resource: arn:aws:firehose:ap-northeast-1:123456789012:deliverystream/demo-firehose-stream (Service: AmazonKinesisFirehose; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxx-xxx-xxx-xxx-xxx)). Will retry.

# その後成功した時のログ
2020-02-14 03:18:13.802+0000  (FileTailer[fh:demo-firehose-stream:/tmp/demo-apache-log/*].MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.tailing.FileTailer [INFO] FileTailer[fh:demo-firehose-stream:/tmp/demo-apache-log/*]: Tailer Progress: Tailer has parsed 5938 records (1344370 bytes), transformed 0 records, skipped 0 records, and has successfully sent 5938 records to destination.
2020-02-14 03:18:13.808+0000  (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 5938 records parsed (1344370 bytes), and 5938 records sent successfully to destinations. Uptime: 68580047ms


参考 AWS ドキュメント

Kinesis エージェントを使用した Kinesis Data Firehose への書き込み

Amazon CloudWatch による Kinesis Data Streams エージェントのヘルスのモニタリング

サンプルデータを使用した配信ストリームのテスト

Amazon Kinesis Data Firehose データ配信

複数のファイルディレクトリを監視し、複数のストリームに書き込み

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?