Как я могу запускать команды в работающем контейнере в AWS ECS, используя Fargate
Если я запускаю контейнер в AWS ECS с использованием EC2, я могу получить доступ к запущенному контейнеру и выполнить любую команду.
то есть.docker exec -it <containerid> <command>
Как выполнить команды в работающем контейнере или в контейнере доступа в AWS ECS с помощью Fargate?
4 ответа
С Fargate вы не получите доступ к базовой инфраструктуре, поэтому docker exec
не представляется возможным. В документации явно не упоминается об этом, но это упоминается в презентации Deep Dive в AWS Fargate от Amazon, где это упоминается на слайде 19:
Некоторые предостережения: невозможно выполнить exec в контейнер или получить доступ к базовому хосту (это тоже хорошо)
Есть также некоторое обсуждение этого открытого вопроса в github-проекте ECS CLI.
Вы можете попробовать запустить SSH-сервер внутри контейнера, чтобы получить доступ, но я не пробовал или сталкивался с кем-то, кто делал это. Это также не кажется хорошим подходом, поэтому вы ограничены там.
Вам необходимо указать «Роль задачи» для определения задачи (это отличается от «Роли выполнения задачи»). Это можно сделать, сначала зайдя в IAM
Создание роли IAM
- IAM > роли > создать роль
- пользовательская политика доверия > копировать + вставить
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- Добавить разрешение > Создать политику
- JSON > заменить YOUR_REGION_HERE & YOUR_ACCOUNT_ID_HERE & CLUSTER_NAME > скопировать + вставить
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"logs:DescribeLogGroups"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:DescribeLogStreams",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:YOUR_REGION_HERE:YOUR_ACCOUNT_ID_HERE:log-group:/aws/ecs/CLUSTER_NAME:*"
}
]
}
- Дайте ему имя
- вернуться к Добавить разрешения> поиск по имени> проверить> Далее
- Дайте имя роли > создайте роль
ЭКС новая задача
- вернуться в ECS > перейти к определению задачи и создать новую версию
- выберите новую роль для «Роли задачи» (отличной от «Роли выполнения задачи»)> обновить определение задачи
- перейдите к своей службе> обновить> убедитесь, что установлена последняя версия> завершить обновление службы
- текущую задачу, и она должна автоматически предоставить вашей новой задаче новую роль.
- Попробуйте еще раз
Команды, которые я использовал для выполнения
позволяет выполнить команду
aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --region REGION --enable-execute-command --force-new-deployment
добавляет ARN в среду для более легкого cli. Предполагается, что для службы запущена только 1 задача, в противном случае просто вручную перейдите в ECS, возьмите arn и установите их для своего cli.
TASK_ARN=$(aws ecs list-tasks --cluster CLUSTER_NAME --service SERVICE_NAME --region REGION --output text --query 'taskArns[0]')
посмотреть задание,
aws ecs describe-tasks --cluster CLUSTER_NAME --region REGION --tasks $TASK_ARN
исполнять в
aws ecs execute-command --region REGION --cluster CLUSTER_NAME --task $TASK_ARN --container CONTAINER --command "sh" --interactive
AWS Fargate - это управляемый сервис, и имеет смысл не разрешать доступ к контейнерам. Если вам нужно устранить неполадки с контейнером, вы всегда можете увеличить уровень журнала вашего приложения, работающего в контейнерах. Лучшие практики по работе с контейнерами говорят
"Контейнеры Docker на самом деле неизменяемы. Это означает, что работающий контейнер никогда не меняется, потому что в случае, если вам нужно его обновить, лучше всего создать новый контейнер с обновленной версией вашего приложения и удалить старый".
Надеюсь, это поможет.
По состоянию на 16 марта 2021 года AWS не представила ECS Exec, которую можно использовать для запуска команды в контейнере, работающем в EC2 или Fargate.URL будет доступен по адресу https://aws.amazon.com/about-aws/whats-new/2021/03/amazon-ecs-now-allows-you-to-execute-commands-in-a-container-running-on-amazon-ec2-или-aws-fargate/