AWS: запуск WordPress в ECS

Автор: | 01/12/2017
 

Задача: запустить WordPress на AWS ECS.

Создание кластера и общие сведения по AWS ECS есть тут>>>.

Далее будет рассмотрено:

  1. создание кластера;
  2. создание EC2 интанса;
  3. добавление task definition;
  4. создание task;
  5. запуск задачи с WordPress.

Кластер

Создаём кластер:

$ aws ecs create-cluster --cluster-name wordpress
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:eu-west-1:264418146286:cluster/wordpress",
        "clusterName": "wordpress",
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0
    }
}

ECS Container Instance

По умолчанию — новые интасы добавляются в кластер default.

Что бы добавить его в созданный только что кластер — создаём файл user-data с таким содержимым:

#!/bin/bash                                                                                                                                                                                                                                                                     
echo ECS_CLUSTER=wordpress >> /etc/ecs/ecs.config

AMI ID с ECS агентом можно найти тут>>>.

Запускаем 1 t2.medium:

$ aws ec2 run-instances --image-id ami-ba346ec9 --key-name my-cluster --instance-type t2.medium --iam-instance-profile Name=ecsInstanceRole --user-data file://wpdata.sh

Ждём, когда поднимется инстанс и проверяем:

$ aws ecs list-container-instances --cluster wordpress
{
    "containerInstanceArns": [
        "arn:aws:ecs:eu-west-1:264418146286:container-instance/a2de84be-5b6c-4d9c-aa16-35a1c54b2141"
    ]
}

Task definition

Далее — создаём task definition, в котором описывается два контейнера — собственно WordPress, и MySQL.

Доступ к MySQL из контейнера WordPress реализуется через Docker-links.

Создаём файл:

{ 
  "containerDefinitions": [
    { 
      "name": "wordpress",
      "links": [
        "mysql"
      ],
      "image": "wordpress",
      "essential": true,
      "portMappings": [
        { 
          "containerPort": 80,
          "hostPort": 80
        }
      ],
      "memory": 500,
      "cpu": 10
    },
    { 
      "environment": [
        { 
          "name": "MYSQL_ROOT_PASSWORD",
          "value": "dbpassword"
        }
      ],
      "name": "mysql",
      "image": "mysql",
      "cpu": 10,
      "memory": 500,
      "essential": true
    }
 ],
 "family": "wordpress"
}

Регистрируем её:

$ aws ecs register-task-definition --cli-input-json file://wp-taskdef.json
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:eu-west-1:264418146286:task-definition/wordpress:1",
        "containerDefinitions": [
            {
                "name": "wordpress",
                "image": "wordpress",
                "cpu": 10,
                "memory": 500,
                "links": [
                    "mysql"
                ],
...

Service

Далее — создаём задачу, которая будет использовать созданный task defenition:

{
   "cluster": "wordpress",         
   "serviceName": "wordpress",         
   "taskDefinition": "wordpress:1",         
   "loadBalancers":[],         
   "desiredCount": 1
}

Применяем:

$ aws ecs create-service --cli-input-json file://wp-task.json
{
    "service": {
        "serviceArn": "arn:aws:ecs:eu-west-1:264418146286:service/wordpress",
        "serviceName": "wordpress",
        "clusterArn": "arn:aws:ecs:eu-west-1:264418146286:cluster/wordpress",
        "loadBalancers": [],
        "status": "ACTIVE",
        "desiredCount": 1,
        "runningCount": 0,
        "pendingCount": 0,
        "taskDefinition": "arn:aws:ecs:eu-west-1:264418146286:task-definition/wordpress:1",
        "deploymentConfiguration": {
            "maximumPercent": 200,
            "minimumHealthyPercent": 100
...

Проверяем:

$ aws ecs list-services --cluster wordpress                 
{
    "serviceArns": [
        "arn:aws:ecs:eu-west-1:264418146286:service/wordpress"
    ]
}

После регистрации сервиса, если все условия соблюдены (например — память, указанная в task definition, не больше, чем память на запущенном EC2) — то задача будет запущена автоматически, проверяем:

$ aws ecs list-tasks --cluster wordpress
{
    "taskArns": [
        "arn:aws:ecs:eu-west-1:264418146286:task/2aebaf52-3a3b-4eba-8857-6fa70126c070"
    ]
}

Можно подключиться к инстансу, и проверить контейнеры:

$ ssh ec2-user@52.214.201.61 -i my-cluster.pem
$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                NAMES
3ada7349b274        wordpress                        "docker-entrypoint.sh"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp   ecs-wordpress-3-wordpress-f0e49284e3b4e7981300
c08ba2320280        mysql                            "docker-entrypoint.sh"   4 minutes ago       Up 4 minutes        3306/tcp             ecs-wordpress-3-mysql-ecafd7a0e9a784ffea01
2b479e53eaee        amazon/amazon-ecs-agent:latest   "/agent"                 6 minutes ago       Up 6 minutes                             ecs-agent

Или просмотреть созданные базы:

$ docker exec -ti c08ba2320280 mysql -u root -pdbpassword -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+

Готово.