nginxのアクセスログをfluentdを使ってS3にファイルとして保存する（EC2 + nginx + fluentd + S3）

環境
MacBook Air (M1, 2020)
MacOS Big Sur v11.5.1
zsh

必要なこと
AWSのアカウントを持っている

---

今日はEC2にnginxとfluentdを入れてS3にファイルとして保存する方法を紹介していきたいと思います

### EC2にインスタンスを作っていくぅ〜

<details><summary>詳細を表示</summary>
<div>
まず初めに使うのはこれ　デュルルルルルルシュコー　『AWS マネジメントコンソール』　



![１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/4064f7f9-93eb-46b2-9197-e3f8215eb766.jpeg)

やってまいりましたマネジメントコンソール
EC2とタイトルに書いてあるのでとりあえずEC2をクリックしましょう
もし見えるところになければ上の虫眼鏡のところにEC2と入力すれば出てくると思います

---

するとこんな感じの画面が出てきます
この画面を初めて見た時は何をしたらいいかわからなすぎて気絶してしまいました
今回は「インスタンスを起動」をクリックして先に進みます。何も怖くありません

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/bb6b8f68-bfa0-721c-763b-46b810c7cc69.jpeg)

---

そしてその先にあるのがこれです
今回はただnginxを入れるだけなので無料枠でいいと思います

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/6f77e2c3-aa99-ec51-f66f-a474f4c4245f.jpeg)

---


この画面では最初から無料利用枠の対象が選択されているのでこのまま右下の「次のステップ」をクリックして先に進みます

![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/9d01837a-4765-8776-4214-65e9e8a1a98f.jpeg)

---

次の画面でも今回は何も考えずに先に進みます

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/b420900d-a3de-e832-7b88-c3da239feb75.jpeg)

---

ここでは30GBまで無料で増やせると言われていますが、そんなに使わないのでこれも変更なしでいいです
ちなみに文字で隠れていますが8GiBになっています

![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/a5122a04-f527-3ef7-af47-974cd56acbb0.jpeg)

---

この画面ではNameタグを追加していますが別にやらなくてもいいです
名前つけなくていいやという方はそのまま次のステップへ

![９.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/5d65d085-50d7-7f28-70d1-551fe59deeb7.jpeg)

---

警告されていますが、このまま進んで大丈夫です

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/1efd35bf-a94a-235e-eb43-b700513befca.jpeg)

---

ここも特に気にせずに先に進みます

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/181ce8b3-0e44-cdeb-c6d1-5d4fda8f6a37.jpeg)

---

するとこんなのが出てくるので、既存のキーペアを使いたい人はそのままでいいですが、ない人もいるかもしれないので新しいキーペアの作成をしていきます

![12jpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/b5f9854c-ecd5-7177-209a-2119f7d1db14.jpeg)

---

![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/436342d2-abd5-c24c-c974-788a7796ff1c.jpeg)

---
キーペアがダウンロードされたのでインスタンスの作成をクリックできるようになりました
クリックします

![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/2ae0ec4c-a8db-d3ee-55ff-c834f62e4f5b.jpeg)

---

インスタンスの表示をクリックしてインスタンス一覧を見に行ってみましょう

![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/52e1f01f-2f37-44d4-366b-cbe1f23f748e.jpeg)

---


</div>
</details>


![17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/d4ca31b7-52ac-8373-ee54-3e27b819c7a9.jpeg)
インスタンスができました

---

### EC2にSSH接続していくぅ〜

<details><summary>詳細を表示</summary>
<div>

前回ダウンロードしたキーを使ってssh接続できるようにしていきます

まずはダウンロードフォルダにキーが存在しているか確認してみます

```
[~] % ls Downloads/                                                                                                                        
nginx-fluentd.pem
```

ありました

権限を変更していきます

```
[~] % sudo chmod 400 Downloads/nginx-fluentd.pem                                                                                               
```

.sshディレクトリに移動しておきます

```
[~] % mv Downloads/nginx-fluentd.pem ~/.ssh                                                                                                    
```

AWSマネジメントコンソールに移動してインスタンスの「パブリック IPv4 アドレス」をコピーしてきます

![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/f2385d49-41f3-0fd3-f6ef-1037ff8a02d9.png)

からの

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/2be52ada-a90a-a4d2-367e-cabf7c26df7a.png)

Elastic IP使わないのか？と思うかもしれませんが、今回はそこまで長く使わないのでアドレスの割り当ては行いません

configを開きます

```
[~] % vim ~/.ssh/config
```

i を押して編集していきます

以下のブロックを適当なところに貼り付けて　esc からの :wq　で保存して抜けます

```~/.ssh/config
Host nginx-fluentd
  HostName 54.178.155.3
  User ec2-user
  IdentityFile ~/.ssh/nginx-fluentd.pem 
```

configの設定ができたらEC2の中に入っていきます

次のコマンドで

```
Received disconnect from 12.345.6.789 port 22:2: Too many authentication failures
Disconnected from 12.345.6.789 port 22
```

と出てしまって接続できない方は

[Mac SSH 設定](https://qiita.com/ucan-lab/items/21d62f1beaa8007c4ca9)
を見てみるといいかもしれないです

</div>
</details>

```
[~] % ssh nginx-fluentd                                                                                                                       13:28:36
Warning: Permanently added '54.178.155.3' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
6 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-123-45-67-890 ~]$ 
```

できました

---

### nginxを入れていくぅ〜

<details><summary>詳細を表示</summary>
<div>

とりあえず言われた通り　sudo yum update をしておきます。

```
[ec2-user@ip-123-45-67-890 ~]$ sudo yum update
```

--- 

nginxを入れる前にEC2にhttpでアクセスできるようにしておきます

EC2のインスタンスの設定を開いてセキュリティの設定を表示します
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/a85d7b77-320b-788f-81ec-3f3c6739d51c.png)

---

セキュリティグループのリンクをクリックします

![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/6ed4fdeb-df99-dd82-512b-5d845ed38c06.png)

---

インバウンドのルールを編集していきます

![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/0f8d9486-1909-6e1d-2568-760bb8e3d4fd.png)

---

ルールを追加します

![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/6d265421-d58d-5c70-f6d7-a8be4ba01ee8.png)

---

タイプをHTTPにします
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/fa0afc41-68cb-f3b2-adc1-001923f0a863.png)

---

ソースをマイIPにします
これはどこからでもアクセスできるとたくさんログが出てしまって大変だからです

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/f79438a8-cb26-e7c4-609c-74421d49869b.png)

---

ルールを保存します
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/6ec5942d-3758-76b2-13fe-872449adf49b.png)

---

これでEC2の設定は終わりです
ここからはこちらの記事を参考に進めていきます
[AWS EC2にNginxをインストールする](https://qiita.com/e-onm/items/0814b6c4db395e331df1)

nginxを入れていきます

```
[ec2-user@ip-123-45-67-890 ~]$ sudo amazon-linux-extras install nginx1
```

nginxを起動します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo systemctl start nginx
```

54.178.155.3（パブリック IPv4 アドレス） にアクセスしてみます

</div>
</details>



![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/89aa158c-4997-5cd4-1bfe-14bc36a8e3a2.png)

表示されました

----

### fluentdを入れていくぅ〜

<details><summary>詳細を表示</summary>
<div>


今回はlinuxなので以下のコマンドで入れます

```
[ec2-user@ip-123-45-67-890 ~]$ curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent4.sh | sh
```

fluentdを起動します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo systemctl start td-agent.service
```

fluentdが動いているかテストをします　
</div>
</details>

```
[ec2-user@ip-123-45-67-890 ~]$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
[ec2-user@ip-123-45-67-890 ~]$ tail -n 1 /var/log/td-agent/td-agent.log
2021-12-18 05:47:21.308254823 +0000 debug.test: {"json":"message"}
[ec2-user@ip-123-45-67-890 ~]$ 
```

動きました

---

### nginxのアクセスログを確認していくぅ〜

<details><summary>詳細を表示</summary>
<div>

nginxのアクセスログがどこに吐かれるのか忘れたので確認します

```linux
[ec2-user@ip-123-45-67-890 ~]$ vim /etc/nginx/nginx.conf
```

ありました

```
access_log  /var/log/nginx/access.log  main;
```

アクセスログを確認してみます
</div>
</details>

```
[ec2-user@ip-123-45-67-890 ~]$ sudo cat /var/log/nginx/access.log
123.4.567.890 - - [18/Dec/2021:04:49:30 +0000] "GET / HTTP/1.1" 200 3520 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [18/Dec/2021:04:49:30 +0000] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [18/Dec/2021:04:49:30 +0000] "GET /favicon.ico HTTP/1.1" 404 3665 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
```

ちゃんと吐かれているみたいです

---

### nginxのアクセスログをS3にファイルとして保存していくぅ〜

<details><summary>詳細を表示</summary>
<div>

まずはファイルを保存するためのバケットを作成していきます
AWSマネジメントコンソールからS3を選択してこの画面にいき、バケットを作成をクリックします

![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/3ca1d882-1e25-443c-9496-bcb18e8df4eb.png)

---

バケット名を入力します

![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/5dd1bb6a-6d8e-c886-5933-0316c0b7eadc.png)

---

バケットを作成をクリックします

![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/17180a40-93e9-6251-c079-481b67aef524.png)

これでバケットが作成できました

---

次はfluentdの設定を編集していきます

ここではawsの認証キーが必要なのでAWSコンソールのIAMでユーザーを作成していきます

AWSマネジメントコンソールにログインしIAMと検索し、ユーザーをクリックします

その後、ユーザーを追加をクリックします

![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/c03c651e-fefc-1b8e-ab9b-8b2b2fc0ea6a.png)

---

名前はなんでもいいのですが今回はnginx-fluentdという名前にしておきます

アクセスキー・プログラムによるアクセスにチェックし、次のステップに進みます

![39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/48bc784a-ca2d-5c61-d78b-c8ec8ad36ceb.png)

---

ここでは権限を制限するためのグループを設定することができます
グループがないので作っていきます

![38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/3fef7abb-ac9b-b017-3788-5cc6062a38b2.png)

---

グループ名を適当につけて、EC2のフルアクセス権限にチェックを入れます

![36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/1c9cb81d-7362-97a3-2275-351af1e0c331.png)

---

次にS3のフルアクセス権限にチェックを入れ、グループの作成をクリックします
これでEC2とS3にフルアクセスできるグループができました

![35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/5a839df9-27ac-f9e2-e036-4adabdfcb72f.png)

---

タグは追加せずに進みます

![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/053180eb-40e0-37f0-1a82-6a787d54958d.png)

---

ユーザーの作成をクリックします

![34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/0e233ef7-bcb8-3523-465a-463958a510a0.png)


次の画面に表示される「Access key ID」と「Secret access key」をfluentdの設定で使うのでcsvファイルをダウンロードするかメモしておいてください


---


それではアクセスキーが作成できたのでfluentdの設定を書いていきたいと思いますが、その前にfluentdがnginxのログファイルにアクセスできるように権限を変更しておきたいと思います

```
[ec2-user@ip-123-45-67-890 ~]$ sudo chmod 777 /var/log/nginx/
```

これでfluentdがnginxのログファイルにアクセスできるようになったのでfluentdの設定をしていきます
以下のコマンドで設定ファイルが開けます

```
[ec2-user@ip-123-45-67-890 ~]$ sudo vim /etc/td-agent/td-agent.conf 
```



i を押して編集していきます

以下のブロックを

```/etc/td-agent/td-agent.conf 
####
## Source descriptions:
##
```
の下に貼り付けてください

aws_key_id と　aws_sec_key と s3_bucketは自分のものに書き換えてください

```/etc/td-agent/td-agent.conf 
<source>
  @type    tail
  path     /var/log/nginx/access.log
  format   nginx
  tag      nginx.access
  pos_file /var/log/nginx/access.log.pos
</source>

<match nginx.**>
  @type                s3
  aws_key_id           #################
  aws_sec_key          ##############################
  s3_bucket            ##########
  s3_region            ap-northeast-1
  path                 ${tag}/
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}

  <buffer tag,time>
    @type            file
    path             /var/log/td-agent/s3
    timekey          3600
    timekey_wait     10m
    timekey 60
    timekey_wait 60
    chunk_limit_size 256m
  </buffer>
</match>

```

　esc からの :wq　で保存して抜けます

fluentdを再起動します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo systemctl restart td-agent
```

54.178.155.3（パブリック IPv4 アドレス）　にアクセスしてみます

nginxにログが吐かれているか確認してみます


```
[ec2-user@ip-123-45-67-890 ~]$ cat /var/log/nginx/access.log
123.4.567.890 - - [19/Dec/2021:08:40:34 +0000] "GET / HTTP/1.1" 200 3520 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [19/Dec/2021:08:40:34 +0000] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [19/Dec/2021:08:40:34 +0000] "GET /favicon.ico HTTP/1.1" 404 3665 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
```


吐かれているのでS3を見に行ってみましょう

---

nginx-fluentdというバケットをクリックします

![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/806d86b7-117a-f16e-1faa-d7e61820002b.png)

---

nginx.access/ をクリックします

![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/d4ee94c4-90a2-1bb2-cf26-cf7deb30f6b8.png)

---

</div>
</details>


![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298322/ffa389a6-9cd8-90d6-86f4-2cca8cd9f74c.png)

ファイルができました

---

### （おまけ）ログに出力される時間を日本時間にしていくぅ〜

<details><summary>詳細を表示</summary>
<div>
これで終わりにしてもいい気もしますが、nginxのアクセスログに書かれている時間がUTCになっているので
日本時間に直しておきます

以下のコマンドで設定ファイルを開きます

```
[ec2-user@ip-123-45-67-890 ~]$ sudo vim /etc/sysconfig/clock
```

i を押して編集していきます

これを貼り付けます

```/etc/sysconfig/clock
ZONE="Japan"
UTC=true
```
　esc からの :wq　で保存して抜けます

/etc/localtime とタイムゾーンファイルの間にシンボリックリンクを作成します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
```

再起動します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo reboot
```

インスタンスにログインします

```
[~] % ssh nginx-fluentd
```

変更を確認します

```
[ec2-user@ip-123-45-67-890 ~]$ date
2021年 12月 19日 日曜日 18:56:26 JST
```

日本時間になりました

nginxとfluentdを再起動します

```
[ec2-user@ip-123-45-67-890 ~]$ sudo systemctl restart nginx
[ec2-user@ip-123-45-67-890 ~]$ sudo systemctl restart td-agent
```

54.178.155.3（パブリック IPv4 アドレス）　にアクセスしてnginxのアクセスログを見てみます

</div>
</details>

```
[ec2-user@ip-123-45-67-890 ~]$ cat /var/log/nginx/access.log
123.4.567.890 - - [19/Dec/2021:19:11:09 +0900] "GET / HTTP/1.1" 200 3520 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [19/Dec/2021:19:11:09 +0900] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
123.4.567.890 - - [19/Dec/2021:19:11:10 +0900] "GET /favicon.ico HTTP/1.1" 404 3665 "http://54.178.155.3/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36" "-"
```
日本時間になりました

---

次に読むといいかもしれない記事↓
### [fluentd × New Relic でnginxのアクセスログをNew Relic Oneで見れるようにしよう！](http://tech.aainc.co.jp/archives/12064)

---


アライドアーキテクツでは月1回程度のペースでエンジニア採用を目的とした Meetup を行っています！
開催時期によって対象者が変わるのですが、今回の開催は2023年の4月入社になる方が対象です！（文理・学歴不問）
HTML&CSSしか書いたことないという方でも大歓迎です！

https://www.wantedly.com/projects/676498