mackerel-container-agentでFargate上のnginxとphp-fpmを監視する

# 概要
mackerel-container-agentでFargate上のnginxとphp-fpmの監視を実装するのに、[公式](https://mackerel.io/ja/docs/entry/howto/container-agent)を見ると方法が書かれているのですが、パラメータの設定やミドルウェア側の設定などまとまっている資料がなかったので、構築した内容をまとめました。
# ミドルウェアの設定
まずはじめに監視対象でstatusを取得できるように設定する。
## php-fpm
php-fpm設定ファイル`www.conf`に以下の設定をする。

```conf:www.conf
pm.status_path = /phpfpm_status
```
## nginx
nginx設定ファイル`defalut.conf`に以下の設定をする。
ECSのタスク内コンテナ通信は全てlocalhostで行われるため、mackerel-container-agentからのアクセス`127.0.0.1`を許可すればよい。

```conf:default.conf
server {
    listen 80;
    server_name localhost;
    # nginx status setting
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1; # ECSタスク内のみアクセス許可
        deny all;
    }
    # php-fpm status setting
    location /phpfpm_status {
        include fastcgi_params;
        fastcgi_pass localhost:9000; # TCP通信の場合
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        access_log off;
        allow 127.0.0.1; # ECSタスク内のみアクセス許可
        deny all;
    }
}
```
# mackerel設定ファイルの作成、設置

## ファイル作成  
pluginをパラメータ付きで呼び出すのに設定ファイルからcommand指定する必要があるので作成する。
上記で設定した`port`, `host`, `pash`などをここで指定する。
ついでに`MACKEREL_APIKEY`もここで設定する。

```yaml:mackerel_config.yaml
apikey: "********" # mackerelのAPIキー
plugin:
  metrics:
    nginx:
      command: mackerel-plugin-nginx -host=localhost -path=/nginx_status -port=80
    php-fpm:
      command: mackerel-plugin-php-fpm -url http://localhost/phpfpm_status?json
```
## ファイル設置  
このファイルはmackerel-container-agentコンテナが参照できる場所(コンテナローカル, http/https, S3)に置けばいいが、ここではS3に置くことにする。
S3バケットをデフォルトの状態(パブリックアクセスをすべてブロック:オン)で作成し、ファイルを設置する。  

# IAMポリシー作成  
ECSからS3へ内部アクセスできるように`タスクロール`に指定するIAMポリシーを作成する。
作成したポリシーをECSタスク定義に割り当てているタスクロールにアタッチする。

* ポリシーJSON  
ファイルを設置したS3バケットを指定する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::{ファイルを設置したS3バケット}/*"
        }
    ]
}
```
# ECSタスク定義の設定
単純にmackerel-container-agentを使用する場合、バージョンタグ`latest`をタスク定義に指定すればいいが、nginxとphp-fpmも監視したいので、plgin全部入りのDockerイメージのバージョンタグ`plugins`を指定する。
また、上記で作成したmackerel設定ファイルをパラメータ`MACKEREL_AGENT_CONFIG`で指定する。

```json:task_definition.json
{
  "taskRoleArn": "arn:aws:iam::${AWS_ACCOUNT_ID}:role/mackerel-ecs-task-role",
...
  "containerDefinitions": [
    {
      "name": "mackerel-container-agent",
      "image": "mackerel/mackerel-container-agent:plugins",
      "memory": 128,
      "essential": false,
      "environment": [
        {
          "name": "MACKEREL_CONTAINER_PLATFORM",
          "value": "fargate"
        },
        {
          "name": "MACKEREL_AGENT_CONFIG",
          "value": "s3://{ファイルを設置したS3バケット}/{適宜作成したディレクトリ}/mackerel_config.yaml"
        }
      ]
    },
...
  ]
}
```
# 監視状況確認
本設定をした上でデプロイを行うと、Mackerelコンソール画面より以下が確認できる様になる。

* 左メニュー「Hosts」 -> 該当Fargateホスト -> 「カスタムメトリック」
* 追加される項目
 * nginx 
     * Nginx Connections
     * Nginx connection status
     * Nginx requests
 * php-fpm
     * PHP-FPM Max Active Processes
     * PHP-FPM Max Children Reached
     * PHP-FPM Max Listen Queue
     * PHP-FPM Processes
     * PHP-FPM Queue
     * PHP-FPM Slow Requests