
ECS Fargate 速攻awsコマンド操作
の続き
本稿で取り扱う事
AWS CloudShellを使ったawsコマンドの発行
awsコマンドにてサービスの一覧を取得できる
当該サービスのタスク定義のrevをawsコマンドから更新できる
当該サービスのタスクカウントをawsコマンドから更新できる
AWS CloudShellを使う


aws ecs list-task-definitions
と入力すると
[cloudshell-user@ip-10-134-7-236 ~]$ aws ecs list-task-definitions
{
"taskDefinitionArns": [
"arn:aws:ecs:ap-northeast-1:****:task-definition/SimpleWebTask:1"
]
}
などと出てくるかどうか。これはシェルを実行しているユーザーの権限による。割と強めの権限の場合、更新系を操作する場合にとくに注意が必要だ。
タスク定義の内容をjsonで出す
aws ecs describe-task-definition --task-definition SimpleWebTask
結果
aws ecs describe-task-definition --task-definition SimpleWebTask
{
"taskDefinition": {
"taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:****:task-definition/SimpleWebTask:1",
"containerDefinitions": [
{
"name": "WebContainer",
"image": "public.ecr.aws/docker/library/httpd:latest",
"cpu": 0,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp",
"name": "webcontainer-80-tcp",
"appProtocol": "http"
}
],
など。これを弄る場合
aws ecs describe-task-definition --task-definition SimpleWebTask > SimpleWebTask.json
などとしたいところだが
aws ecs register-task-definition --cli-input-json file://SimpleWebTask.json
でインポートしたそのままを登録しようとすると
[cloudshell-user@ip-10-134-7-236 ~]$ aws ecs register-task-definition --cli-input-json file://SimpleWebTask.json
Parameter validation failed:
Missing required parameter in input: "family"
Missing required parameter in input: "containerDefinitions"
Unknown parameter in input: "taskDefinition", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration, inferenceAccelerators, ephemeralStorage, runtimePlatform
と言われる。これは余計な情報が付いているからだ。
これは以下のようにすれば登録可能な形式になる
aws ecs describe-task-definition --task-definition SimpleWebTask | jq '.taskDefinition | del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' > SimpleWebTask.json
aws ecs register-task-definition --cli-input-json file://SimpleWebTask.json
ここまでのまとめ
AWSコマンドを使うには
適切な権限を持つIAMユーザーまたはロールでCloudShellを利用する
タスク定義を一覧出力するには
aws ecs list-task-definitions
タスク定義の中身をjsonで確認するには
aws ecs describe-task-definition --task-definition <タスク定義名>
タスク定義の中身を登録可能なjsonにしてリダイレクトするには
aws ecs describe-task-definition --task-definition <タスク定義名> | jq '.taskDefinition | del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' > <新しいファイル名>.json
タスク定義を登録するには
aws ecs register-task-definition --cli-input-json file://<新しいファイル名>.json
JSONを編集してみる
まず、登録可能なjsonとして出力してきたものを以下に貼り付けておく
{
"containerDefinitions": [
{
"name": "WebContainer",
"image": "public.ecr.aws/docker/library/httpd:latest",
"cpu": 0,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp",
"name": "webcontainer-80-tcp",
"appProtocol": "http"
}
],
"essential": true,
"environment": [],
"environmentFiles": [],
"mountPoints": [],
"volumesFrom": [],
"ulimits": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/SimpleWebTask",
"mode": "non-blocking",
"awslogs-create-group": "true",
"max-buffer-size": "25m",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
},
"secretOptions": []
},
"systemControls": []
}
],
"family": "SimpleWebTask",
"executionRoleArn": "arn:aws:iam::****:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"volumes": [],
"placementConstraints": [],
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "1024",
"memory": "3072"
}
スペックを落としてみる
SimpleWebTask.json を編集する
"cpu": "256",
"memory": "512"
に変更する。サーバー上で書き換える事ができるのであればvmとか使ったらいい

けどそうでない場合でもアップロードとかダウンロードとかをサポートしているのでうまいことやる(上書きはできないっぽい)

そしたら
aws ecs register-task-definition --cli-input-json file://SimpleWebTask.jso
とかで登録する。
ただしく登録できたのか、一応webから確認してみよう

このようにrevが上がって(今はrev:3、それぞれの環境で違うだろう)、スペックがダウンしているのがわかる。
ここまでのまとめ
タスク定義はawsコマンドとjsonを通じてほぼ自由に書き換えできるからやろう。
サービスの更新
以下のコマンドでやる
aws ecs list-services --cluster <クラスター名>
実行例
[cloudshell-user@ip-10-134-7-236 ~]$ aws ecs list-services --cluster QuickStartCluster
{
"serviceArns": [
"arn:aws:ecs:ap-northeast-1:****:service/QuickStartCluster/SimpleWebService"
]
}
SimpleWebServiceが見えた
そしたら詳細を確認する
aws ecs describe-services --cluster <クラスター名> --services <サービス名>
実行例
[cloudshell-user@ip-10-134-7-236 ~]$ aws ecs describe-services --cluster QuickStartCluster --services SimpleWebService
{
"services": [
{
"serviceArn": "arn:aws:ecs:ap-northeast-1:****:service/QuickStartCluster/SimpleWebService",
"serviceName": "SimpleWebService",
"clusterArn": "arn:aws:ecs:ap-northeast-1:****:cluster/QuickStartCluster",
"loadBalancers": [],
"serviceRegistries": [],
"status": "ACTIVE",
"desiredCount": 0,
"runningCount": 0,
のようなjsonが取れる
タスク定義を更新する
aws ecs update-service --cluster QuickStartCluster --service SimpleWebService --task-definition SimpleWebTask:3
今回の場合はこんな感じ。
タスク数を更新する
今0にしてサービスが実質動作していない状態にあるからタスクの数を0から1にする
aws ecs update-service --cluster QuickStartCluster --service SimpleWebService --desired-count 1
確認しよう


このように、タスク定義が更新され、またCPU/メモリーが正しく狙った値になっている事が確認できるだろう。
次回は中級以上の章になるが、execute-commandを行ってみよう