はじめに
Amazon Elastic Container Service (ECS) は、フルマネージド型のコンテナオーケストレーションサービスであり、Dockerコンテナを簡単にデプロイ、管理、スケーリングすることができます。本記事では、Amazon ECSの基本的な設定方法と、Dockerコンテナをデプロイするための手順について詳しく解説します。
前提条件
- AWS アカウント
- AWS CLI のインストールと設定
- Docker のインストール
- 基本的なDocker知識
- コンテナ化されたアプリケーション
Amazon ECSの基本概念
まず、Amazon ECSの主要な概念について理解しておきましょう。
- クラスター: ECSリソースを論理的にグループ化する単位です。
- タスク定義: コンテナの設定を記述したJSONファイル。実行するコンテナイメージ、使用するリソース、ポートマッピングなどを定義します。
- タスク: タスク定義のインスタンスで、実際に実行されるコンテナの集合です。
- サービス: タスクを長期間実行し、指定した数のタスクを維持するための機能です。
- コンテナインスタンス: タスクを実行するEC2インスタンス(EC2起動タイプの場合)。
ECSのデプロイタイプ
Amazon ECSでは、主に2つのデプロイタイプがあります。
- EC2起動タイプ: 自分でEC2インスタンスを管理し、その上でコンテナを実行します。コストを最適化したい場合や特殊なインスタンスタイプが必要な場合に適しています。
- Fargate: サーバーレスコンピューティングエンジンでインフラの管理不要。コンテナのみに集中できるため、運用の手間が少なくて済みます。
今回の記事では、両方のデプロイタイプについて説明します。
手順1: ECSクラスターの作成
AWS Management Consoleを使用する場合
- AWSマネジメントコンソールにログインし、「ECS」サービスを選択します。
- 「クラスター」を選択し、「クラスターの作成」をクリックします。
- クラスタータイプを選択します(EC2 Linux + ネットワーキング、Fargateなど)。
- クラスターの名前を入力し、必要に応じて設定を行います。
- EC2起動タイプの場合は、インスタンスタイプ、数、ネットワーク設定などを指定します。
- Fargateの場合は、ネットワーク設定のみを指定します。
- 「作成」ボタンをクリックします。
AWS CLIを使用する場合
EC2起動タイプのクラスターを作成する場合:
aws ecs create-cluster --cluster-name my-ecs-cluster
手順2: タスク定義の作成
AWS Management Consoleを使用する場合
- ECSダッシュボードで「タスク定義」を選択し、「新しいタスク定義の作成」をクリックします。
- 起動タイプの互換性を選択します(EC2またはFargate)。
- タスク定義名、タスクロール、ネットワークモードなどを設定します。
- 「コンテナの追加」をクリックし、以下の情報を入力します:
- コンテナ名
- イメージ(例:
nginx:latest
) - メモリ制限
- ポートマッピング
- 環境変数
- その他の設定
- 「作成」ボタンをクリックします。
JSON形式でタスク定義を作成する場合
以下は基本的なタスク定義のJSONファイル例です(task-definition.json
として保存):
{
"family": "sample-app",
"networkMode": "awsvpc",
"executionRoleArn": "arn:aws:iam::<アカウントID>:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "sample-app",
"image": "nginx:latest",
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"memory": 512,
"cpu": 256
}
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
AWS CLIを使用してタスク定義を登録する場合:
aws ecs register-task-definition --cli-input-json file://task-definition.json
手順3: サービスの作成
AWS Management Consoleを使用する場合
- ECSクラスターダッシュボードで、作成したクラスターを選択します。
- 「サービス」タブを選択し、「作成」をクリックします。
- 以下の情報を設定します:
- 起動タイプ(EC2またはFARGATE)
- タスク定義とリビジョン
- サービス名
- サービスタイプ(通常はREPLICA)
- タスク数(実行するコンテナの数)
- デプロイメント構成(最小正常パーセント、最大パーセント)
- ネットワーク構成を設定します:
- VPC、サブネット、セキュリティグループ
- 自動割り当てパブリックIP(必要な場合)
- ロードバランシングの設定(必要な場合):
- Application Load Balancer、Network Load Balancer、または Service Discoveryを選択
- ターゲットグループ、ヘルスチェックの設定
- Auto Scalingの設定(必要な場合)
- 「次のステップ」をクリックし、設定を確認して「サービスの作成」をクリックします。
AWS CLIを使用する場合
aws ecs create-service \
--cluster my-ecs-cluster \
--service-name my-service \
--task-definition sample-app:1 \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-12345678,subnet-87654321],securityGroups=[sg-12345678],assignPublicIp=ENABLED}"
手順4: Dockerイメージのビルドとプッシュ
独自のDockerイメージをECRにプッシュして使用する場合、以下の手順に従います。
1. Amazon ECRリポジトリの作成
aws ecr create-repository --repository-name my-app --region ap-northeast-1
2. ECRリポジトリへのログイン
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
3. Dockerイメージのビルド
docker build -t my-app .
4. イメージにタグ付け
docker tag my-app:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
5. ECRへのイメージプッシュ
docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest
6. タスク定義でECRイメージを使用
タスク定義内のイメージパスを更新します:
"image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest"
実践的なサンプル:シンプルなウェブアプリケーションのデプロイ
以下は、簡単なNode.jsアプリケーションをECSにデプロイする例です。
Dockerfileの作成
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
app.jsファイルの作成
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from ECS!');
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
package.jsonの作成
{
"name": "ecs-demo-app",
"version": "1.0.0",
"description": "Simple Node.js app for ECS demo",
"main": "app.js",
"dependencies": {
"express": "^4.17.1"
}
}
デプロイ手順
- 上記のDockerイメージをビルドしてECRにプッシュします。
- 以下のようなタスク定義を作成します:
{
"family": "nodejs-app",
"networkMode": "awsvpc",
"executionRoleArn": "arn:aws:iam::<アカウントID>:role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "nodejs-app",
"image": "<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest",
"essential": true,
"portMappings": [
{
"containerPort": 3000,
"hostPort": 3000,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/nodejs-app",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
},
"memory": 512,
"cpu": 256
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512"
}
- タスク定義を登録し、サービスを作成します。
- アプリケーションがデプロイされたら、割り当てられたパブリックIPアドレスまたはロードバランサーのDNS名を使用してアクセスします。
トラブルシューティングと最適化
よくあるトラブルと解決策
- コンテナの起動失敗
- エラーログをCloudWatchで確認する
- イメージパスが正しいか確認する
- IAMロールのアクセス権限を確認する
- ネットワーク接続の問題
- セキュリティグループの設定を確認する
- サブネットの設定を確認する
- パブリックIPの割り当てを確認する
- リソース不足
- タスク定義のCPU/メモリ設定を見直す
- クラスターのキャパシティを確認する
パフォーマンス最適化のヒント
- コンテナイメージの最適化
- マルチステージビルドを使用する
- 不要なファイルを含めない
- 軽量なベースイメージを使用する
- オートスケーリングの設定
- CPUやメモリ使用率に基づいたスケーリングポリシーを設定する
- 予測可能なトラフィックパターンの場合は予定スケーリングを利用する
- コスト最適化
- Fargateの場合はタスクサイズを適切に設定する
- EC2起動タイプの場合はスポットインスタンスを検討する
- 使用していないリソースを定期的に削除する
まとめ
本記事では、Amazon ECSの基本的な設定方法と、Dockerコンテナをデプロイするための手順について解説しました。ECSを使うことで、Dockerコンテナの管理が簡単になり、スケーラブルで信頼性の高いアプリケーションを構築することができます。
初めは複雑に感じるかもしれませんが、一度基本を理解すれば、AWS ECSは非常に強力で使いやすいコンテナオーケストレーションプラットフォームです。この記事が皆さんのECSデプロイの助けになれば幸いです。
コメント