AWS Fargateとは?サーバーレスコンテナ運用入門

はじめに

コンテナ技術は現代のアプリケーション開発において欠かせない存在となっていますが、コンテナの運用管理には様々な課題があります。サーバーのプロビジョニング、パッチ適用、スケーリング、セキュリティなど、多くの運用タスクが発生します。AWS Fargateはこれらの課題を解決するために登場した「サーバーレスコンテナ実行環境」です。この記事では、AWS Fargateの概念から実践的な利用方法まで、サーバーレスコンテナ運用の基礎を解説します。

AWS Fargateとは

AWS Fargateは、コンテナを実行するためのサーバーレスコンピューティングエンジンです。Amazon ECS(Elastic Container Service)やAmazon EKS(Elastic Kubernetes Service)と統合されており、基盤となるインフラストラクチャを管理することなく、コンテナを実行できます。

従来のコンテナ運用とFargateの違い

従来のコンテナ運用(EC2インスタンスベース):

  • EC2インスタンスのプロビジョニングと管理が必要
  • クラスターのキャパシティ管理が必要
  • セキュリティパッチの適用やOSの更新が必要
  • コンテナプラットフォームのアップデートが必要

Fargateでのコンテナ運用:

  • サーバー管理が不要(サーバーレス)
  • コンテナ単位で正確なリソース割り当てと課金
  • セキュリティパッチやOSの更新はAWSが自動的に管理
  • インフラ管理からの解放により、アプリケーション開発に集中可能

Fargateの主な特徴

1. サーバーレスアーキテクチャ

Fargateでは、物理サーバーやEC2インスタンスを直接管理する必要がありません。コンテナの実行に必要なCPU、メモリ、ネットワークリソースを指定するだけで、AWがバックグラウンドでインフラの管理を行います。

2. コンテナ単位でのリソース指定

コンテナごとに必要なCPUとメモリリソースを細かく指定できます。これにより、アプリケーションの特性に合わせた最適なリソース割り当てが可能になります。

{
  "containerDefinitions": [
    {
      "name": "app",
      "image": "my-repository/my-app:latest",
      "cpu": 256,
      "memory": 512,
      "essential": true
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "256",
  "memory": "512"
}

3. 従量課金制

Fargateは使用したリソース(CPU時間とメモリ)に対してのみ課金されるため、コスト効率が高いです。コンテナが実行されていない時間帯には課金されません。

4. ECSとEKSの両方をサポート

FargateはAmazon ECS(AWS独自のコンテナオーケストレーションサービス)と、Amazon EKS(マネージドKubernetesサービス)の両方と統合されています。これにより、既存のコンテナ管理ツールやワークフローを継続利用できます。

Fargateの始め方

前提条件

  • AWSアカウント
  • AWS CLIのインストールと設定
  • Dockerの基本的な知識

1. ECSクラスターの作成

まず、ECSクラスターを作成します。AWSマネジメントコンソールから行う場合:

  1. ECSサービスを開き、「クラスターの作成」をクリック
  2. テンプレートで「ネットワークのみ」を選択
  3. クラスター名を入力(例:my-fargate-cluster)
  4. 「作成」をクリック

AWS CLIを使用する場合:

aws ecs create-cluster --cluster-name my-fargate-cluster

2. ECRリポジトリの作成とイメージのプッシュ

まず、コンテナイメージを保存するためのECRリポジトリを作成します:

aws ecr create-repository --repository-name my-app

次に、Dockerイメージをビルドして、ECRリポジトリにプッシュします:

# ECRへのログイン
aws ecr get-login-password | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com

# イメージのビルド
docker build -t my-app .

# タグ付け
docker tag my-app:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-app:latest

# プッシュ
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-app:latest

3. タスク定義の作成

Fargateでコンテナを実行するには、タスク定義が必要です。タスク定義は、コンテナイメージ、リソース要件、ネットワーク設定などを指定するJSONファイルです。

task-definition.jsonという名前のファイルを作成し、以下のような内容を記述します:

{
  "family": "my-app-task",
  "networkMode": "awsvpc",
  "executionRoleArn": "arn:aws:iam::<aws_account_id>:role/ecsTaskExecutionRole",
  "containerDefinitions": [
    {
      "name": "my-app",
      "image": "<aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-app:latest",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-app-task",
          "awslogs-region": "<region>",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "256",
  "memory": "512"
}

AWS CLIを使用してタスク定義を登録します:

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

4. サービスの作成

タスク定義を登録したら、それを使用してECSサービスを作成します。サービスは、指定した数のタスクを継続的に実行・維持します。

aws ecs create-service \
  --cluster my-fargate-cluster \
  --service-name my-app-service \
  --task-definition my-app-task \
  --desired-count 2 \
  --launch-type FARGATE \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-12345678,subnet-87654321],securityGroups=[sg-12345678],assignPublicIp=ENABLED}"

Fargateの実践的なユースケース

1. マイクロサービスの展開

Fargateは、マイクロサービスアーキテクチャに最適です。各サービスを個別のコンテナで実行し、必要に応じて独立してスケールできます。

例えば、ユーザーサービス、注文サービス、支払いサービスなど、それぞれを別々のFargateタスクとして実行できます。

2. バッチ処理やクローンジョブ

定期的なバッチ処理やクローンジョブもFargateの得意分野です。必要なときだけコンテナを起動して処理を実行し、終了後は自動的に停止するため、コスト効率が高いです。

ECSのスケジュールタスクを使用して、定期的にFargateタスクを実行できます:

aws events put-rule \
  --name my-scheduled-task \
  --schedule-expression "cron(0 12 * * ? *)"

aws events put-targets \
  --rule my-scheduled-task \
  --targets "[{\"Id\":\"1\",\"Arn\":\"arn:aws:ecs:<region>:<aws_account_id>:cluster/my-fargate-cluster\",\"RoleArn\":\"arn:aws:iam::<aws_account_id>:role/ecsEventsRole\",\"EcsParameters\":{\"TaskDefinitionArn\":\"arn:aws:ecs:<region>:<aws_account_id>:task-definition/my-batch-task:1\",\"TaskCount\":1,\"LaunchType\":\"FARGATE\",\"NetworkConfiguration\":{\"awsvpcConfiguration\":{\"Subnets\":[\"subnet-12345678\"],\"SecurityGroups\":[\"sg-12345678\"],\"AssignPublicIp\":\"ENABLED\"}}}}]"

3. CI/CDパイプラインの一部として

Fargateはテスト環境の構築やビルドプロセスにも活用できます。CI/CDパイプラインの一部として、テストやビルドを実行するコンテナをFargateで起動できます。

AWS CodePipelineと統合して、継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインを構築できます。

Fargateの高度な使い方

1. Auto Scalingの設定

Fargateサービスは、CPU使用率やメモリ使用率に基づいて自動的にスケールアウト/インできます。

# Auto Scalingターゲットの登録
aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-fargate-cluster/my-app-service \
  --min-capacity 1 \
  --max-capacity 10

# スケーリングポリシーの作成
aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-fargate-cluster/my-app-service \
  --policy-name cpu-tracking-scaling-policy \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration "{\"TargetValue\":70.0,\"PredefinedMetricSpecification\":{\"PredefinedMetricType\":\"ECSServiceAverageCPUUtilization\"}}"

2. セキュリティの強化

Fargateタスクに対してさまざまなセキュリティ対策を適用できます:

  • IAMロール: タスク実行ロールとタスクロールを使用して、最小権限の原則を適用
  • VPCエンドポイント: インターネットを経由せずにAWSサービスにアクセス
  • セキュリティグループ: 必要な通信のみを許可
  • AWS Secrets Manager: 機密情報を安全に管理

3. サービスディスカバリとロードバランシング

AWS Cloud MapとApplication Load Balancer(ALB)を使用して、Fargateサービス間の通信を簡素化できます。

# サービスディスカバリの名前空間を作成
aws servicediscovery create-private-dns-namespace \
  --name example.local \
  --vpc vpc-12345678

# サービスを登録
aws servicediscovery create-service \
  --name my-app \
  --dns-config "NamespaceId=ns-abcdef,DnsRecords=[{Type=A,TTL=300}]" \
  --health-check-custom-config FailureThreshold=1

Fargateの運用管理のベストプラクティス

1. コンテナイメージの最適化

  • 軽量なベースイメージを使用(AlpineやDistrolessなど)
  • マルチステージビルドでイメージサイズを削減
  • 不要なパッケージやファイルを含めない

2. リソース割り当ての最適化

  • アプリケーションの実際の要件に基づいてCPUとメモリを適切に設定
  • 負荷テストを実施して最適なリソース設定を特定
  • 過剰なリソース割り当てを避ける

3. モニタリングとロギング

  • AWS CloudWatchを使用してメトリクスを監視
  • コンテナログをCloudWatch Logsに送信
  • X-Rayを使用して分散トレーシングを実装

4. コスト最適化

  • 実際に必要なCPUとメモリのみを割り当てる
  • Auto Scalingを活用して需要に応じたリソース調整
  • Spot Instanceを活用(EKS Fargateではなく、ECS EC2+Spotの組み合わせ)
  • 不要なサービスは停止または削減

Fargateの制限事項と考慮点

Fargateの利点が多い一方で、いくつかの制限事項も理解しておく必要があります:

  1. GPUサポートなし: 現在、FargateでGPUを利用することはできません。機械学習や画像処理など、GPU依存のワークロードには不向きです。
  2. ストレージ制限: Fargateコンテナのエフェメラルストレージは最大200GBに制限されています。大量のデータを処理する場合は、S3などの外部ストレージサービスを利用する必要があります。
  3. ネットワークパフォーマンス: EC2インスタンスと比較すると、ネットワークパフォーマンスに制限がある場合があります。高スループットが必要なアプリケーションでは検証が必要です。
  4. コスト: 小規模なワークロードや使用率が低い場合、専用EC2インスタンスよりもコストが高くなる可能性があります。

実践例:Fargateを使ったウェブアプリケーションのデプロイ

Dockerfileの例

FROM node:14-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

タスク定義の例(CloudFormation)

Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: web-app
      Cpu: '512'
      Memory: '1024'
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - FARGATE
      ExecutionRoleArn: !Ref ExecutionRole
      TaskRoleArn: !Ref TaskRole
      ContainerDefinitions:
        - Name: web-app
          Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/web-app:latest
          Essential: true
          PortMappings:
            - ContainerPort: 3000
              HostPort: 3000
              Protocol: tcp
          Environment:
            - Name: NODE_ENV
              Value: production
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: web-app

サービス定義の例(CloudFormation)

  Service:
    Type: AWS::ECS::Service
    DependsOn: LoadBalancerListener
    Properties:
      ServiceName: web-app-service
      Cluster: !Ref Cluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 2
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          Subnets:
            - !Ref SubnetA
            - !Ref SubnetB
          SecurityGroups:
            - !Ref ServiceSecurityGroup
          AssignPublicIp: ENABLED
      LoadBalancers:
        - ContainerName: web-app
          ContainerPort: 3000
          TargetGroupArn: !Ref TargetGroup
      DeploymentConfiguration:
        MinimumHealthyPercent: 100
        MaximumPercent: 200

まとめ

AWS Fargateは、サーバー管理の複雑さから解放され、コンテナアプリケーションの開発と運用に集中できるサーバーレスコンピューティングサービスです。インフラ管理が不要になり、コンテナ単位でのリソース管理と料金体系により、効率的なアプリケーション運用が可能になります。

Fargateは以下のような場合に特に有効です:

  • サーバー管理を最小限に抑えたいとき
  • 変動する負荷に対応するスケーラブルなアプリケーションを運用したいとき
  • マイクロサービスアーキテクチャを採用しているとき
  • コスト効率を最大化したいとき

一方で、GPUワークロードや非常に大きなストレージ要件がある場合など、従来のEC2インスタンスベースの方が適している場合もあります。

AWS Fargateを使ったサーバーレスコンテナ運用は、インフラ管理の負担を減らしながら、モダンなコンテナベースのアプリケーション開発を実現する優れた選択肢です。この入門ガイドが、Fargateを使ったコンテナ運用の第一歩となれば幸いです。

コメント

タイトルとURLをコピーしました