【初心者向け】Amazon ECS 入門!完全ガイド
Amazon Elastic Container Service (Amazon ECS)
☘️ はじめに
本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
👀 Contents
- Amazon ECS とは
- ハンズオン
- ECS の構成要素
- クラスター:サービスとタスクを実行する基盤
- サービス:実行中のタスクを管理する単位
- タスク:起動する1つ以上のコンテナの集合
- タスク定義:タスクを作成する定義テンプレート
- ECS クラスタ作成手順
- AWS Copilot
- 📖 まとめ
Amazon ECS とは
コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを容易にするフルマネージドコンテナオーケストレーションサービスです。
【AWS Black Belt Online Seminar】Amazon Elastic Container Service (Amazon ECS)(YouTube)(1:00:02)
【AWS Black Belt Online Seminar】CON201 ECS 入門(YouTube)(0:20:28)
【AWS Black Belt Online Seminar】CON202 ECS Fargate 入門(YouTube)(0:16:29)
【AWS Black Belt Online Seminar】CON371 Amazon ECS Anywhere(YouTube)(0:18:36)
【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)
【AWS Black Belt Online Seminar】 CON303 Amazon Elastic Container Service − EC 2 / Fargate Spot ことはじめ(0:20:34)
Amazon Elastic Container Service サービス概要
Amazon Elastic Container Service ドキュメント
Amazon Elastic Container Service よくある質問
Amazon Elastic Container Service の料金
ハンズオン
ECS の構成要素
- クラスター
- サービス
- タスク
- タスク定義
クラスター:サービスとタスクを実行する基盤
起動タイプが EC2 の場合、EC2 インスタンス群のことです。
Fargate の場合は、どのインスタンスで動いているかは隠ぺいされているので、論理的なグループに過ぎない。
システム、環境などで分けるのが一般的だと思われます。
Amazon ECS のサービスクォータ の制限もあるので、クラスターを分けることで、クォータの制限を回避できる場合があります。
また、「Container Insights」を有効化したクラスタと無効化したクラスタを作成することで、CloudWatch のカスタムメトリクスの不要なコストを削減することもできます。
サービス:実行中のタスクを管理する単位
サービスは、指定した数のタスクを維持したり、ロードバランサーなど、実行するタスクの管理をする単位です。
タスク:起動する1つ以上のコンテナの集合
タスク定義とよばれる定義テンプレートに従って起動されるコンテナの集まりです。
タスクの単位で、CPU やメモリの割り当てを行い、割り当てられた範囲でコンテナを起動します。
タスク定義:タスクを作成する定義テンプレート
タスク定義は、次のようになります。(公式のサンプル)
{
"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 にログを記録するための権限
-
Amazon ECS タスク実行 IAM ロール とは、タスクを起動する際に必要となる権限を設定したロールです。主に次のようなものを設定しておきます。
-
タスクロール
-
タスク IAM ロール とは、コンテナ化したアプリケーションから実行するのに必要な権限を設定したロールです。例えば、S3 へのアクセスなどです。EC2 でいうところの
インスタンスプロファイル
のようなものです。
-
タスク IAM ロール とは、コンテナ化したアプリケーションから実行するのに必要な権限を設定したロールです。例えば、S3 へのアクセスなどです。EC2 でいうところの
-
コンテナ定義
- タスクで起動するコンテナの定義です。コンテナごとに定義します。
- name
- コンテナの名前です
- image
- Docker Hub や ECR のイメージを指定します
- memory
- コンテナが使用するメモリの最大量。コンテナはこのメモリを超えることはできません。
- タスク内のコンテナの総 memory は、タスクサイズ で指定した cpu を超えることはできません。
- memoryReservation
- memoryReservation はコンテナに確保する最低限のメモリ量を指定します。
- 設定した値を超えるメモリが必要な場合は、空きメモリを自動で割り当てます。ただし、memory で指定した値まで。
- タスクサイズ memory ≧ コンテナ定義 memory ≧ コンテナ定義 memoryReservation
- cpu
- タスク内のコンテナの総 cpu は、タスクサイズ で指定した cpu を超えることはできません。
memoryReservation(ソフト制限)と memory(ハード制限)の組み合わせ
memoryReservation
と memory
のパラメータは指定有無などの組み合わせによって割り当てが異なります。
memoryReservation(ソフト制限) | memory(ハード制限) | 予約メモリ~上限メモリ |
---|---|---|
未指定 | 3072 MiB | 3072 MiB ~ 3072 MiB |
2048 MiB | 未指定 | 2048 MiB ~ タスクサイズの memory / EC2 のメモリ |
2048 MiB | 3072 MiB | 2048 MiB ~ 3072 MiB |
ECS クラスタ作成手順
-
コンテナイメージの作成
-
コンテナイメージを ECR に Push
-
クラスター作成
aws ecs create-cluster --cluster-name fargate-cluster
-
タスク定義の作成
aws ecs register-task-definition --cli-input-json file://$HOME/tasks/fargate-task.json
-
サービスの作成
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
AWS Copilot
AWS Cpilot(コパイロット)とは、Amazon ECS CLI の後継にあたるもので、コンテナ化されたアプリケーション用のコマンドラインインターフェイスです。
コマンド1つといくつかの設定で、可用性を考慮した構成や LB の構築、設定などを行ってくれるというものです。
詳しい使い方はこちら。
Discussion