AWS Fargate タスク定義にblocking設定を確認してみた

## はじめに
Fargateのblockingモードをタスクごとに制御できないか記事にしました。
本記事は2025年5月17時点の記事となります。
## 手順

詳細に説明されていたため、以下の記事を参考にしました。
https://dev.classmethod.jp/articles/amazon-ecs-set-default-log-driver-blocking-mode/

現在のECSのdefaultLogDriverModeを確認したところ、デフォルトのため「blocking」になっていることを確認しました。
```
aws ecs list-account-settings --name defaultLogDriverMode --effective-settings
{
    "settings": [
        {
            "name": "defaultLogDriverMode",
            "value": "blocking",
            "principalArn": "arn:aws:iam::AWSアカウント番号:root",
            "type": "user"
        }
    ]
}
[cloudshell-user@ip-10-132-82-52 ~]$ 
```
#### タスク定義のmode non-blockingがどこに設定されるか確認した。

現在の仕様では新規でタスク定義を作成すると自動でmode non-blockingが入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/d2553b04-e5be-40af-a3f5-c8ad99f2740a.png)

### タスク定義のmode non-blockingを誤った文字列で設定して作成してみた
non-brockingで値を設定してタスク定義を作成ボタンを押したらエラーが出力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/4e1f5f35-c046-4917-841d-3331838d4725.png)

誤った値を設定するとエラーが出力されることが分かりました。
```
The non-brocking mode specified for log configuration options is invalid.
ログ構成オプションに指定された非ブロッキング モードが無効です。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/2a57036e-ace8-4a8c-936b-ee47eaac5835.png)

### タスク定義のmode blockingを誤った文字列で設定して作成してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/f6753174-8947-479e-8eea-f949c191c909.png)

```
The brocking mode specified for log configuration options is invalid.
ログ構成オプションに指定されたブロッキング モードが無効です
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/933f23d2-515e-4434-89df-081cf7a32844.png)
誤った値を設定するとエラーが出力されることが分かりました。

### アカウント設定がblockingですがタスク定義もblockingで設定できるか確認した
問題なくblockingでタスク定義を作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/3fd1404d-5552-4e1c-8a1f-96179347622f.png)
```
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/test-apache",
                    "mode": "blocking",  ←タスク定義
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
```


#### 補足情報
デプロイタイプ ローリングアップデートでした。
Fargateはサービス更新しても新タスクが正常に実行されるまでは旧タスクは終了しません。

新タスク実行中のエビデンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/a2c8f333-1290-4469-b9ec-5ba5a5ee2e3b.png)

新タスクと新タスクが実行中のエビデンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/a003e406-03a5-45b7-870c-9b80c478ac27.png)

新タスクが正常に実行されたため、旧タスクが停止しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/e46bc1bd-8177-4a4c-9a46-d1ff118bf097.png)

### コンテナ内のメタ情報を確認

コンテナに接続設定は以下の記事が大変分かりやすくまとめていました。
**ECS Exec**
https://qiita.com/okubot55/items/b1fb07b2de08c354275b

以下の記事を参考にしました。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4-fargate.html

blockingモードを確認しようとしましたが、私が使用しているイメージにcurlコマンドが入っていないことが判明
仮に本番環境のタスクの場合はcurlをインストールを気軽にできないためメタ情報取得は諦めます。
```
# aws ecs execute-command --region ap-northeast-1 --cluster ＜クラスタ名＞ --task ＜タスクID＞ --container ＜コンテナ名＞ --interactive --command "/bin/sh"

# curl ${ECS_CONTAINER_METADATA_URI_V4}
/bin/sh: 7: curl: not found
# 
# 
# wget -qO- $ECS_CONTAINER_METADATA_URI_V4
/bin/sh: 10: wget: not found
# 
```

### タスク定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/b4edbe92-8530-4efc-b599-7994c10e4478.png)
JSONのタブを選択する。
```
           "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/test-apache",
                    "mode": "non-blocking",  ← non-blockingモードになっている
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "ap-northeast-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
```

## まとめ

https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html

AWS　公式サイトの引用

>blocking2025年6月25日より、Amazon ECSはログ記録よりもタスクの可用性を優先するため、デフォルトのログドライバーモードを から に変更しますnon-blocking。この変更後もこのモードを引き続き使用するにはblocking、次のいずれかを実行してください。
>modeコンテナ定義のオプションlogConfigurationを として設定しますblocking。
>defaultLogDriverModeアカウント設定を に設定しますblocking。

現在はECSのアカウント設定にてデフォルトで「blockingモード」なっており、タスク定義作成時にオプション「mode non-blocking」が自動で入ることが分かりました。

2025/6/25からはアカウント設定で「non-blockingモード」になるそうで
各タスク毎にblockingモードする場合は、タスク定義にて「mode blocking」オプションを含める必要があります。
最終チェックとして、2025/6/25以降にてコンテナに接続してcurl${ECS_CONTAINER_METADATA_URI_V4}を実行して、メタ情報を確認してmodeオプションのブロッキング モードについて確認してみるのも良いと思います。