はじめに
コンテナ技術は現代のアプリケーション開発において欠かせない存在となっていますが、コンテナの運用管理には様々な課題があります。サーバーのプロビジョニング、パッチ適用、スケーリング、セキュリティなど、多くの運用タスクが発生します。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マネジメントコンソールから行う場合:
- ECSサービスを開き、「クラスターの作成」をクリック
- テンプレートで「ネットワークのみ」を選択
- クラスター名を入力(例:my-fargate-cluster)
- 「作成」をクリック
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の利点が多い一方で、いくつかの制限事項も理解しておく必要があります:
- GPUサポートなし: 現在、FargateでGPUを利用することはできません。機械学習や画像処理など、GPU依存のワークロードには不向きです。
- ストレージ制限: Fargateコンテナのエフェメラルストレージは最大200GBに制限されています。大量のデータを処理する場合は、S3などの外部ストレージサービスを利用する必要があります。
- ネットワークパフォーマンス: EC2インスタンスと比較すると、ネットワークパフォーマンスに制限がある場合があります。高スループットが必要なアプリケーションでは検証が必要です。
- コスト: 小規模なワークロードや使用率が低い場合、専用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を使ったコンテナ運用の第一歩となれば幸いです。
コメント