学習備忘録

よく忘れてしまうのをここにメモしておく

ECSでのタスク実行方法

課題

  • fargateで運用している場合、sshで接続してコマンドを実行ということができない。そのため外部からツールを利用して実行しなければいけない

対処法

  • 今回は例としてseedを考える

  • seed用のタスク定義を作成する.

{
    "networkMode": "awsvpc",
    "cpu": "256",
    "memory": "512",
    "requiresCompatibilities": [ "FARGATE"],
    "executionRoleArn": "arn:aws:iam::467531687456:role/ecs_task_execution_role",
    "containerDefinitions":
    [
      {
        "name": "seed",
        "image": "467531687456.dkr.ecr.ap-northeast-1.amazonaws.com/match-project-app-development:latest",
        "essential": true,
        "entryPoint": ["/bin/sh"],
        "command": ["-c", "php artisan db:seed --class=DatabaseSeeder"],
        "environment": [
          {
            "name": "APP_NAME",
            "value": "match-project"
          },
          {
            "name": "APP_ENV",
            "value": "development"
          },
          {
            "name": "APP_DEBUG",
            "value": "true"
          },
          {
            "name": "LOG_CHANNEL",
            "value": "cloudwatch"
          },
          {
            "name": "CLOUDWATCH_LOG_RETENTION",
            "value": "60"
          },
          {
            "name": "DB_CONNECTION",
            "value": "mysql"
          },
          {
            "name": "DB_HOST",
            "value": "match-project-dev-aurora-cluster.cluster-clfk8ycueurb.ap-northeast-1.rds.amazonaws.com"
          },
          {
            "name": "DB_PORT",
            "value": "3306"
          },
          {
            "name": "DB_USERNAME",
            "value": "organizer"
          },
          {
            "name": "DB_PASSWORD",
            "value": "pass1234"
          },
          {
            "name": "DB_DATABASE",
            "value": "lara_match"
          },
          {
            "name": "BROADCAST_DRIVER",
            "value": "log"
          },
          {
            "name": "CACHE_DRIVER",
            "value": "redis"
          },
          {
            "name": "SESSION_DRIVER",
            "value": "redis"
          },
          {
            "name": "SESSION_LIFETIME",
            "value": "10080"
          },
          {
            "name": "REDIS_HOST",
            "value": "$REDIS_HOST_DEV"
          },
          {
            "name": "REDIS_PASSWORD",
            "value": "null"
          },
          {
            "name": "REDIS_PORT",
            "value": "6379"
          },
          {
            "name": "AWS_BUCKET",
            "value": "match-project.dev.uploads"
          },
          {
            "name": "MAIL_DRIVER",
            "value": "ses"
          },
          {
            "name": "MAIL_FROM_ADDRESS",
            "value": "tmp"
          },
          {
            "name": "MAIL_FROM_NAME",
            "value": "dev"
          },
          {
            "name": "SES_REGION",
            "value": "us-east-1"
          },
          {
            "name": "ADMIN_HTTPS",
            "value": "true"
          }
        ]
      }
    ]
  }
aws ecs register-task-definition --family match-project-dev-seed --cli-input-json file://seed-task-definition.json --region ap-northeast-1
  • あとは以下を状況に合わせて変更して、実行
SUBNETS=$(aws ecs describe-services --cluster match-project-dev --service app --region ap-northeast-1 --query "services[0].networkConfiguration.awsvpcConfiguration.subnets" --output text | awk '{printf "%s,%s",$1,$2}')
SECURITY_GROUPS=$(aws ecs describe-services --cluster match-project-dev --service app --region ap-northeast-1 --query "services[0].networkConfiguration.awsvpcConfiguration.securityGroups" --output text)

aws ecs run-task --launch-type FARGATE --cluster match-project-dev --task-definition match-project-dev-migrate --region ap-northeast-1 --count 1 --network-configuration "awsvpcConfiguration={subnets=[$SUBNETS],securityGroups=[$SECURITY_GROUPS],assignPublicIp=ENABLED}" --query "tasks[0].taskArn" --output text