ECS on Fargateとは何か
はじめに
AWSでサービスを展開する際に、ECS on Fargateの選択肢は少なくないでしょう。
今回はECS on Fargateとは何か?をAWS公式ドキュメントを手がかりに整理していきます。
本記事は前回の記事の内容を前提にしている箇所があります。未読の方は、あわせてご覧いただけると幸いです。
ECS on Fargateとは?
AWSの解説
Amazon ECS の AWS Fargateには次のように記述されています。
Fargate 起動タイプを使用してタスクやサービスを実行する場合、アプリケーションをコンテナにパッケージ化し、CPU とメモリ要件を指定して、ネットワークとIAM ポリシーを定義して、アプリケーションを起動します。
Fargate起動タイプでは「コンテナ化したアプリケーション」を、CPU/メモリ・ネットワーク・IAMポリシーを指定するだけで実行できる、ということがわかります。
タスク定義
タスク定義とは?
Fargateを使用していると、タスク定義という概念を理解することは避けては通れません。
タスク定義とは簡単にいうと、そのタスクに対してどのようなリソース(CPUやメモリ)やパラメータ(環境変数やネットワーク情報)を与えるかをJSONで記述したものです。
タスク定義については、Amazon ECS のタスク定義の例には、次のような記述例があります。
{
"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": "public.ecr.aws/docker/library/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"
]
}
containerDefinitionsで、コンテナ起動時のコマンドやエントリーポイント、ポートなどを指定して、cpuやmemoryでリソース設定を行います。
起動タイプ
AWSのFargate 起動タイプでの Amazon ECS タスク定義パラメータを参照します。
FargateでECSを起動するにはrequiresCompatibilitiesにFARGATEと指定する必要があります。
上記のJSONだと、最後のあたりの
"requiresCompatibilities": [
"FARGATE"
]
がそれに該当します。
設定できる・できないパラメータ
Fargate 起動タイプでの Amazon ECS タスク定義の違いを参照すると、定義できないパラメータや、定義が必要なパラメータがあります。
定義できないものには、gpuやdnsSearchDomainsなどがあります。
定義するものとして、FargateではruntimePlatform.operatingSystemFamilyが必須(デフォルトではLINUX)です。
cpuとmemoryはタスクレベルで必須で、利用できる組み合わせはAWS側で定められています。
ネットワークオプション
Fargate 起動タイプの Amazon ECS タスクのネットワークオプションを参照します。
Fargate = networkMode: awsvpcが前提で、タスクごとに ENIが割り当てられます。
プライベートサブネットではプライベートIPのみ、パブリックサブネットではオプションでパブリックIPが割り当て可能です。
各Fargateタスクに紐づくENIには、セキュリティグループを関連付けます。
ALBから443の通信のみを受け付けたり、RDSへの接続のみ許可する場合などに使用できます。
IAM:タスクロールとタスク実行ロール
タスクロール
Amazon ECS タスクの IAM ロールでは、タスクロールは下記のように書かれています。
Amazon ECS タスクには IAM ロールを関連付けることができます。IAM ロールで付与されるアクセス許可は、タスクで実行中のコンテナに対し発行されます。このロールにより、(コンテナ上で実行) アプリケーションコードが他の AWS サービスを使用できるようになります。タスクロールは、アプリケーションが Amazon S3 などの他の AWS サービスにアクセスするときに必要です。
タスクロールはコンテナ内で使用する権限になります。例えば、FargateからRDSやS3に通信をしたい場合は、タスクロールに作成したIAMロールをアタッチする必要があります。
タスク実行ロール
一方でタスク実行ロールは、Amazon ECS タスク実行IAM ロールより、下記のような説明がありました。
タスク実行ロールは、ユーザーに代わって AWS API コールを実行するためのアクセス許可を Amazon ECS コンテナと Fargate エージェントに付与します。タスク実行 IAM ロールは、タスクの要件に応じて必要です。さまざまな目的とサービスのタスク実行ロールを、アカウントに複数関連付けることができます。
例えば、ECRからイメージのpull、CloudWatch Logsへの出力、Secrets/SSMの読取などを行いたい場合、タスク実行ロールにIAMポリシーをアタッチします。
ログとモニタリング
ECSを使用すると、AWSマネジメントコンソールでログやメトリクスを確認することができます。
Amazon ECS タスク実行IAM ロールより、下記がありました。
awslogs ログドライバーを使用して CloudWatch Logs にコンテナログを送信します。詳細については、「Amazon ECS ログを CloudWatch に送信する 」を参照してください。
Amazon ECS ログを CloudWatch に送信するより
タスクのコンテナを設定して CloudWatch Logs にログ情報を送信できます。タスクで Fargate 起動タイプを使用すると、コンテナからログを表示できます。
まとめ
前回の記事では、コンテナはLinuxカーネル上のプロセスであり、namespaceやcgroupsによって制御されていることを確認しました。
ECS on Fargateは、そのコンテナを動かすためのホストOSやカーネル、物理マシンの管理を AWSに委譲しつつ、タスクという単位で CPU/メモリ/ネットワーク/IAM(タスクロール/タスク実行ロール)をJSONで定義されるタスク定義で設定・設計できる実行基盤と考えることができます。
前回の記事で確認したコンテナの考え方がAWS上ではFargateというサービスで提供されています。
学習の補助になれば幸いです。
参考
Amazon ECS の AWS Fargate
Amazon ECS のタスク定義の例
Fargate 起動タイプでの Amazon ECS タスク定義パラメータ
Fargate 起動タイプでの Amazon ECS タスク定義の違い
Fargate 起動タイプの Amazon ECS タスクのネットワークオプション
Amazon ECS タスクの IAM ロール
Amazon ECS タスク実行IAM ロール
Amazon ECS ログを CloudWatch に送信する
Discussion