AWS ECSでCloudWatch Container Insightsを使用し監視する

CloudWatchContainerInsightsを使用して、コンテナ化されたアプリケーションのメトリクスとログを収集するのですが、この機能はデフォルトでは無効になっています。
## ターゲット
有効化するターゲットは2つあります。
1. 既存クラスタ
    a.デフォルト設定が無効な状態で作成したクラスタは作成後にマネコンからはCloudWatchContainerInsightsの有効化ができないのでAPIを使用します。
2. デフォルト
    a.デフォルト設定はマネコン、APIから有効化することが可能です。 
### 既存クラスタ有効化

```sh
% aws ecs update-cluster-settings --cluster test-ci --settings name=containerInsights,value=enabled
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:xxxxxxxx:xxxxxxxx:cluster/test-ci",
        "clusterName": "test-ci",
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [
            {
                "name": "containerInsights",
                "value": "enabled"
            }
        ],
        "capacityProviders": [
            "FARGATE",
            "FARGATE_SPOT"
        ],
        "defaultCapacityProviderStrategy": [],
        "attachments": []
    }
}
```
- befor
![スクリーンショット 2022-10-14 13.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/78eba61a-3fbd-3ea2-88d9-8f59b11923c0.png)
- after
![スクリーンショット 2022-10-14 13.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/055ae800-de06-e465-8429-b1045a80d5d7.png)



### デフォルト有効化
```sh
% aws ecs put-account-setting --name "containerInsights" --value "enabled"
{
    "setting": {
        "name": "containerInsights",
        "value": "enabled",
        "principalArn": "arn:aws:iam::xxxxxxxx:role/xxxxxxxx"
    }
}
```
- befor
![スクリーンショット 2022-10-14 14.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/8f45157f-c3b0-efa2-82ba-81db77a05e12.png)
- after
![スクリーンショット 2022-10-14 13.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/286569c9-53b6-5cc5-1aea-6d33413e4c80.png)

- デフォルト有効後に作成したクラスタはContainerInsightsが有効になっている
![スクリーンショット 2022-10-14 14.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/6c61c65e-c0b2-d49f-5790-a75314f9a7c0.png)

---


## 監視設定
- 収集されるメトリクスとディメンション
    - 名前空間はECS/ContainerInsights
    - ディメンションは
        1. ClusterName
        2. ServiceName
        3. TaskDefinitionFamily

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html

- クラスターで実行されているタスク数を監視します。

```cloudwatch_metric_alarm.tf
resource "aws_cloudwatch_metric_alarm" "container_insights" {
  for_each = local.example_cluster

  alarm_name          = each.value.alarm_name
  comparison_operator = each.value.comparison_operator
  evaluation_periods  = each.value.evaluation_periods
  metric_name         = each.value.metric_name
  namespace           = each.value.namespace
  period              = each.value.period
  statistic           = each.value.statistic
  threshold           = each.value.threshold

  dimensions = {
    ClusterName = each.value.cluster_name
  }

  alarm_actions = each.value.alarm_actions
  ok_actions    = each.value.alarm_actions
}
```

```locals.tf
locals {
  dev_slack_arn = data.aws_sns_topic.example.arn

  example_cluster = {
    TaskCount = {
      alarm_name          = "example-cluster-TaskCount"
      metric_name         = "TaskCount"
      namespace           = "ECS/ContainerInsights"
      cluster_name        = "example"
      statistic           = "Maximum"
      threshold           = "1"
      period              = "60"
      evaluation_periods  = "1"
      comparison_operator = "LessThanThreshold"
      alarm_actions       = [local.dev_slack_arn]
      ok_actions          = [local.dev_slack_arn]
    }
  }
}
```

```data.tf
data "aws_sns_topic" "example" {
  name = "example"
}
```