Содержание
Подготовка
Добавляем профайл:
$ aws configure --profile tag-ecs AWS Access Key ID [None]: AKI***FJQ AWS Secret Access Key [None]: 6T/a***4sG Default region name [None]: eu-central-1 Default output format [None]: json
Создаём кластер:
[simterm]
$ aws ecs create-cluster --cluster-name tag-ecs-poc --profile tag-ecs
{
"cluster": {
"clusterArn": "arn:aws:ecs:eu-central-1:884660938610:cluster/tag-ecs-poc",
"clusterName": "tag-ecs-poc",
"status": "ACTIVE",
"registeredContainerInstancesCount": 0,
"runningTasksCount": 0,
"pendingTasksCount": 0,
"activeServicesCount": 0
}
}
[/simterm]
Создаём tag-ecs-poc.sh — user-data файл, что бы добавить инстансы в созданный кластер:
#!/bin/bash echo ECS_CLUSTER=tag-ecs-poc >> /etc/ecs/ecs.config
Находим AMI для ECS тут>>>.
Запускаем инстас:
[simterm]
$ aws ec2 run-instances --image-id ami-085e8a67 --key-name tag-ecs-poc --instance-type t2.medium --iam-instance-profile Name=ecsInstanceRole --user-data file://tag-ecs-poc.sh --profile tag-ecs
[/simterm]
Проверяем:
[simterm]
$ aws ecs list-container-instances --cluster tag-ecs-poc --profile tag-ecs
{
"containerInstanceArns": [
"arn:aws:ecs:eu-central-1:884660938610:container-instance/64a77a71-d9c4-4006-8ab3-024d7b5c04dc"
]
}
[/simterm]
Проверка
Сначала — запустим простой сервис WordPress, как описано тут>>>.
Создаём task definition — файл tag-ecs-poc-task-def.json:
{
"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"
}
Регистрируем её:
[simterm]
$ aws ecs register-task-definition --cli-input-json file://tag-ecs-poc-task-def.json --profile tag-ecs
[/simterm]
Проверяем:
[simterm]
$ aws ecs list-task-definitions --profile tag-ecs
{
"taskDefinitionArns": [
"arn:aws:ecs:eu-central-1:884660938610:task-definition/wordpress:1"
]
}
[/simterm]
Создаём тестовый сервис — tag-ecs-poc-service.json:
{
"cluster": "tag-ecs-poc",
"serviceName": "tag-ecs-poc-wp",
"taskDefinition": "wordpress:1",
"loadBalancers":[],
"desiredCount": 1
}
Запускаем его:
[simterm]
$ aws ecs create-service --cli-input-json file://tag-ecs-poc-service.json --profile tag-ecs
[/simterm]
Проверяем:
[simterm]
$ aws ecs list-services --cluster tag-ecs-poc --profile tag-ecs
{
"serviceArns": [
"arn:aws:ecs:eu-central-1:884660938610:service/tag-ecs-poc-wp"
]
}
[/simterm]
Можно перейти по URL EC2-интанса, проверить.
И проверяем сам Docker:
[simterm]
$ ssh [email protected] -i tag-ecs-poc.pem $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7819935641b5 wordpress "docker-entrypoint.sh" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp ecs-wordpress-1-wordpress-a8beafedd3ffb4b35800 c3285e2b3912 mysql "docker-entrypoint.sh" 6 minutes ago Up 6 minutes 3306/tcp ecs-wordpress-1-mysql-a6b4c59da8b8c4ef6a00 150957c398be amazon/amazon-ecs-agent:latest "/agent" 22 minutes ago Up 22 minutes ecs-agent
[/simterm]
ОК, работает — убиваем этот сервис.
Уменьшаем кол-во выполняемых им задач до нуля:
[simterm]
$ aws ecs update-service --service tag-ecs-poc-wp --desired-count 0 --cluster tag-ecs-poc --profile tag-ecs
[/simterm]
Удаляем сервис:
[simterm]
$ aws ecs delete-service --service tag-ecs-poc-wp --cluster tag-ecs-poc --profile tag-ecs
[/simterm]
Авторизация в private registry
В роли репозитория у нас используется JFrog Artifactory.
Документация ECS по авторизации — тут>>>.
Обновляем user-data, в файл tag-ecs-poc.sh добавляем авторизацию по dockercfg:
#!/bin/bash
echo ECS_CLUSTER=tag-ecs-poc >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=dockercfg >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={\"https://engineering-docker.jfrog.io/v1/\":{\"auth\":\"c3Z***FND\",\"email\":\"[email protected]\"}}" >> /etc/ecs/ecs.config
Дропаем первый тестовый инстанс:
[simterm]
$ aws ec2 terminate-instances --instance-ids i-092bb29b7cacdca5d --profile tag-ecs
[/simterm]
Запускаем инстанс:
[simterm]
$ aws ec2 run-instances --image-id ami-085e8a67 --key-name tag-ecs-poc --instance-type t2.medium --iam-instance-profile Name=ecsInstanceRole --user-data file://tag-ecs-poc.sh --profile tag-ecs
[/simterm]
Удаляем тестовый task defenition (можно не удалять, а зарегистрировать с тем же именм, получить новую ревизию):
[simterm]
$ aws ecs deregister-task-definition --task-definition arn:aws:ecs:eu-central-1:884660938610:task-definition/wordpress:1 --profile tag-ec
[/simterm]
Обновляем task defenition в tag-ecs-poc-task-def.json, добавляем уже актуальные образы:
{
"containerDefinitions": [
{
"name": "tag-api-gateway",
"links": [
"tag-producers"
],
"image": "engineering-docker.jfrog.io/api-gateway:production-rc_2017april-24",
"essential": true,
"portMappings": [
{
"containerPort": 8080,
"hostPort": 80
}
],
"memory": 500,
"cpu": 10
},
{
"name": "tag-producers",
"image": "engineering-docker.jfrog.io/producers:production-rc_2017april-24",
"cpu": 10,
"memory": 500,
"essential": true
}
],
"family": "tag-api"
}
Регистрируем её заново:
[simterm]
$ aws ecs register-task-definition --cli-input-json file://tag-ecs-poc-task-def.json --profile tag-ecs
[/simterm]
Проверяем:
[simterm]
$ aws ecs list-task-definitions --profile tag-ecs
{
"taskDefinitionArns": [
"arn:aws:ecs:eu-central-1:884660938610:task-definition/tag-api:1"
]
}
[/simterm]
В файле tag-ecs-poc-service.json обновляем сервис:
{
"cluster": "tag-ecs-poc",
"serviceName": "tag-api-ecs-poc",
"taskDefinition": "tag-api:1",
"loadBalancers":[],
"desiredCount": 1
}
Создаём его:
[simterm]
$ aws ecs create-service --cli-input-json file://tag-ecs-poc-service.json --profile tag-ecs
[/simterm]
Проверяем:
[simterm]
$ aws ecs list-services --cluster tag-ecs-poc --profile tag-ecs
{
"serviceArns": [
"arn:aws:ecs:eu-central-1:884660938610:service/tag-api-ecs-poc"
]
}
[/simterm]
И смотрим на самом EC2-инстансе:
[simterm]
[ec2-user@ip-172-31-23-159 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d842604ed55a engineering-docker.jfrog.io/api-gateway:production-rc_2017april-24 "java -Djava.security" 12 seconds ago Up 11 seconds 0.0.0.0:80->8080/tcp ecs-tag-api-1-tag-api-gateway-8ae5f8f0ddcbbfc02200 b01360b079b1 engineering-docker.jfrog.io/producers:production-rc_2017april-24 "java -Djava.security" 14 seconds ago Up 12 seconds ecs-tag-api-1-tag-producers-d2bcd09dec99a4a6f301
[/simterm]
Готово.




