🦔

【初心者向け】Amazon ECS 入門!完全ガイド

2023/11/06に公開

Amazon Elastic Container Service (Amazon ECS)

☘️ はじめに

本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。

最新の情報については、AWS 公式ドキュメントをご参照ください。

👀 Contents

Amazon ECS とは

コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを容易にするフルマネージドコンテナオーケストレーションサービスです。

【AWS Black Belt Online Seminar】Amazon Elastic Container Service (Amazon ECS)(YouTube)(1:00:02)

blackbelt-ecs

【AWS Black Belt Online Seminar】CON201 ECS 入門(YouTube)(0:20:28)

blackbelt-ecs-start

【AWS Black Belt Online Seminar】CON202 ECS Fargate 入門(YouTube)(0:16:29)

blackbelt-ecs-fargate

【AWS Black Belt Online Seminar】CON371 Amazon ECS Anywhere(YouTube)(0:18:36)

blackbelt-ecs-anywhere

【AWS Black Belt Online Seminar】 CON207 Auto Scaling in ECS(0:11:16)

【AWS Black Belt Online Seminar】CON307 ECS Capacity Providers(0:17:47)

blackbelt-ecs-cp

【AWS Black Belt Online Seminar】 CON303 Amazon Elastic Container Service − EC 2 / Fargate Spot ことはじめ(0:20:34)

blackbelt-ecs-ec2-spot

Amazon Elastic Container Service サービス概要

Amazon Elastic Container Service ドキュメント

Amazon Elastic Container Service よくある質問

Amazon Elastic Container Service の料金

ハンズオン

Amazon ECS 入門ハンズオン

JP Contents Hub > Containers

ECS の構成要素

ecs-components

  1. クラスター
  2. サービス
  3. タスク
  4. タスク定義

クラスター:サービスとタスクを実行する基盤

ecs-components-1

起動タイプが EC2 の場合、EC2 インスタンス群のことです。
Fargate の場合は、どのインスタンスで動いているかは隠ぺいされているので、論理的なグループに過ぎない。

システム、環境などで分けるのが一般的だと思われます。

Amazon ECS のサービスクォータ の制限もあるので、クラスターを分けることで、クォータの制限を回避できる場合があります。

また、「Container Insights」を有効化したクラスタと無効化したクラスタを作成することで、CloudWatch のカスタムメトリクスの不要なコストを削減することもできます。

サービス:実行中のタスクを管理する単位

Amazon ECS サービス

ecs-components-2

サービスは、指定した数のタスクを維持したり、ロードバランサーなど、実行するタスクの管理をする単位です。

タスク:起動する1つ以上のコンテナの集合

ecs-components-3

タスク定義とよばれる定義テンプレートに従って起動されるコンテナの集まりです。
タスクの単位で、CPU やメモリの割り当てを行い、割り当てられた範囲でコンテナを起動します。

タスク定義:タスクを作成する定義テンプレート

Amazon ECS の タスク定義

ecs-components-4

タスク定義は、次のようになります。(公式のサンプル)

{
  "containerDefinitions": [
    {
      "command": [
        "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
      ],
      "entryPoint": ["sh", "-c"],
      "essential": true,
      "image": "httpd:2.4",
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/fargate-task-definition",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "name": "sample-fargate-app",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ]
    }
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
  "family": "fargate-task-definition",
  "memory": "512",
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "requiresCompatibilities": ["FARGATE"]
}

代表的なパラメータは次のとおりです。その他のパラメータについては、「タスク定義パラメータ」を参照してください。

  • ファミリー名
    • タスク定義の名称を指定します。
  • 起動タイプ
    • Fargate(デフォルト)
    • EC2
    • 外部
  • ランタイムプラットフォーム
    • Fargate では必須のパラメータで、operatingSystemFamily と cpuArchitecture を指定します。デフォルトは、Linux/X86_64 です。
    • Linux/X86_64
    • Linux/ARM64
    • Windows
  • タスクサイズ
    • タスクが使用する CPU、メモリの合計量を指定
    • 起動タイプが EC2 の場合は省略可能です。省略した場合は、EC2 インスタンスのスペックが上限となります。
    • 起動タイプが Fargate の場合は特定の組み合わせのみ指定可能です。
  • ネットワークモード
    • awsvpc(タスクに ENI が割り当てられる)
    • host(ホストの ENI に直接マッピング)
    • bridge(ホスト内でのみ)
    • none(外部へ接続できない)
    • 詳細はこちら Amazon ECS タスクネットワーキング
  • タスク実行ロール
    • Amazon ECS タスク実行 IAM ロール とは、タスクを起動する際に必要となる権限を設定したロールです。主に次のようなものを設定しておきます。
      • ECR から コンテナイメージを Pull するための権限
      • CloudWatch Logs にログを記録するための権限
  • タスクロール
    • タスク IAM ロール とは、コンテナ化したアプリケーションから実行するのに必要な権限を設定したロールです。例えば、S3 へのアクセスなどです。EC2 でいうところの インスタンスプロファイル のようなものです。
  • コンテナ定義
    • タスクで起動するコンテナの定義です。コンテナごとに定義します。
    • name
      • コンテナの名前です
    • image
      • Docker Hub や ECR のイメージを指定します
    • memory
      • コンテナが使用するメモリの最大量。コンテナはこのメモリを超えることはできません。
      • タスク内のコンテナの総 memory は、タスクサイズ で指定した cpu を超えることはできません。
    • memoryReservation
      • memoryReservation はコンテナに確保する最低限のメモリ量を指定します。
      • 設定した値を超えるメモリが必要な場合は、空きメモリを自動で割り当てます。ただし、memory で指定した値まで。
      • タスクサイズ memory ≧ コンテナ定義 memory ≧ コンテナ定義 memoryReservation
    • cpu
      • タスク内のコンテナの総 cpu は、タスクサイズ で指定した cpu を超えることはできません。

memoryReservation(ソフト制限)と memory(ハード制限)の組み合わせ

memoryReservationmemory のパラメータは指定有無などの組み合わせによって割り当てが異なります。

memoryReservation(ソフト制限) memory(ハード制限) 予約メモリ~上限メモリ
未指定 3072 MiB 3072 MiB ~ 3072 MiB
2048 MiB 未指定 2048 MiB ~ タスクサイズの memory / EC2 のメモリ
2048 MiB 3072 MiB 2048 MiB ~ 3072 MiB

ECS クラスタ作成手順

  1. コンテナイメージの作成

  2. コンテナイメージを ECR に Push

  3. クラスター作成

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

    ecs-create-00-cluster

  4. タスク定義の作成

    aws ecs register-task-definition --cli-input-json file://$HOME/tasks/fargate-task.json
    

    ecs-create-01-taskdef

  5. サービスの作成

    aws ecs create-service --cluster fargate-cluster --service-name fargate-service \
    --task-definition sample-fargate:1 --desired-count 1 --launch-type "FARGATE" \
    --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}" \
    --enable-execute-command
    

    ecs-create-02-service

AWS Copilot

AWS Copilot

AWS Cpilot(コパイロット)とは、Amazon ECS CLI の後継にあたるもので、コンテナ化されたアプリケーション用のコマンドラインインターフェイスです。

コマンド1つといくつかの設定で、可用性を考慮した構成や LB の構築、設定などを行ってくれるというものです。

詳しい使い方はこちら。
https://aws.github.io/copilot-cli/ja/

📖 まとめ

ecs

GitHubで編集を提案

Discussion