Day 12: タスク定義とサービスの作成:コンテナをAWS上で動かすための設定 🚀
皆さん、こんにちは!30日集中講座、Day 12へようこそ。
昨日、ECSでコンテナを動かす基盤として、FargateとEC2のどちらを選ぶべきかを学びました。今日のハンズオンでは、ECSのタスク定義とサービスを作成し、いよいよコンテナをAWS上で動かします。
1. 準備:タスク、タスク定義、サービスの役割
ECSでのデプロイは、次の2つのステップで行います。まず、ECSの各要素の関係を整理しましょう。
- タスク: 実際に起動しているコンテナの単位です。複数のコンテナ(メインアプリとサイドカーなど)で構成されることもあります。
- タスク定義: タスクの「設計図」を作成します。どのDockerイメージを使うか、CPUやメモリをどれだけ割り当てるか、といった設定を定義します。
- サービス: タスク定義に基づいてコンテナを起動し、その稼働数を管理します。
本日の目標は、Day 6で作成してDay 10でECRにプッシュしたPythonアプリのコンテナイメージを、AWS上で起動・実行することです。
2. ステップ・バイ・ステップ:タスク定義の作成
AWSコンソールでECSに移動し、左側のメニューから「タスク定義」を選択します。
ステップ1: タスク定義の作成(所要時間:約5分)
- 「新しいタスク定義の作成」 をクリックします。
-
タスク定義ファミリー名を
my-first-app-taskのように入力します。 - インフラストラクチャの要件では、Fargateを選択します。
-
タスクのサイズでは、タスクに割り当てるCPUとメモリを指定します。
- CPU: 0.25 vCPU
- メモリ: 0.5 GB
- この組み合わせは、最も安価な設定であり、今回の学習目的には十分です。
ステップ2: IAMロールとコンテナの設定
-
タスク実行ロール: ECSがECRからイメージをプルしたり、CloudWatch Logsにログを送信するための権限として、デフォルトの
ecsTaskExecutionRoleを選択します。 - コンテナセクションで、「コンテナの追加」をクリックします。
- イメージURI: ECRリポジトリにプッシュしたイメージのURIを貼り付けます。
-
ポートマッピング: Day 6のアプリは
5000番ポートを使っていたので、5000と入力します。 -
環境変数: 今回は学習目的のため、
DATABASE_URLを直接設定します。本番環境では、AWS Systems Manager Parameter StoreやSecrets Managerを使用し、機密情報を安全に管理しましょう。
設定が完了したら、「作成」をクリックしてタスク定義を保存します。
3. ステップ・バイ・ステップ:サービスの作成とデプロイ
タスク定義が完了したら、次にサービスを作成し、コンテナを実際に起動します。ECSコンソールで、「クラスター」を選択し、作成したクラスターをクリックします。
ステップ1: サービスの作成(所要時間:約5分)
- 「サービス」タブから「作成」をクリックします。
- タスク定義: 先ほど作成したタスク定義を選択します。
-
サービス名:
my-first-app-serviceのように、分かりやすい名前を付けます。 -
必要なタスク数: 常に稼働させたいタスクの数を指定します。今回は
1と入力します。
ステップ2: ネットワーク設定
- VPC: デフォルトのVPCを選択します。
- サブネット: 2つ以上のサブネットを選択します。これは、コンテナを複数のアベイラビリティーゾーンに分散させ、サービスの可用性を高めるためです。
-
セキュリティグループ:
- 新しいセキュリティグループを作成します。
-
インバウンドルール: コンテナのポート
5000へのアクセスを許可するルールを追加します。学習のため、CIDR0.0.0.0/0(すべて)を許可しておきましょう。 -
注意: 本番環境では、
0.0.0.0/0は避けるべきです。
- パブリックIPの自動割り当て: 今回は有効にします。これにより、タスクにパブリックIPが割り当てられます。
設定をすべて確認し、「作成」をクリックします。サービスが作成されると、タスクがプロビジョニングされ、指定したタスク数(今回は1つ)のコンテナが自動で起動します。しばらくすると、タスクの状態が 「RUNNING」 に変わります。(起動まで2-3分程度お待ちください)
4. 動作確認とトラブルシューティング
✅ 成功の確認ポイント
- タスクの状態が「RUNNING」になっている。
- ブラウザでアプリケーションにアクセスできる。
よくある問題と解決策
-
「CannotPullContainerError」が発生した場合:
- 原因: ECRへのアクセス権限不足や、イメージURIの誤り。
-
対策: タスク実行ロールに
AmazonECSTaskExecutionRolePolicyが付与されているか、ECRリポジトリのURIが正しいか確認してください。
-
タスクが
RUNNINGになった後、すぐにSTOPPEDになる:- 原因: アプリケーションがすぐに終了しているか、コンテナ内のポート設定が不一致。
- 対策: CloudWatch Logsでコンテナのログを確認し、エラー内容を特定しましょう。
-
ネットワークアクセスができない場合:
- 原因: セキュリティグループ、サブネット、インターネットゲートウェイの設定不備。
- 対策: ECSコンソールでタスクの詳細を開き、パブリックIPが割り当てられているか確認し、セキュリティグループのインバウンドルールがポート5000で開いているか再確認しましょう。
5. まとめと次のステップ
- タスク定義は、Dockerイメージやリソース設定をAWS向けに定義する「設計図」です。
- サービスは、タスク定義に基づいてコンテナを起動し、その稼働数を維持する役割を担います。
- Fargateは、これらの設定だけでコンテナを簡単に動かすことができます。
今日学んだ内容の制限事項: 現在の設定では、タスクが停止すると新しいIPアドレスが割り当てられます。この問題は、明日学ぶApplication Load Balancer (ALB) により解決できます。
💰 コスト管理のポイント:
Fargateの料金は、使用したCPU・メモリ・時間に基づいて計算されます。今回の設定(0.25 vCPU, 0.5GB)では、1時間あたり約$0.01の費用がかかります。学習後は必ずリソースを削除し、不要な費用を避けましょう。
🧹 リソースの削除方法:
- ECSサービスで「更新」→「必要なタスク数」を
0に設定します。 - タスクが停止したことを確認後、サービスを削除します。
- タスク定義は課金されないため、削除は任意です。
次回の予告
Day 13: ロードバランサーとオートスケーリング:高可用性なサービスを構築しよう
それでは、また明日お会いしましょう!