ECS (Fargate) 実践的使用ガイド

この記事はで読むことができます。

1. はじめに

このガイドでは、Amazon ECS (Elastic Container Service) with Fargateの実践的な使用方法を段階的に説明します。基本的な操作から高度な設定まで、実際のコマンドやコード例を交えて解説します。

2. 環境設定

まず、必要なツールをインストールします。

2.1 AWS CLIのインストールと設定

まず最初にAWS CLIをインストールします。

bash
pip install awscli
aws configure

2.2 Docker のインストール(公式サイトから)

Docker(日本公式) こちらからダウンロード&インストールできます。

2.3 AWS CDK のインストール(オプション、インフラのコード化に使用)

CDKのインストールは不要ではありますが、AWSはインフラ設計をコード化して効率化できるので、ぜひ導入しましょう。

bash
npm install -g aws-cdk

3. アプリケーションのコンテナ化

サンプルの Node.js アプリケーションをコンテナ化します。

3.1 アプリケーションコード (app.js)

javascript
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello from ECS Fargate!');
});

app.listen(port, () => {
  console.log(`App listening at http://localhost:${port}`);
});

3.2 Dockerfile

Dockerfile
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "app.js" ]

3.3 イメージのビルドと ECR へのプッシュ

bash
aws ecr create-repository --repository-name my-ecs-app
docker build -t my-ecs-app .
docker tag my-ecs-app:latest <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/my-ecs-app:latest
aws ecr get-login-password | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.<your-region>.amazonaws.com
docker push <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/my-ecs-app:latest

4. ECS クラスターの作成

AWS CLIを使用してECSクラスターを作成します。

bash
aws ecs create-cluster --cluster-name my-ecs-cluster

5. タスク定義の作成

タスク定義 JSON ファイル (task-definition.json) を作成します。

json
{
  "family": "my-ecs-task",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512",
  "containerDefinitions": [
    {
      "name": "my-app",
      "image": "<your-account-id>.dkr.ecr.<your-region>.amazonaws.com/my-ecs-app:latest",
      "portMappings": [
        {
          "containerPort": 3000,
          "hostPort": 3000,
          "protocol": "tcp"
        }
      ]
    }
  ]
}

タスク定義を登録します。

bash
aws ecs register-task-definition --cli-input-json file://task-definition.json

6. ECS サービスの作成

サービスを作成して、タスクを実行します。

bash
aws ecs create-service \
  --cluster my-ecs-cluster \
  --service-name my-ecs-service \
  --task-definition my-ecs-task \
  --desired-count 1 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}"

7. サービスの確認とトラブルシューティング

7.1 サービスのステータス確認

bash
aws ecs describe-services --cluster my-ecs-cluster --services my-ecs-service

7.2 タスクのログ確認

bash
aws logs get-log-events --log-group-name /ecs/my-ecs-task --log-stream-name <log-stream-name>

7.3 よくあるトラブルとその解決方法

  • イメージプル失敗:ECRの権限を確認
  • ヘルスチェック失敗:アプリケーションのポート設定を確認
  • ネットワーク接続エラー:セキュリティグループとサブネットの設定を確認

8. スケーリングと最適化

8.1 Auto Scaling の設定

bash
aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-ecs-cluster/my-ecs-service \
  --min-capacity 1 \
  --max-capacity 10

aws application-autoscaling put-scaling-policy \
  --policy-name cpu-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-ecs-cluster/my-ecs-service \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{"TargetValue": 70.0, "PredefinedMetricSpecification": {"PredefinedMetricType": "ECSServiceAverageCPUUtilization"}}'

8.2 パフォーマンス最適化のヒント

  • コンテナイメージの最適化:マルチステージビルドの使用
  • タスク定義の最適化:必要最小限のリソース割り当て
  • ログ設定の最適化:必要なログのみを収集

9. セキュリティベストプラクティス

  1. IAM ロールの最小権限原則の適用
  2. セキュリティグループの適切な設定
  3. シークレット管理:AWS Secrets Manager の使用
  4. コンテナイメージのセキュリティスキャン

10. 高度な使用例

  1. Blue/Green デプロイメントの設定
  2. サービスディスカバリの使用
  3. AWS CDK を使用したインフラのコード化

例:CDK を使用した ECS Fargate サービスの定義

javascript
import * as ecs from '@aws-cdk/aws-ecs';
import * as ecsp from '@aws-cdk/aws-ecs-patterns';

const fargateService = new ecsp.ApplicationLoadBalancedFargateService(this, 'MyWebService', {
  taskImageOptions: {
    image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
  },
  publicLoadBalancer: true
});

まとめ

ECS (Fargate) は強力で柔軟なコンテナオーケストレーションサービスです。この実践的ガイドで紹介した手順とベストプラクティスを活用することで、効率的でスケーラブルなコンテナ環境を構築・運用することができます。

継続的な学習と実験を通じて、ECS (Fargate) の機能を最大限に活用し、アプリケーションのパフォーマンスと運用効率を向上させてください。