AWS ECS/EC2対応の最適化戦略を考える


## はじめに  

本記事では、AWS公式ドキュメント、およびAWSソリューションアーキテクトの推奨事項を基に、ECSやEC2を活用したデプロイメントの最適化戦略を考えます。



## 1. コンテナ最適化戦略  

AWS公式が提供するベストプラクティスに基づいて、コンテナイメージとリポジトリの管理方法を最適化します。  

### 1.1 Dockerfile最適化  

以下のようなマルチステージビルドを使用することで、セキュリティとイメージサイズの最適化を実現します。

#### サンプルコード
```dockerfile
# 最新のAmazon Linuxをベースにした最適化ビルド
FROM public.ecr.aws/amazonlinux/amazonlinux:2023 AS builder

# 必要な依存関係のインストール
COPY package*.json ./
RUN --mount=type=cache,target=/var/cache/npm \
    npm ci --production

# 本番用の軽量イメージ
FROM public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
COPY --from=builder /app/dist ./dist
USER nobody
```

#### ポイント  
1. **軽量化**: 必要最低限のランタイムだけを含む `minimal` ベースイメージを使用。  
2. **セキュリティ**: 依存関係をセキュリティスキャン済みの状態で固定化。  

---

### 1.2 ECRライフサイクルポリシー設定  

ECRライフサイクルポリシーを設定することで、古いコンテナイメージを自動削除し、ストレージコストを削減します。

#### サンプル設定
```json
{
  "rules": [
    {
      "rulePriority": 1,
      "description": "Keep only the latest 30 production images",
      "selection": {
        "tagStatus": "tagged",
        "tagPrefixList": ["prod-"],
        "countType": "imageCountMoreThan",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}
```

#### ポイント  
- **コスト削減**: 不要なイメージを自動削除し、ストレージコストを最小化。  
- **運用負荷軽減**: 古いイメージを手動管理する必要がなくなる。  

---

## 2. ECSクラスター最適化  

ECSクラスターの設定を最適化することで、リソース利用率と運用コストのバランスを改善します。

### 2.1 タスク定義のベストプラクティス  

以下は、Fargateを使用するタスク定義の最適な設定例です。

#### サンプル設定
```json
{
  "containerDefinitions": [
    {
      "name": "app",
      "image": "${ECR_REPO}:${TAG}",
      "memory": 512,
      "cpu": 256,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "healthCheck": {
        "command": ["CMD-SHELL", "curl -f http://localhost/health || exit 1"],
        "interval": 30,
        "timeout": 5,
        "retries": 3
      }
    }
  ],
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512"
}
```

#### ポイント  
- **ヘルスチェックの活用**: 問題の早期検出と復旧時間の短縮。  
- **リソース効率化**: 必要最小限のCPUとメモリを設定。  

---

## 3. デプロイメントパフォーマンス指標  

効率的なデプロイメントを実現するための目標値を以下に示します。(一例）

| メトリクス          | ベンチマーク | 備考                  |  
|--------------------|------------|---------------------|  
| イメージビルド       | < 3分       | マルチステージビルド使用時 |  
| ECSデプロイ         | < 5分       | Blue/Green構成      |  
| ヘルスチェック       | < 30秒      | ALB使用時           |  

---

## 4. セキュリティコンプライアンス  

ECRのスキャン機能を有効化することで、セキュリティ脆弱性を早期に検出します。

### 4.1 必須セキュリティ設定  

#### サンプルコマンド
```bash
aws ecr put-image-scanning-configuration \
    --repository-name ${REPO} \
    --image-scanning-configuration scanOnPush=true
```

#### メリット  
- **リアルタイムスキャン**: プッシュ時に脆弱性を即座に検出。  
- **影響範囲の最小化**: デプロイ前に修正可能。  

---
以下のように補足を加え、各項目の背景や目的を明確化しました。

---

## 5. 実装チェックリスト  

本チェックリストは、デプロイメント環境を最適化しつつ運用負荷を軽減するために必要な初期設定を2日間に分けて整理したものです。**Day 1**は基礎的な設定、**Day 2**はより高度な運用構築に関する設定をカバーしています。

---

### Day 1: 基礎設定  
初日は運用環境の基盤となる設定を行います。

#### 1. **ECRライフサイクルポリシー設定**  
古いコンテナイメージを自動削除するポリシーを設定し、以下のメリットを実現します：  
- **コスト削減**: 不要なストレージ使用を防止。  
- **管理効率化**: 古いイメージの削除を自動化し、手動作業を削減。  

参考設定例は以下をご覧ください：
```json
{
  "rules": [
    {
      "rulePriority": 1,
      "description": "Keep only the latest 30 production images",
      "selection": {
        "tagStatus": "tagged",
        "tagPrefixList": ["prod-"],
        "countType": "imageCountMoreThan",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}
```

#### 2. **IAMロールを最小権限に設定**  
タスク実行やデプロイに使用するIAMロールを**最小権限の原則**に基づいて設定します。これにより：
- **セキュリティ強化**: 権限の誤設定による不正アクセスリスクを軽減。  
- **監査対応**: 必要最小限のアクセス制御を実現し、コンプライアンスを遵守。  

#### 3. **CloudWatch Logsの監視設定**  
アプリケーションログやタスクのイベントログをCloudWatch Logsに送信して可視化します。これにより：  
- **トラブルシューティング効率化**: エラーや問題の特定が迅速に行える。  
- **パフォーマンスモニタリング**: CPUやメモリ使用量の傾向をリアルタイムで監視可能。  

設定例（ECSタスク定義内でCloudWatch Logsを有効化）:
```json
"logConfiguration": {
  "logDriver": "awslogs",
  "options": {
    "awslogs-region": "ap-northeast-1",
    "awslogs-group": "/ecs/my-service",
    "awslogs-stream-prefix": "ecs"
  }
}
```

---

### Day 2: 高度な運用設定  
2日目は本番運用をより安定化・自動化するための設定を行います。

#### 1. **Auto Scalingポリシーの設定**  
トラフィックや負荷の増減に応じて、自動的にタスク数やインスタンス数を調整する仕組みを構築します。これにより：  
- **コスト効率化**: 負荷の少ない時間帯はリソースを縮小。  
- **高可用性の維持**: 急激な負荷増加に対応可能。  

設定例（ターゲット追跡スケーリングポリシー）:
```json
{
  "ServiceNamespace": "ecs",
  "ResourceId": "service/my-cluster/my-service",
  "ScalableDimension": "ecs:service:DesiredCount",
  "PolicyType": "TargetTrackingScaling",
  "TargetTrackingScalingPolicyConfiguration": {
    "TargetValue": 50.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 60
  }
}
```

#### 2. **アラート閾値の定義**  
CloudWatchアラームを設定し、異常が発生した際に通知を受け取れるようにします。
たとえば：
- **CPU利用率が80%を超えたときにアラート送信**  
- **タスクが異常終了した際に通知を受け取る**  

設定例（CLIを使用したアラーム作成）:
```bash
aws cloudwatch put-metric-alarm \
  --alarm-name "HighCPUUtilization" \
  --metric-name "CPUUtilization" \
  --namespace "AWS/ECS" \
  --statistic "Average" \
  --period 60 \
  --threshold 80 \
  --comparison-operator "GreaterThanThreshold" \
  --dimensions Name=ClusterName,Value=my-cluster \
  --evaluation-periods 1 \
  --alarm-actions arn:aws:sns:ap-northeast-1:123456789012:MySNSTopic
```

#### 3. **バックアップ戦略の実装**  
重要なデータや設定を定期的にバックアップする戦略を実装します。たとえば：
- **EBSボリュームのスナップショット作成**  
- **RDSデータベースのバックアップ**  

設定例（EBSスナップショットの自動化）:
```bash
aws ec2 create-snapshot \
  --volume-id vol-0abcd1234efgh5678 \
  --description "Backup of volume vol-0abcd1234efgh5678"
```

---

### チェックリストを活用するメリット
このチェックリストを基に設定を進めることで、初期構築から運用の安定化までを効率的に行えます。特に、**自動化**と**監視体制**の確立は、運用負荷を軽減し、本番環境での安定性を大きく向上させます。


## 参考文献  

1. [ECSベストプラクティス (2024)](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/)  
2. [コンテナセキュリティガイド](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security.html)