FargateからFireLensで三つ股出力（1 of 2）

単一のFargateから、FireLensを使ってCloudWatch Logs（以下CWL）、Kinesis Data Firehose（以下KFH）、Amazon Elasticsearch Service（以下AES）に三つ股ログ出力する方法について。

## やりたいこと
- FargateタスクからFireLensを介して複数ターゲットにログをルーティングする。

アプリコンテナ（ログ設定をawsfirelensに指定）→FireLens
 →CWL
 →KFH
 →AES

## 事前準備
まずはテスト用にFireLens行き設定を含むアプリコンテナと、FireLensコンテナを準備する。
FireLensはいわゆるサイドカー（同じタスク定義内での別のコンテナ）として用意する。
タスク定義にFireLens統合のセクションがあるので、[こちら](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-task-definition.html)を参考に作成。今回は、以前作成したタスク定義（myFargateSvc）に新しいリビジョンを追加する形で行う。それにしても、ECSをマネジメントコンソールから操作しようとするとコマンドラインよりむしろ辛い気がするのは何故なのか。

有効化するにはここにチェックを入れるだけ。
<img width="874" alt="スクリーンショット 2020-08-12 午前0.46.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/00e36ddd-8eb5-4391-6db1-59a6d93dc738.png">
<img width="864" alt="スクリーンショット 2020-08-12 午前1.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/118de1b1-699d-fc87-e3d8-b8fc9d64463c.png">

Beforeが
<img width="1534" alt="スクリーンショット 2020-08-12 午前0.51.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/3a527862-6e6d-738e-2aed-918e6ed00ec2.png">

Afterになる。サイドカーとはよく言ったものだ。
<img width="1542" alt="スクリーンショット 2020-08-12 午前0.49.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/2d718304-1d17-5a5a-edd9-5e8666363e51.png">

あっさり完了かと思いきや、エラー。
<img width="858" alt="スクリーンショット 2020-08-12 午前0.56.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/f5270621-139c-9845-c63d-3b20b26ddd98.png">

どうやら、アプリコンテナ側に明示的にawsfirelensログドライバーを指定してあげないとだめらしい。やってよそれぐらい。
<img width="864" alt="スクリーンショット 2020-08-12 午前1.59.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/60564eaf-b622-4cb7-1319-64412f289851.png">

どうにかタスク更新完了。
<img width="679" alt="スクリーンショット 2020-08-12 午前1.03.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/ad88247d-f5f7-f626-a600-16e3c5ce3f88.png">


このあと、当該サービスでタスクのリビジョンを新たに作成したものに置き換えれば、下準備は完了。
<img width="543" alt="スクリーンショット 2020-08-12 午前1.14.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/d9c4932e-2bc2-9b4c-477c-eddcf03f1ab2.png">

## Step by Step

アプリコンテナからFireLensに吐き出す準備ができたので、以下、三つ股ログ設定のStep by Step。

### 1. CWL

まずはCWLに吐き出すところから。
これだけだと、別にFireLensを介在させる必要はなくてawslogsドライバーで事足りるわけだが、何はともあれ、FireLens（fluentbit）がちゃんと動くことを確認しなくては始まらない。
一応整理しておくと、以下のようになる。

|構成|ログドライバー|経路|
|:--|:--|:--|
|いつもの構成|awslogs|アプリコンテナ→awslogs→CWL|
|今回の構成|awsfirelens|アプリコンテナ→awsfirelens→FireLensコンテナ（fluentbit）→awslogs→CWL|

と、ここまで書いたところで（エラーもあって）やや力尽きたので、続きは改めて。

---

**同日 2:10am 追記：**
FireLensコンテナ（log_router）は、デフォルトだとそれ自身のターゲットが指定されていないため、このままだとタスク更新時にエラーになることが判明。
タスクのリビジョン追加時に、log_routerコンテナの設定に移動して`Auto Config CloudWatch Logs`にチェックを入れ（または[CWL設定](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/using_awslogs.html)を手入力し）、FireLensコンテナ自身のロググループを構成して初めて、正常にサービスが更新可能になる模様。やってよそれくらい。

また、アプリコンテナ側も、手なりでawsfirelens設定をすると`Name`というキーがバリューなしで設定されてしまい、CWLにログこそ吐き出されるようになるものの以下のような残念なメッセージでサービス起動が失敗する羽目になるので注意。
<img width="897" alt="スクリーンショット 2020-08-12 午前2.08.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609876/5e96b718-9ebe-e19a-cb41-367e07af5271.png">

**8/12追記：**
少々わかりにくいところだが、FireLensコンテナに入れる`awslogs`（CWL出力）設定は、あくまでFireLensコンテナ上のfluent-bitが自身のシステムログを吐き出すための設定で、本題であるアプリコンテナのログ出力先とは違う。それはアプリコンテナの`awsfirelens`設定で書くわけだが、書いた結果が最終的にFireLensコンテナ上のfluent-bit.confに反映されてアプリコンテナのログルーティングに使われる、という関係性になる。

というわけで、アプリコンテナ側のログ設定にキー/バリューの形でCWL設定を入れていけば「アプリコンテナからFireLens経由でCWL」というここでの目的が達せられるのだが、詳細は次回。