[AWS]Fargate+Firelens(Fluentbit)でapache-loggenを実行しCloudwatchLogsへログ転送する

# やりたい事

2022/01/13開催の [SB Tech Festival](https://www.softbank.jp/biz/events/techfestival-deeptech-2022/) で登壇した内容、「ビッグデータ活用の第一歩AWS環境での大容量ログ可視化」の詳細手順(前半)ページです。

### このエントリで解説するのは以下のイメージ
![2022-01-11_09h20_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/f74374c2-9f60-7aa0-0dca-c76b14d2a601.png)

後半部分のLambda+OpenSearchについては[こちら](https://qiita.com/Kedamari/items/9210d108c6ffff9b2a65)の記事を参照してください。

# 手順
2022/01/11時点でECSコンソールは新しいエクスペリエンスが提供されていますが、本エントリでは旧UIをベースに解説しています。

## 1.Fargate実行の為のクラスターを用意する

今回オーケストレーターはEKSではなく、ECSを利用します。
まず、FargateはECSの機能の一部という扱いなので、サーバレスアーキテクチャではあるものの最初にクラスターを用意する必要があります。
あまり深く考えずに以下のようにECSコンソールから新しいクラスターを作成しましょう。
![2022-01-11_09h25_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/741bfd8e-6959-4f27-779f-6eab5ca39161.png)

クラスターテンプレートはFargateの場合ネットワーキングのみとします。
![2022-01-11_09h25_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/08249097-f44a-4fa9-9744-0c3dadef4cfd.png)

:::note info
IAM管理ポリシー、IAMロールのタグや名前は任意の内容でOKです。本手順上では便宜上「apache-loggen」とします。
:::

## 2.実行に必要なIAMロールを作成しておく

IAM管理ポリシーを新規作成し、
![2022-01-11_09h42_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/12015437-6ff2-e444-b1fa-f2ef04bc71f6.png)

JSONタブを開き、
![2022-01-11_09h43_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/ddab8dd6-10dd-76cf-4124-20ecd1462662.png)

以下のJSONをコピペします。これはFargateコンテナからCloudwatchLogsの必要な操作が出来るように権限を付与する内容です。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
```

続いてIAMロールを新規作成し、
![2022-01-11_09h45_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/9a9fcd6e-5e5e-8a22-5056-a513b47a2771.png)

以下の通りにロールの利用方法を指定します。
![2022-01-11_09h48_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/22ccc906-8ad6-cc06-7f75-3943c435f63b.png)

次の画面で、作成済みのIAM管理ポリシーを指定しCloudwatchLogs操作関連のロール作成は完了です。

続いて、既成のIAM管理ポリシーである**AmazonECSTaskExecutionRolePolicy**を指定したロールも作成しておきましょう。

:::note info
IAM管理ポリシー、IAMロールのタグや名前は任意の内容でOKです。
:::

## 3.タスク定義を作成する

クラスターが用意出来たら、Fargate用のタスク定義を新規に作成します。
![2022-01-11_09h26_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/693bc9f3-549b-5cd7-f773-8de52d47767a.png)

以下の通りに設定を進めます。

|項目名|設定内容|
|---|---|
|定義名|apache-loggen-task|
|タスクロール|<(2)で作成した**AmazonECSTaskExecutionRolePolicy**を指定したロールを指定>|
|互換性が必要|Fargateにチェック|
|オペレーティングシステムファミリー|Linux|
|タスク実行ロール|<(2)で作成したCloudwatchLogs操作関連のIAMロールを指定>|
|タスクメモリ (GB)|0.5GB|
|タスク CPU (vCPU)|0.25vCPU|
|FireLens の統合を有効にする|チェック|
|タイプ|Fluentbit|
|イメージ|自動選択のまま「適用」ボタンをクリック|

上記を進めると、図示のように log_routerコンテナのみが作成されている状況になります。
![2022-01-11_10h05_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/d78e8090-429a-af03-a4d9-a13a084d6a49.png)

log_routerコンテナ名部分をクリックして、ヘルスチェックのみ以下の内容通りに編集しておきます。

|項目名|設定内容|
|---|---|
|コマンド|echo '{"health": "check"}' &#124; nc 127.0.0.1 8877 &#124;&#124; exit 1|
|間隔|180|
|タイムアウト|30|
|開始期間|180|
|再試行|3|

![2022-01-11_10h06_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/ab710af7-54de-22ed-bdf9-49b655eb5f1b.png)

続いて本体のコンテナを作成します。

![2022-01-11_10h05_112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/c722fee4-28b3-bb2b-afbc-187b669cc636.png)

|項目名|設定内容|
|---|---|
|コンテナ名|apache-loggen|
|イメージ|public.ecr.aws/t9o0n2i8/kedamari:latest|

Dockerイメージは個人的に用意したものをパブリック公開しておきましたので、上記内容のまま使っていただけます。
中身はCentOS7のイメージに、Rubyとapache_loggen gemを導入しただけのものなので、慣れている方はもちろんご自身で作成いただいてもOKです。

コンテナのヘルスチェックは以下の通りに設定します。

|項目名|設定内容|
|---|---|
|コマンド|/root/.rbenv/shims/apache-loggen --limit 1|
|間隔|10|
|タイムアウト|5|
|開始期間|5|
|再試行|3|

![2022-01-11_09h29_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/0807f545-99e7-a6f9-8397-3869b08a91cc.png)

環境設定は以下の通り、PATHを通してください。

|項目名|設定内容|
|---|---|
|CPU ユニット数|0|
|エントリポイント|/usr/bin/bash|
|コマンド|/root/.rbenv/shims/apache-loggen,--rate=20|
|作業ディレクトリ|/|
|環境変数(PATH)|/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin|

また、スタートアップ順序依存はコンテナ名に log_routerを指定し、状態を HEALTHY指定としましょう。
(念の為Firelensのサイドカーコンテナが起動したのちに、ログを生成させる挙動にする為です。)

![2022-01-11_10h14_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/239cf1bf-3607-2965-9b66-74f9950ccb0e.png)

最後にストレージとログを以下のように設定します。

|項目名|設定内容|
|---|---|
|ログドライバー|awsfirelens|

■ログオプション(全てValue指定)

|項目名|設定内容|
|---|---|
|log_group_name|/apache-dummy-log|
|auto_create_group|true|
|log_stream_prefix|fargate-|
|region|ap-northeast-1|
|Match|*|
|Name|cloudwatch_logs|

![2022-01-11_10h18_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/2ff287b5-2b3c-b668-8c5a-4e7ec61d2cd4.png)

## 4.サービスを起動する

事前にVPCの作成が必要です。任意のVPCを作成したい場合は thak4さんの「[AWS VPC作成手順](https://qiita.com/thak4/items/5a16a619b3555d3a77ee)」あたりを参考にしてください。

|項目名|設定内容|
|---|---|
|クラスター|apache-loggen <実際には手順1で作成した任意の名称>|
|起動タイプ|FARGATE|
|オペレーティングシステムファミリー|Linux|
|タスク定義|apache-loggen-task:X <末尾の数字はリビジョンなので、タスク定義の更新都度インクリメントされます>|
|プラットフォームのバージョン|LATEST|
|サービス名|apache-loggen-service|
|サービスタイプ|REPLICA|
|タスクの数|1|
|最小ヘルス率|100|
|最大率|200|
|デプロイサーキットブレーカー|無効|

デプロイメントは初回選択項目から変更無しです。
次のステップへ進み、ネットワークは以下の通り設定します。

|項目名|設定内容|
|---|---|
|クラスターVPC|事前に作成したVPCを指定|
|サブネット|事前に作成したサブネットを指定|
|セキュリティグループ|は新しいものを作成し、インバウンドルールは必ず全削除する|
|パブリック IP の自動割り当て|ENABLED|

ロードバランシングは初回選択項目から変更無しです。
次のステップ、Auto Scaling (オプション)も初回選択項目から変更無しです。

確認画面で、内容を確認し、サービスの作成をクリックします。
![2022-01-11_10h25_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/2bd40735-3d92-c777-48c4-e9cdf9285390.png)

## 5.正常稼働の確認

クラスター : apache-loggen のステータス ACTIVEと、タスクのステータスがRunningになっている事を確認します。
![2022-01-11_10h34_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/32c3ef18-4ccc-ff1a-156f-6ab8b18e0bff.png)

CloudWatch Logsのロググループに **/apache-dummy-log** が作成されている事を確認します。
![2022-01-11_10h35_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/49b874d4-65c6-bb57-dbc4-9df550967b44.png)

実際にログエントリを確認し、以下のようなApache Logが流れている事を確認します。
![2022-01-11_10h37_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/75329a85-cb84-f9c5-a7ea-ddae69ca1b29.png)

# 前半終了
Fargateコンテナ環境でApacheのダミーログを生成し、CloudWatch Logsへ転送するところまでが完了しました。
マネジメントコンソールGUIでこのようにステップバイステップの手順を解説しているエントリは少ないので、初学者向けに役立つエントリになれば幸いです。
実際の運用シーンでは、CLI+JSONで管理する事になると思いますので、うまく動いた方はそのようなエントリを確認して、ぜひ次のステージへステップアップしてください。

### 引き続き[後半のエントリ](https://qiita.com/Kedamari/items/9210d108c6ffff9b2a65)では以下の内容へと進みます。
![2022-01-11_09h20_031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99499/ef7492cc-ac03-b78c-4f15-3cd8fdbae8d1.png)