はじめに
個人開発で FastAPI アプリを ECS(Fargate) にデプロイしたとき、いくつもエラーにぶつかったのでまとめました。同じように困っている方の参考になれば幸いです。
Q1. docker push でリポジトリ名が一致しない
課題: docker push 時にエラー。
PS C:\Users\me\Desktop\cat_category_api> docker push 992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat-category-api:latest
The push refers to repository [992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat-category-api]
e6c1b0e68f1a: Preparing
denied: Your authorization token has expired. Please run 'aws ecr get-login-password' to refresh it.
原因: ECR リポジトリ名とローカルイメージ名が揃っていなかった。
解決策:
- リポジトリ作成時:
cat_category_api
(アンダースコア) - ローカルビルド時:
cat-category-api
(ハイフン)
これを揃えてビルド・push。
docker build -t cat_category_api .
docker tag cat_category_api:latest 992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat_category_api:latest
docker push 992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat_category_api:latest
成功ログ:
latest: digest: sha256:5c1ab23f... size: 1573
pushed: 992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat_category_api:latest
Q2. ECS サービス更新後も古いイメージが動く
課題: 新しいコードを push しても ECS のコンテナが更新されない。
原因: タスク定義でイメージタグを latest
固定にしていた。
解決策:
- イメージタグを GitHub Actions のコミットハッシュやビルド番号に変更
- タスク定義をリビジョン更新
- ECS サービスを
Force new deployment
実行
ログ例:
2025-09-10 21:12:34 [INFO] Successfully pulled image: 992382612474.dkr.ecr.ap-northeast-1.amazonaws.com/cat_category_api:5c1ab23f
2025-09-10 21:12:35 [INFO] Registered new task definition: cat-category-api:7
Q3. コンテナがすぐ STOP 状態になる
課題: サービスを更新してもタスクが起動直後に STOP。
原因: CMD の指定ミス。Dockerfile
の CMD と app.py
の FastAPI 起動が合っていなかった。
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80"]
CloudWatch Logs:
INFO: Will watch for changes in these directories: ['.']
ERROR: Error loading ASGI app. Could not import module "app".
解決策: カレントディレクトリを調整し、モジュール名を確認。
Q4. 8080 ポートでしか応答しない問題
課題: ECS サービス更新後も ALB から見ると 8080 で動いているように見える。
原因: Dockerfile 内の EXPOSE と ALB の設定不一致。
Dockerfile:
EXPOSE 80
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "80"]
解決策:
- ALB リスナーを 80 に設定
- タスク定義の
containerPort
を 80 に設定
確認ログ:
2025-09-10 21:20:10 [INFO] Listening at: http://0.0.0.0:80 (1)
Q5. PowerShell から python スクリプトが実行できない
課題: PowerShell で test.py
を直接実行するとエラー。
PS C:\Users\me\Desktop> test.py
test.py : このシステムではスクリプトの実行が無効になっているため、読み込むことができません。
解決策:
python test.py
# または
.\test.py
Q6. ALB のヘルスチェックでタスクが落ちる
課題: タスク起動後すぐに unhealthy
判定され停止。
原因と解決策:
-
Dockerfile
にEXPOSE 80
を明記 - タスク定義で
containerPort: 80
- ALB ターゲットグループのヘルスチェックパスを
/health
に変更 - 方法1:
app.py
にルートエンドポイントを追加(推奨)
app.py の例:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"status": "ok"}
@app.get("/health")
def health():
return {"status": "healthy"}
ALB 設定例:
Protocol: HTTP
Port: 80
Health check path: /health
Healthy threshold: 2
Unhealthy threshold: 2
Timeout: 5
Interval: 30
ALB ログ例:
Target health description: "Health checks failed"
Request: GET / => 404
Request: GET /health => 200
→ /
にもエンドポイントを追加したことで、ユーザーアクセスでも正常応答。
Q7. ECS ログで API 応答が取れない
課題: API を叩いてもログが空白。
原因: CloudWatch Logs 設定を忘れていた。
解決策:
- タスク定義で logConfiguration を追加
- awslogs-group を
/ecs/cat-category-api
に設定
タスク定義例:
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/cat-category-api",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
確認ログ:
2025-09-10 22:45:11 [INFO] 172.31.12.34: GET /health 200
2025-09-10 22:45:12 [INFO] 172.31.12.34: GET / 200
まとめ
- リポジトリ名・タグの不一致は地味にハマる
- latest タグ固定は危険、バージョン管理必須
- ALB 側のヘルスチェックパスとアプリ実装は合わせる
- CloudWatch Logs を忘れるとデバッグが地獄
今回の失敗ログ込みの体験談が、同じように ECS デプロイで苦しんでいる人の助けになれば嬉しいです。