AWS ECS: Task stopped unexpectedly
AWS ECSでタスクが予期せず停止した場合の原因調査と解決策
概要
AWS ECSでコンテナタスクが予期せず停止する問題の調査と解決方法です。
エラーメッセージ
``` Task stopped at: 2024-01-01T00:00:00Z Stop code: EssentialContainerExited Stop reason: Essential container in task exited ```
原因
- アプリケーションエラー: コンテナ内のプロセスがクラッシュ
- メモリ不足: タスク定義のメモリ制限超過
- ヘルスチェック失敗: ALB/NLBのヘルスチェック
- シグナル処理の問題: SIGTERM を正しく処理していない
解決策
1. 停止理由を確認
```bash
AWS CLI
aws ecs describe-tasks
–cluster my-cluster
–tasks arn:aws:ecs:region:account:task/xxx
–query ’tasks[0].{stopCode:stopCode,stoppedReason:stoppedReason,containers:containers[*].{name:name,exitCode:exitCode,reason:reason}}'
```
2. CloudWatch Logsを確認
```bash
ログストリームを取得
aws logs describe-log-streams
–log-group-name /ecs/my-service
–order-by LastEventTime
–descending
ログを取得
aws logs get-log-events
–log-group-name /ecs/my-service
–log-stream-name ecs/container/xxx
```
3. タスク定義のリソースを調整
```json { “containerDefinitions”: [{ “name”: “app”, “memory”: 1024, “memoryReservation”: 512, “cpu”: 512, “healthCheck”: { “command”: [“CMD-SHELL”, “curl -f http://localhost:8080/health || exit 1”], “interval”: 30, “timeout”: 5, “retries”: 3, “startPeriod”: 60 } }] } ```
4. グレースフルシャットダウンを実装
```javascript // Node.js process.on(‘SIGTERM’, async () => { console.log(‘SIGTERM received, shutting down…’); server.close(() => { console.log(‘Server closed’); process.exit(0); });
// 10秒後に強制終了 setTimeout(() => process.exit(1), 10000); }); ```
5. ECS Execでデバッグ
```bash
コンテナに接続
aws ecs execute-command
–cluster my-cluster
–task xxx
–container app
–interactive
–command “/bin/sh”
```
よくある間違い
- ログドライバーを設定しない
- ヘルスチェックのstartPeriodが短すぎる
- essential=trueのコンテナが先に終了
関連エラー
関連エラー
AWS の他のエラー
この記事は役に立ちましたか?