はじめに
個人開発でRails APIをAWS ECS Fargateにデプロイしました。ECS/Docker周りの概念が最初わかりにくかったので、整理してまとめます。
Dockerイメージとは
「アプリを動かすのに必要な全部入りパッケージ」 です。
Dockerイメージの中身:
├── OS (Ruby用の軽量Linux)
├── Ruby 3.3.8
├── Gem(Rails等のライブラリ)
├── アプリのソースコード
└── 起動コマンド(rails server)
イメージとコンテナの関係
| イメージ | コンテナ | |
|---|---|---|
| 例え | クラスの定義 | インスタンス(newしたもの) |
| 状態 | 静的(ファイル) | 動いてるプロセス |
| 何個でも | 同じイメージから | 複数のコンテナを起動できる |
Dockerfile(レシピ)
↓ docker build
イメージ(パッケージ)
↓ docker run(ECSがやってくれる)
コンテナ(実際に動くやつ)
Dockerfile = イメージの作り方、イメージ = 作られた成果物、コンテナ = それを動かしたもの です。
ECSとFargateの関係
ECSとFargateは別物ではなく、ECSの中にFargateがある関係です。
ECS(Elastic Container Service)
= コンテナを管理・実行するサービス
起動タイプを選ぶ:
├── EC2 → 自分でサーバーを用意して、その上でコンテナを動かす
└── Fargate → サーバーはAWSにお任せ。コンテナだけ定義すればいい
| EC2起動タイプ | Fargate起動タイプ | |
|---|---|---|
| イメージ | 自分で土地を買って家を建てる | マンションの一室を借りる |
| サーバー管理 | 自分でやる(OS更新、スケーリング等) | AWS任せ |
| コスト | 安い(常時稼働向き) | 高め(小規模・可変負荷向き) |
| 設定の手間 | 多い | 少ない |
個人開発ではサーバー管理が不要なFargateが向いています。
ECSの全体像
タスク定義とは
「コンテナの設計図」 です。「どのイメージを、どんなスペックで、どんな設定で動かすか」を定義します。
ECSクラスター(箱)
└── ECSサービス(運用ルール)
├── 「この設計図のコンテナを1台維持して」
├── 「ALBと繋いで」
└── 「落ちたら自動で再起動して」
│
└── タスク定義(設計図)
├── イメージ: ECRのRailsイメージ
├── スペック: 0.25 vCPU / 512MB
├── 環境変数: RAILS_ENV等
└── シークレット: DB接続情報等
│
└── タスク(実際に動くコンテナ)
| 概念 | 役割 | 例え |
|---|---|---|
| クラスター | コンテナを動かす場所 | 工場 |
| タスク定義 | コンテナの設計図 | 製品の設計図 |
| タスク | 設計図から作られた実体 | 実際の製品 |
| サービス | 「常に1台動かせ」等の運用ルール | 生産管理部門 |
起動コマンドはどこにあるか
ECSタスク定義にはコマンドの指定がなく、Dockerイメージ側のCMD がそのまま使われます。
# Dockerfile
ENTRYPOINT ["/rails/bin/docker-entrypoint"] # 前処理(DB初期化等)
CMD ["./bin/rails", "server"] # Railsサーバー起動
ECSがコンテナを起動
→ ENTRYPOINT実行(前処理)
→ CMD実行(rails server、ポート3000)
デプロイの流れ
GitHub Actionsが:
1. backend/Dockerfile を元に docker build → イメージ作成
2. ECRにイメージをpush(保管)
3. ECSに「新しいイメージでコンテナ起動して」と指示
ECSが:
4. ECRからイメージをpull(取得)
5. タスク定義のスペック(CPU/メモリ等)でコンテナを起動
6. Dockerfile の CMD ["./bin/rails", "server"] が実行される
まとめ
| 概念 | 一言で |
|---|---|
| Dockerfile | イメージの作り方(レシピ) |
| イメージ | アプリの全部入りパッケージ |
| コンテナ | イメージを動かしたもの |
| ECR | イメージの保管場所 |
| ECS | コンテナの管理・実行サービス |
| Fargate | サーバー管理不要のECS起動タイプ |
| タスク定義 | コンテナの設計図(スペック・環境変数等) |
| サービス | 「常にN台動かす」等の運用ルール |