0Pricing
AWS Solutions Architect · レッスン

ECS クラスター、タスク定義、サービス

コンテナイメージとリソース制限を指定してECSタスク定義を作成し、クラスターに登録して、希望するタスク数を維持するサービスを作成します。

「ECS クラスター、タスク定義、サービス」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。

AWSでコンテナを使用する理由

コンテナは、アプリケーションとそのすべての依存関係を、環境間で一貫して実行できる移植性と分離性を備えた単位にパッケージ化します。Amazon ECS (Elastic Container Service)は、コントロールプレーンを管理することなくDockerコンテナを実行できる、AWSのフルマネージドなコンテナオーケストレーションサービスです。ECSはAWSのサービス(IAM、ALB、CloudWatch、Secrets Manager)と緊密に統合されており、Kubernetesの複雑さを伴わずにAWS上でコンテナを実行するための推奨サービスです。

ECSクラスター: グループ化の単位

ECS Clusterは、コンテナを実行するコンピューティングリソースを論理的にまとめたものです。クラスターには、EC2インスタンス(EC2起動タイプ)、Fargateキャパシティ(Fargate起動タイプ)、またはその両方を含めることができます。1つのクラスターに複数のサービスとスタンドアロンタスクを配置できます。クラスターはリージョン単位ですが、複数のアベイラビリティーゾーンにまたがります。一般的な構成は、環境(dev/staging/prod)ごとに1つのクラスターを用意し、各クラスター内に異なるマイクロサービス用の複数のサービスを配置する方法です。

aws ecs create-cluster \
  --cluster-name 'MyAppCluster' \
  --capacity-providers FARGATE FARGATE_SPOT \
  --default-capacity-provider-strategy \
    capacityProvider=FARGATE,weight=1,base=1

タスク定義: 設計図

Task Definitionは、ECSでコンテナを実行するための設計図であり、Docker Composeファイルに相当します。コンテナイメージ(ECR URIまたはDocker Hub)、CPUとメモリの割り当て、ポートマッピング、環境変数、ログ設定、ボリューム、IAMタスクロールを指定します。タスク定義にはバージョンが付けられ、各リビジョンは変更できません。1つのタスクに複数のコンテナを定義し、サイドカーパターン(メインアプリケーション + ログ転送エージェント + 監視エージェント)を構成することもできます。

{
  'family': 'myapp-task',
  'networkMode': 'awsvpc',
  'requiresCompatibilities': ['FARGATE'],
  'cpu': '512',
  'memory': '1024',
  'executionRoleArn': 'arn:aws:iam::123456789012:role/ecsTaskExecutionRole',
  'taskRoleArn': 'arn:aws:iam::123456789012:role/myAppTaskRole',
  'containerDefinitions': [{
    'name': 'myapp',
    'image': '123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest',
    'portMappings': [{'containerPort': 8080}]
  }]
}

タスクロールと実行ロールの違い

ECSタスクでは、目的の異なる2つのIAMロールを使用します。Task Execution RoleはECSエージェントが使用するロールで、ECRからのコンテナイメージの取得、CloudWatchへのログ送信、タスク起動時のSecrets ManagerまたはParameter Storeからのシークレット取得に使用されます。Task Roleは、コンテナ内で実行されるアプリケーションコードがAWSサービス(S3、DynamoDB、SQS)を呼び出すために使用するロールです。各ロールには必ず個別に最小権限を付与し、アプリケーションに不要な権限を実行ロールに与えないでください。

長時間実行するワークロード向けのECSサービス

ECS Serviceは、同時に実行するタスクインスタンス数(desired count)を指定した数に維持します。タスクが失敗または停止すると、サービススケジューラが自動的に代替タスクを起動します。サービスはElastic Load Balancingと統合してトラフィックを分散でき、ローリングデプロイやブルー/グリーンデプロイにも対応しています。Webサーバー、APIサーバー、バックグラウンドワーカーなど、長時間実行するプロセスにはサービスを使用してください。1回限りのジョブには、代わりにスタンドアロンタスクを実行します。

aws ecs create-service \
  --cluster 'MyAppCluster' \
  --service-name 'MyAppService' \
  --task-definition 'myapp-task:5' \
  --desired-count 3 \
  --launch-type FARGATE \
  --network-configuration '{
    "awsvpcConfiguration": {
      "subnets": ["subnet-aaa111", "subnet-bbb222"],
      "securityGroups": ["sg-xyz"],
      "assignPublicIp": "DISABLED"
    }
  }'

ネットワークモード: awsvpcとbridge

awsvpcネットワークモードでは、各ECSタスクに独自のElastic Network Interface(ENI)と、VPC内のプライベートIPアドレスが付与されます。これはEC2インスタンスと同様です。タスクごとにきめ細かなセキュリティグループ制御が可能になり、Fargateタスクでは必須です。bridgeネットワークモードでは、ホスト上のDocker組み込み仮想ネットワークを使用し、ホストからコンテナへのポートマッピングを行います。このモードでは、ホストEC2インスタンスのENIを共有します。SAA-C03試験では、Fargateは常にawsvpcを使用し、EC2起動タイプではどちらも使用できると覚えてください。

ECSサービスへのロードバランサーのアタッチ

タスクインスタンス間でトラフィックを分散するには、ECSサービスをALBターゲットグループに登録します。新しいタスクが起動すると、ECSは自動的にそのタスクをターゲットグループに登録し、停止すると登録を解除します。コンテナの起動時間を確保してからヘルスチェックを開始できるよう、ヘルスチェックの猶予期間(例: 60~120秒)を設定してください。猶予期間がないと、ALBが起動に時間のかかるコンテナを準備完了前に異常と判定し、置き換えが繰り返される可能性があります。

aws ecs create-service \
  --cluster 'MyAppCluster' \
  --service-name 'MyAppService' \
  --load-balancers \
    'targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=myapp,containerPort=8080' \
  --health-check-grace-period-seconds 120 \
  --task-definition 'myapp-task:5' \
  --desired-count 3

ローリングデプロイとブルー/グリーンデプロイ

ECSサービスは2つのデプロイ戦略をサポートしています。Rolling Updateは、古いタスクを新しいタスクに段階的に置き換えます。minimumHealthyPercent(下限)とmaximumPercent(上限)で設定できます。100/200に設定すると、古いタスクを実行したまま新しいタスクを起動します(100%の正常性を維持し、最大200%のキャパシティまで使用)。Blue/Green deployment(AWS CodeDeploy経由)では、古いタスクセットと並行して新しいタスクセットを作成し、ALBの重み付けルーティングを使用してトラフィックを段階的に移行します。検証後、古いタスクを終了します。ブルー/グリーンデプロイには、ダウンタイムなしでロールバックできる機能があります。

ECSからのCloudWatchログ記録

タスク定義でawslogsログドライバーを設定すると、コンテナの標準出力と標準エラー出力をCloudWatch Logsに直接送信できます。ロググループ、リージョン、ストリームプレフィックスを指定してください。タスク実行ロールには、logs:CreateLogStreamおよびlogs:PutLogEventsの権限が必要です。複数のサービスにまたがるログを一元的に集約するには、FireLens(Fluent BitまたはFluentdを使用するサイドカーコンテナ)を使用して、ログをS3、OpenSearch、またはサードパーティのログシステムにルーティングすることを検討してください。

'logConfiguration': {
    'logDriver': 'awslogs',
    'options': {
        'awslogs-group': '/ecs/myapp',
        'awslogs-region': 'us-east-1',
        'awslogs-stream-prefix': 'myapp'
    }
}

Cloud MapによるECSサービスディスカバリ

ECS上のマイクロサービス間で通信する場合、タスクは一時的なもので、起動するたびに新しいIPアドレスを取得するため、ハードコードしたIPアドレスは使用できません。AWS Cloud Map(ECS Service Discovery)を使用して、各タスクのIPアドレスとポートをDNS名前空間に登録してください。他のサービスはmyservice.namespace.localを解決し、現在正常なタスクのIPアドレスを取得できます。ECSは新しいタスクを自動的に登録し、失敗したタスクの登録を解除するため、手動管理なしでDNSレコードを正確に保てます。

ECSタスク定義でのシークレット管理

タスク定義に認証情報をハードコードしないでください。代わりに、タスク定義でSecrets ManagerまたはParameter Storeのシークレットを参照します。ECSはタスク起動時に、それらを環境変数として注入します。タスク実行ロールには、シークレットを取得する権限が必要です。Secrets Managerではsecretsmanager:GetSecretValue、Parameter Storeではssm:GetParametersを使用します。シークレットはコンテナの起動時に一度だけ取得されるため、ローテーションしたシークレットを反映するにはタスクを置き換える必要があります。

'secrets': [
    {
        'name': 'DB_PASSWORD',
        'valueFrom': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:myapp/db-password-AbCdEf'
    },
    {
        'name': 'API_KEY',
        'valueFrom': 'arn:aws:ssm:us-east-1:123456789012:parameter/myapp/api-key'
    }
]

理解度チェック

このレッスンで扱ったAWS Solutions Architect(SAA-C03)の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、ECS Clustersがタスクを実行するコンピューティングリソースをまとめること、Task Definitionsがコンテナイメージ、CPU/メモリ、ロール、ログ設定をバージョン管理された設計図として定義すること、そしてECS Servicesが希望するタスク数を維持し、ALBと統合してトラフィックを分散し、ローリングデプロイまたはブルー/グリーンデプロイに対応することを学びました。次は、EC2起動タイプとサーバーレスのFargate起動タイプを比較します。

よくある質問

「ECS クラスター、タスク定義、サービス」レッスンは無料ですか?

はい。「ECS クラスター、タスク定義、サービス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。

「ECS クラスター、タスク定義、サービス」で何を学びますか?

コンテナイメージとリソース制限を指定してECSタスク定義を作成し、クラスターに登録して、希望するタスク数を維持するサービスを作成します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AWS Solutions Architectを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「ECS クラスター、タスク定義、サービス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAWS Solutions Architectレッスンでコードを書いて実行できますか?

はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ECS クラスター、タスク定義、サービス
  2. EC2起動タイプとFargateの比較
  3. ECR:コンテナイメージの保存と取得
  4. ECSサービスのオートスケーリングとロードバランシング
← AWS Solutions Architectに戻る