☕️

ecspresso advent calendar 2020 day 3 - 既存ECSサービスの取り込み

2020/12/03に公開

Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 3日目です。

既存サービスの取り込み

ECS サービスをデプロイするためには、クラスタの他に、タスクとサービスの定義が必要です。ecspresso では、タスクとサービスの定義を AWS CLI で扱える形式と同様のJSONファイルで行います。

これらは複雑な構造を持ったJSONで、初心者が一から手で書いていくのは難しいため、ecspresso では既に動作している ECS サービスの情報を元に設定と定義ファイルを生成する機能があります。

ecspresso init

既存サービスから設定ファイルを生成するコマンドが init です。

$ ecspresso init --help
usage: ecspresso init --region=REGION --service=SERVICE [<flags>]

create service/task definition files by existing ECS service

Flags:
  --help               Show context-sensitive help (also try --help-long and --help-man).
  --config=CONFIG      config file
  --debug              enable debug log
  --region=REGION      AWS region name
  --cluster="default"  cluster name
  --service=SERVICE    service name
  --task-definition-path="ecs-task-def.json"  
                       output task definition file path
  --service-definition-path="ecs-service-def.json"  
                       output service definition file path

それでは、実際に ECS サービスを設定ファイルに落とし込んでいきましょう。ここでは Fargate を使用した Amazon ECS の開始方法 を参照して、Amazon ECS コンソールの初回実行ウィザード で作成した ECS サービスを使用します。

credential の設定

ecspresso はAWSにアクセスするために一般的な環境変数から認証情報を取得します。

最低限必要な値: AWS_REGION 使用するリージョン名(例: ap-northeast-1)

AWS CLI 用の設定ファイル (~/.aws/config, ~/.aws/credentials) が存在する場合は、それを自動的に利用します。設定ファイルに profile が定義されている場合は AWS_SDK_LOAD_CONFIG=trueAWS_PROFILE に profile 名を指定することで、その profile の認証情報を利用できます。

init を実行する

--config, --region, --cluster, --service を、既存 ECS サービスの情報に合わせて指定して実行します。

$ ecspresso init --config config.yaml --region ap-northeast-1 --cluster ecspresso-demo --service nginx-service
2020/12/03 11:47:12 nginx-service/ecspresso-demo save service definition to ecs-service-def.json
2020/12/03 11:47:12 nginx-service/ecspresso-demo save task definition to ecs-task-def.json
2020/12/03 11:47:12 nginx-service/ecspresso-demo save config to config.yaml

正常に終了すると、3つのファイルが生成されます。ecspresso ではこのファイルを使用して ECS サービスとタスクをコードで管理します。
リポジトリでコードを管理することで、ECS サービスとタスクの構成変更をレビューしたり、履歴を管理できるようになります。

ecspresso 設定ファイル config.yaml

YAML 形式です。region, cluster, service名, サービスとタスク定義ファイルのファイル名などを設定します。

region: ap-northeast-1
cluster: ecspresso-demo
service: nginx-service
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: 10m0s
plugins: []
appspec: null

ecs-service-def.json

ECS サービスの構成を定義する JSON 形式のファイルです。ネットワーク(Subnet, SecurtyGroup)やロードバランサーの設定が記述されています。

{
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": false,
      "rollback": false
    },
    "maximumPercent": 200,
    "minimumHealthyPercent": 100
  },
  "desiredCount": 1,
  "enableECSManagedTags": false,
  "healthCheckGracePeriodSeconds": 0,
  "launchType": "FARGATE",
  "loadBalancers": [
    {
      "containerName": "nginx",
      "containerPort": 80,
      "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/EC2Co-Defau-SA0YF35VBLCJ/b491afabf44765de"
    }
  ],
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "assignPublicIp": "ENABLED",
      "securityGroups": [
        "sg-043eab2d606362f03"
      ],
      "subnets": [
        "subnet-0089ed3e1bdff1fc9",
        "subnet-0d750adbd139f411d"
      ]
    }
  },
  "placementConstraints": [],
  "placementStrategy": [],
  "platformVersion": "LATEST",
  "schedulingStrategy": "REPLICA",
  "serviceRegistries": []
}

ecs-task-def.json

ECS タスク定義 の JSON 形式ファイルです。タスクに含まれるコンテナ(イメージ、実行コマンド、環境変数など)の情報や、タスクに割り当てる CPU, Memory などの情報が記述されています。

{
  "containerDefinitions": [
    {
      "command": [],
      "cpu": 256,
      "entryPoint": [],
      "environment": [],
      "essential": true,
      "image": "nginx:latest",
      "links": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/first-run-task-definition",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "memoryReservation": 512,
      "mountPoints": [],
      "name": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "volumesFrom": []
    }
  ],
  "cpu": "256",
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "family": "first-run-task-definition",
  "memory": "512",
  "networkMode": "awsvpc",
  "placementConstraints": [],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "volumes": []
}

取り込みはこれでおしまいです!

ecspresso init を実行し、既存の ECS サービスの構成をファイルに落とし込むことができました。

4日目はこれらのファイルを修正して、変更をデプロイする方法について説明します。

https://zenn.dev/fujiwara/articles/b5cb8bc64c83a6c8ca12

Discussion