コンテナ(ECS / EKS / Fargate / ECR)
コンテナは、アプリケーションと動かすのに必要なライブラリ・設定をひとまとめにして、どこでも同じように動かせるようにする技術です。AWS では、コンテナを管理する Amazon ECS と Amazon EKS、サーバーなしでコンテナを動かす AWS Fargate、コンテナイメージを保管する Amazon ECR を組み合わせて使います。SAA では「コンテナを使う場面」と「要件に合うサービスの選び方」がよく問われます。
ひとことで言うと: ECR はコンテナの「倉庫」、ECS と EKS はコンテナを何個どこで動かすかを決める「指揮者」、Fargate と EC2 はコンテナが実際に動く「舞台」です。
たとえるなら、コンテナは中身を詰めた輸送用コンテナです。中身が何であっても、同じ形の箱ならトラックでも船でも同じ手順で運べます。どの船に何個積むかを決めるのが ECS・EKS、船を自分で持つのが EC2、運送会社に任せるのが Fargate です。
このページで押さえる論点
コンテナの基本と、アプリケーションの移行
コンテナイメージは、アプリのプログラム、ライブラリ、設定をまとめた「ひな形」です。イメージから起動した実行中のものをコンテナと呼びます。イメージはレジストリ(AWS では Amazon ECR)に保管し、動かすサーバーがそこから取り出して(プル)起動します。
| 項目 | 仮想マシン(EC2 インスタンス) | コンテナ |
|---|---|---|
| 含むもの | OS 全体とアプリ | アプリと必要なライブラリだけ(OS のカーネルはホストと共有) |
| 起動の速さ | OS の起動が必要 | プロセスを起動するだけなので速い |
| 1 台のサーバーに載る数 | 少ない | 多い(リソースを効率よく使える) |
| 環境の違い | 環境ごとに設定がずれやすい | 同じイメージなら開発でも本番でも同じように動く |
試験ガイドでは「アプリケーションをコンテナに移行する方法」「コンテナを使う場面を判断する」ことが求められます。既存のアプリをコンテナに移すときは、アプリをコンテナイメージにまとめて ECR に保存し、ECS や EKS で動かします。機能ごとに小さなサービスに分けて別々のコンテナで動かすマイクロサービスにすると、サービスごとに独立してデプロイ・スケールできます。コンテナは 1 台のサーバーに多く載せられるので、コンピューティングの使用率を上げてコストを下げる手段としても挙げられています。
Amazon ECS
Amazon ECS(Elastic Container Service)は、AWS 独自のコンテナオーケストレーションサービスです。オーケストレーションとは、多数のコンテナを「どのサーバーで何個動かすか」「止まったら起動し直す」「ロードバランサーにつなぐ」といった管理を自動で行うことです。
| 用語 | 意味 |
|---|---|
| クラスター | タスクやサービスをまとめる論理的な単位 |
| タスク定義 | コンテナの設計図。使うイメージ、CPU とメモリの量、ネットワークの方式、IAM ロール、ログの送り先などを書く |
| タスク | タスク定義から起動した、実行中の 1 組のコンテナ |
| サービス | 指定した数(希望数)のタスクを動かし続ける仕組み。タスクが止まると自動で新しいタスクに置き換え、ロードバランサーへの登録も行う |
ECS のサービスがタスクを動かし続ける流れ
※簡略化しています: タスクは 2 つだけ、1 つの AZ のように描いています。実際には複数の AZ のサブネットにタスクを分けて配置します。ログの送信、ヘルスチェック、サービスの Auto Scaling は図では省略しています。
図で省略したヘルスチェックとスケーリングは、この節の後半で説明します。
タスクを動かす場所(キャパシティ)
| 動かす場所 | サーバーの管理 | 向いている場面 |
|---|---|---|
| AWS Fargate | 不要(サーバーレス)。タスクが使った分だけ支払う | インフラを管理せずアプリに集中したい、負荷が変動する、コンテナを始めたばかり |
| Amazon EC2 インスタンス | 自分で EC2 を選び、設定・保守する | GPU などの特殊なハードウェア、特定のインスタンスタイプ、キャパシティ予約、特権コンテナ、独自の AMI が必要 |
| ECS Managed Instances | EC2 の用意・パッチ適用・スケーリングを AWS が行う | Fargate の手軽さと、インフラの細かい制御の両方が欲しい |
| 外部インスタンス(ECS Anywhere) | オンプレミスのサーバーや仮想マシンを自分で管理し、ECS クラスターに登録する | オンプレミスで動くコンテナも ECS でまとめて管理したい |
Fargate のタスクはネットワークモード awsvpc が必須で、タスクごとに専用のネットワークインターフェース(ENI)とプライベート IP アドレスが付き、タスク単位でセキュリティグループを設定できます。Fargate では GPU や特権コンテナ(privileged)は使えません。
2 つの IAM ロール
| ロール | 使うのは誰か | 必要になる場面 |
|---|---|---|
| タスクロール(タスク IAM ロール) | コンテナの中のアプリケーション | アプリが S3 や DynamoDB などの AWS サービスを呼び出す |
| タスク実行ロール | ECS(コンテナエージェント・Fargate エージェント) | ECR のプライベートリポジトリからイメージを取り出す、ログを CloudWatch Logs に送る(awslogs)、Secrets Manager や Parameter Store の秘密情報をタスクに渡す |
「コンテナ内のアプリに S3 へのアクセス権を与える」ならタスクロール、「イメージを取り出せない」「ログが送られない」ならタスク実行ロールの設定を疑います。
ロードバランサーとスケーリング
サービスは ALB などのロードバランサーと連携し、起動したタスクを自動でターゲットに登録します。タスクの数は Application Auto Scaling で自動的に増減できます(サービスの Auto Scaling)。ポリシーはターゲット追跡・ステップ・スケジュール・予測の 4 種類で、指標には CPU の平均使用率、メモリの平均使用率、ALB のターゲットあたりのリクエスト数などを使います。AWS は多くの場合ターゲット追跡を推奨しています。EC2 で動かす場合は、タスクを増やしたときに載せる EC2 も足りるように、キャパシティプロバイダーでインスタンスの台数も合わせて増減させます。
Fargate Spot とキャパシティプロバイダー
Fargate Spot は、中断されてもよいタスクを Fargate より安い料金で動かせる選択肢です。AWS がキャパシティを必要とすると、タスクが止まる 2 分前に警告が送られます。キャパシティプロバイダー戦略で、たとえば「最低 2 タスク(ベース)は通常の Fargate、残りは Fargate と Fargate Spot に 1 対 3 の割合(ウェイト)で配置する」といった組み合わせを指定できます。
Amazon EKS
Amazon EKS(Elastic Kubernetes Service)は、オープンソースのコンテナオーケストレーションツールである Kubernetes のマネージドサービスです。Kubernetes の司令塔にあたるコントロールプレーンを AWS が 3 つの AZ に分散して運用し、障害が起きたインスタンスも自動で置き換えます。クラスターごとに専用のコントロールプレーンが使われます。Kubernetes ではコンテナを動かす単位を Pod、Pod を動かすサーバーをノードと呼びます。
ECS との大きな違いは、Kubernetes の API やツールがそのまま使える点です。「すでに Kubernetes で運用している」「オンプレミスや他のクラウドと同じ Kubernetes の仕組みで管理したい」なら EKS、「AWS の中だけで、できるだけシンプルに運用したい」なら ECS を選ぶのが基本です。
ノード(Pod を動かす場所)の選び方
| 方式 | AWS が管理するもの | 自分で管理するもの |
|---|---|---|
| マネージドノードグループ | ノード(EC2)の作成・更新の仕組み | EC2 インスタンスと OS(セキュリティ、保守、パッチ適用) |
| セルフマネージドノード | なし | すべて(手作業の保守が最も多い) |
| EKS Auto Mode | コントロールプレーンに加え、ノード(EC2)と OS の管理、スケーリング | アプリケーション |
| AWS Fargate | Pod を動かすサーバー。Pod ごとに分離された環境で動く | アプリケーション(どの Pod を Fargate で動かすかは Fargate プロファイルで指定) |
EKS で Fargate を使う場合、DaemonSet(全ノードで 1 つずつ動かす Pod)、特権コンテナ、GPU、EBS ボリュームは使えません(EFS は使えます)。Pod はプライベートサブネットに置き、外に出るには NAT ゲートウェイが必要です。
オンプレミスで Kubernetes を使う
- Amazon EKS Anywhere: 自社のデータセンターで Kubernetes クラスターを作成・運用します。
- Amazon EKS Distro: EKS が使っているのと同じ Kubernetes のコンポーネントを、オープンソースのディストリビューションとして提供するものです。オンプレミスや他のクラウドなどで自分で動かします。
- Amazon EKS Hybrid Nodes: オンプレミスのサーバーを、AWS 上の EKS クラスターのノードとして使います。
Amazon ECR
Amazon ECR(Elastic Container Registry)は、AWS が管理するコンテナイメージのレジストリです。Docker イメージや OCI 形式のイメージを保存でき、ECS・EKS・Lambda(コンテナイメージで配布する場合)から取り出して使います。
- プライベートリポジトリとパブリックリポジトリ: プライベートリポジトリへのアクセスは IAM とリポジトリポリシーで制御します。
- イメージスキャン: イメージに含まれるソフトウェアの脆弱性を見つけます。プッシュ時に自動でスキャンでき、Amazon Inspector を使う拡張スキャンもあります。
- ライフサイクルポリシー: 使われなくなった古いイメージを自動で削除し、保存料金を抑えます。
- レプリケーション: イメージを別のリージョンや別のアカウントへ自動で複製します。複数リージョンでの運用や災害対策に使います。
- プルスルーキャッシュ: 外部のレジストリのイメージを自分の ECR にキャッシュします。
料金は、保存しているデータ量とデータ転送量にかかります。
コンテナを使う場面と、サービスの選び方
コンテナが向くのは、長時間動き続けるアプリ、マイクロサービス、環境ごとの違いをなくしたいアプリ、1 回の処理が 15 分を超えるバッチなどです。短いイベント処理ならコンテナにせず Lambda のほうが手軽です。
質問に答えてコンピューティングサービスを選ぶ
動かしたいアプリを思い浮かべて「はい / いいえ」で答えてください。答えた経路が上から順に表示されます。
※簡略化しています: 代表的な選び方だけを分岐にしています。オンプレミスで動かす場合(ECS Anywhere・EKS Anywhere)、バッチ処理を任せる AWS Batch、Fargate Spot の利用、Lambda をコンテナイメージで配布する場合は分岐に含めていません。
| 選択肢 | サーバー管理 | 選ぶ場面 |
|---|---|---|
| AWS Lambda | 不要 | イベントで動く最大 15 分の短い処理 |
| ECS + Fargate | 不要 | コンテナを最小の運用負荷で動かしたい |
| ECS + EC2 | 必要(Managed Instances なら AWS が管理) | GPU、特定のインスタンスタイプ、特権コンテナが必要。Savings Plans などで EC2 を安く使いたい |
| EKS(ノードまたは Fargate) | ノードは必要、Fargate・Auto Mode なら不要 | Kubernetes を使い続けたい、オンプレミスと同じ仕組みで管理したい |
| ECS Anywhere/EKS Anywhere | オンプレミスのサーバーを自分で管理 | オンプレミスのコンテナも AWS の仕組みで管理したい |
| AWS Batch | 不要(計算資源を自動で用意) | 大量のバッチジョブを、コンテナとして EC2・Fargate・EKS 上で実行したい |
フローチャートで省いたオンプレミスとバッチの選択肢は、上の表のとおりです。Lambda の詳しい制約は「AWS Lambda」、EC2 の購入オプションは「Amazon EC2」のページで扱います。
問題文のキーワード → 選ぶべき答え
| 問題文の言い回し | 選ぶべき答えと理由 |
|---|---|
| 「コンテナを動かしたいが、サーバーやクラスターの容量を管理したくない」 | ECS(または EKS)+ Fargate |
| 「既存の Kubernetes の設定やツールをそのまま AWS で使いたい」 | Amazon EKS |
| 「コンテナで GPU を使いたい」 | ECS(または EKS)+ EC2(Fargate は GPU 非対応) |
| 「コンテナ内のアプリから S3 にアクセスさせたい」 | タスクロール(EKS では Pod に IAM ロールを割り当てる) |
| 「タスクが ECR のプライベートリポジトリからイメージを取得できない」「ログが CloudWatch Logs に送られない」 | タスク実行ロールの権限を確認する |
| 「中断されてもよいコンテナのタスクを安く動かしたい」 | Fargate Spot(中断の 2 分前に警告) |
| 「負荷に応じてタスクの数を自動で増減」 | ECS サービスの Auto Scaling(ターゲット追跡など) |
| 「古いコンテナイメージを自動で削除して保存コストを下げる」 | ECR のライフサイクルポリシー |
| 「コンテナイメージの脆弱性を自動で検出」 | ECR のイメージスキャン(拡張スキャンは Amazon Inspector) |
| 「コンテナイメージを別リージョンにも置きたい」 | ECR のクロスリージョンレプリケーション |
| 「オンプレミスのサーバーで動くコンテナも ECS で管理」 | ECS Anywhere(Kubernetes なら EKS Anywhere) |
引っかけポイント
- 「Fargate でも GPU や特権コンテナを使える」→ ✕。Fargate のタスク定義では gpu や privileged は使えません。EC2 で動かします。
- 「タスク実行ロールに S3 の権限を付ければ、アプリから S3 を読める」→ ✕。アプリが使うのはタスクロールです。タスク実行ロールは ECS がイメージの取得やログの送信に使います。
- 「EKS なら Kubernetes のコントロールプレーンも自分で運用する」→ ✕。コントロールプレーンは AWS が 3 つの AZ に分散して運用します。自分で管理するのはノード(Fargate や Auto Mode なら不要)です。
- 「ECS と EKS はどちらも Kubernetes」→ ✕。ECS は AWS 独自のオーケストレーション、EKS が Kubernetes です。
- 「コンテナを使えば 15 分を超える処理も Lambda で動かせる」→ ✕。Lambda をコンテナイメージで配布しても、実行時間の上限は 15 分のままです。長い処理は ECS/Fargate や AWS Batch で動かします。
- 「EKS の Fargate の Pod はパブリックサブネットに置いてインターネットに出す」→ ✕。Pod はプライベートサブネットに置き、外に出るには NAT ゲートウェイを使います。
まとめ: SAA 試験で押さえるポイント
- ECR はイメージの保管庫(スキャン・ライフサイクルポリシー・レプリケーション)、ECS/EKS はオーケストレーション、Fargate/EC2 は動かす場所
- サーバー管理をしたくない → Fargate。GPU・特定のインスタンスタイプ・特権コンテナ → EC2
- Kubernetes を使い続けたい → EKS(コントロールプレーンは AWS が 3 AZ で運用)。シンプルに AWS だけで → ECS
- ECS のタスク定義が設計図、サービスが希望数のタスクを維持し ALB に登録する
- アプリが AWS を使う権限はタスクロール、イメージ取得・ログ送信・秘密情報の取得はタスク実行ロール
- タスク数の自動増減はサービスの Auto Scaling(Application Auto Scaling)、中断してよいタスクは Fargate Spot
- オンプレミスでも同じ仕組みで → ECS Anywhere/EKS Anywhere
確認問題
参考リンク
AWS 公式ドキュメント(外部サイトが開きます)。本文の数値はこれらで確認しています。
- SAA-C03 試験ガイド(出題範囲・対象サービス)
- Amazon ECS のキャパシティ(Fargate・EC2・Managed Instances)
- Fargate のタスク定義(awsvpc・使えないパラメータ)
- Amazon ECS タスクの IAM ロール
- Amazon ECS タスク実行 IAM ロール
- Amazon ECS サービスの自動スケーリング
- Fargate キャパシティプロバイダー(Fargate Spot の 2 分前の警告)
- Amazon ECS Anywhere
- Amazon EKS とは
- Amazon EKS のアーキテクチャ(コントロールプレーンの 3 AZ 分散)
- Amazon EKS のコンピューティング(ノードの種類)
- Amazon EKS で AWS Fargate を使う(制限事項)
- Amazon EKS Distro
- Amazon ECR とは
- AWS Batch とは