EC2のログ→Kinesis firehose→S3を実装してみた

## これは何

EC2でログ生成→Kinesis firehose→S3、の流れを実装してみたの記事です。

## Kinesis Data Firehoseを作成

コンソールからKinesisへ移動します。
配信ストリームを押下。

![スクリーンショット 2021-08-21 9.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/3e691087-f207-74bc-1e14-c9946d5af857.png)

適当に名前をつけます。
今回は""Direct PUT or other sources""にします。

![スクリーンショット 2021-08-21 9.18.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/1aac58f5-ea23-babc-5a04-c3acfdac25b3.png)

オプションでJSONデータ形式に変換してくれるみたいですが、デフォルトのまま次へ行きます。

![スクリーンショット 2021-08-21 9.24.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a833cf0f-2ed4-0d17-e92d-a764b50ee26e.png)

今回はログデータをS3へ置くので、デフォルトのままでOKです。

![スクリーンショット 2021-08-21 9.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/fb1dbb7c-20b9-0d4e-8a19-813749db5df3.png)

S3バケットを作成します。名前はグローバルで一意でなければなりません。
適当に""tests-0000-tests11"""とかつけておきます。これがFirehoseの宛先になります。

![スクリーンショット 2021-08-21 9.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/5b223a84-7c51-9293-c3f3-2968894103f7.png)

Buffer Sizeで、Firehoseからの受信データを5MBに分割します。
intervalは300になっていますが、より迅速にデータを取り出したいため、最小値の60にします。

![スクリーンショット 2021-08-21 9.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/7537f875-9c87-06fe-a5cd-45428d5aad12.png)

暗号化などありますが、今回はデフォルトで行きます。暗号化されたい方はここで設定できます。

![スクリーンショット 2021-08-21 9.39.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a481c143-c459-6e0d-3314-116b256200d2.png)

最後に、セキュリティアクセス権限を提供するIAMロールが必要です。
Firehoseは、S3にアクセスできる必要があります。それを達成するためにロールを作成します。

![スクリーンショット 2021-08-21 9.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/5e3c933f-7184-a1aa-771d-b9bf46be511b.png)

## EC2セットアップ

Creating...
になっている間に、適当にEC2を立てます。
Security Groupでは、SSH 22番ポートとHTTP 80番ポートをご自身のIPで開けてください。

作成したマシンにSSHします。
AMIをAmazon Linux 2にした場合は、以下でSSHできると思います。

```
$ chmod 600 秘密鍵
$ ssh -i 秘密鍵  ec2-user@パブリックIP
```

データを収集して Kinesis Data Streams に送信するため、kinesis agentをマシンにインストールします。

```
$ sudo yum install –y aws-kinesis-agent
```

aws-kinesis-agentを起動します。

```
$ sudo service aws-kinesis-agent start
```

kinesis agentの設定ファイルを編集します。

```
vi /etc/aws-kinesis/agent.json
```

```json
{
  "cloudwatch.emitMetrics":false,
  "firehose.endpoint": "https://firehose.ご自身のAZ.amazonaws.com",
  "flows": [
    {
      "filePattern": "/var/log/httpd/*log",
      "deliveryStream": "作成したFirehoseの名前"
    }
  ]
}
```

再起動します。

```
$ systemctl restart aws-kinesis-agent
```

WEBサーバーをインストールします。

```
$ sudo yum -y install httpd
$ sudo systemctl enable httpd
$ sudo systemctl start httpd
```

ログの権限を変更します。

```
$ sudo chmod 755 /var/log/httpd
$ sudo chmod 644 /var/log/httpd/*
```

## IAMロール作成

AWSコンソールでEC2へ行き、IAMロールを使って、EC2へアクセス権限を付与します。
EC2内の構成ファイルにアクセスキーやシークレットキーを書くのは、EC2に侵入された場合のことを考えると、セキュリティ的によろしくないです。
EC2にIAMロールをアタッチして認証を行う方がセキュリティ的には好ましいと考えます。
IAMロールを利用する場合、アクセスキーとシークレットキーの項目を設定ファイルに記載する必要は無くなります。

![スクリーンショット 2021-08-21 10.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a466e992-dc38-439c-54f6-bc133cea858b.png)

EC2を押下します。

![aaaaaaaaaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/2e3d5c42-8832-6fb6-d3bf-dbcbdc2f6e17.png)


タグは適当に決めます。

![スクリーンショット 2021-08-21 10.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/7ee581fd-917d-e0ca-0c0f-3bcaa4b0db58.png)

作成したら、ロールをEC2に割り当てます。

## WEBサーバーにアクセスしてログを生成する

```
ブラウザで、
http://<EC2 IPアドレス>/
と入力します。

*今回暗号化してないのでhttpです。
```

ログを見に行きます。

```
＄ tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log
```

下記文字列が出てきたら、送信されていることを確認できます。

```
2021-08-21 03:21:29.935+0000  (Agent.MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.Agent [INFO] Agent: Progress: 4 records parsed (1806 bytes), and 0 records sent successfully to destinations. Uptime: 150060ms
```

それではS3へ出力されているか確認します。
出ていますね。

![スクリーンショット 2021-08-21 12.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/7bc4d883-af0c-7dbd-1beb-ca5924d7e322.png)


```
参考
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/writing-with-agents.html
```