Задача: запустить WordPress на AWS ECS.
Создание кластера и общие сведения по AWS ECS есть тут>>>.
Далее будет рассмотрено:
- создание кластера;
- создание EC2 интанса;
- добавление task definition;
- создание task;
- запуск задачи с 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 [email protected] -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 | +--------------------+
Готово.
