0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS ECS × ECR × ALB でハマったポイントまとめ(FastAPI編)

Posted at

はじめに

個人開発で 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 判定され停止。

原因と解決策:

  • DockerfileEXPOSE 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 デプロイで苦しんでいる人の助けになれば嬉しいです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?