見出し画像

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とか使ったらいい


vimで書き換えた例

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

そしたら

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

確認しよう


1件が実行中になった


このように、タスク定義が更新され、またCPU/メモリーが正しく狙った値になっている事が確認できるだろう。



次回は中級以上の章になるが、execute-commandを行ってみよう
















いいなと思ったら応援しよう!