运行已附加(未分离)的 AWS ECS 任务

问题描述 投票:0回答:2

是否有简单的方法来运行附加的ECS任务或仅在容器运行时跟踪日志(即显示所有关联日志后分离)?

使用 AWS CLI (1.17.0) 和 ecs-cli (1.21.0),我已经非常接近以下两个命令:

aws ecs run-task --cluster "mycluster" --task-definition testhelloworldjob --launch-type FARGATE --network-configuration etc.etc.etc.
        
ecs-cli logs --task-id {TASK_ID_HERE_FROM_OUTPUT_OF_PREVIOUS_COMMAND} --follow 

我目前对上述方法有两个问题:

  1. 存在一个竞争条件,即当任务处于“running”前状态时日志不可用。不是等待日志存在,而是立即抛出错误。
    即使在等待任务处于运行状态并发出 
  2. ecs-cli logs
  3. 之后,即使任务完成并处于运行后状态,该命令也拒绝分离。
    
    
  4. 对于第一个问题,我可以在调用日志之前进行轮询,直到出现激活/待处理状态。对于第二个问题,我可以起草某种类型的线程调用,在相关容器不再运行后,该调用将轮询以停止日志的跟踪......但是必须有一种更简单的方法吗?

澄清一下,我来自许多其他容器编排工具/技术,它们似乎非常无缝地支持这一点。以下是一些工具及其相关命令的示例,它们可以产生我想要的结果:

Docker CLI:

ecs-cli logs

Docker-Compose 
Yaml

docker run hello-world

K8 Kubectl 
Yaml

docker-compose up


amazon-web-services containers amazon-ecs
2个回答
0
投票
我认为

kubectl apply -f ./hello-k8.yaml && kubectl logs --follow hello-world 是目前最好的选择。


除此之外,您可以将 AWS ECS 任务的日志驱动程序更改为 

ecs-cli

,然后在通过 SSH 连接到运行该任务的 EC2 容器实例后从终端查看日志文件。

您可以做的另一件事是通过 SSH 连接到之前运行的 EC2 容器实例,然后使用 

syslog

在其中自行运行该 AWS ECS 任务的容器,一旦测试完成,您可以停止并删除该任务容器,然后通过 AWS ECS 启动该任务。

注意:您可以使用 AWS SSM Session Manager 以避免使用 EC2 密钥对并添加 SSH 入站规则。


0
投票

使用
    docker run
  1. 进行阻塞,直到创建日志组
    使用 
  2. aws ecs wait tasks-running
  3. 循环轮询新日志消息,直到任务停止
    
    
  4. --since
我试图使其易于调用,因此它做了一些工作来确定日志组,如果您已经知道它,则可以将其删除。你可以这样称呼它

# Prints logs like 'tail -f' for an ecs task function tail_task_logs { local TASKID=$1 local CLUSTER local TASK_DEFINITION local LGROUP CLUSTER=$(echo "$TASKID" | cut -d/ -f1,2 | sed 's/task/cluster/') # Lookup the log group name TASK_DEFINITION=$(aws ecs describe-tasks \ --cluster "$CLUSTER" \ --tasks "$TASKID" \ --query 'tasks[0].taskDefinitionArn' \ --output text) LGROUP=$(aws ecs describe-task-definition \ --task-definition "$TASK_DEFINITION" \ --query 'taskDefinition.containerDefinitions[0].logConfiguration.options."awslogs-group"' \ --output text) # Start tailing once container is running SINCE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") echo "Waiting for task to start.." aws ecs wait tasks-running \ --cluster "$CLUSTER" \ --tasks "$TASKID" STATUS="None" while [[ $STATUS == "None" ]]; do # print new messages NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ") aws logs tail "$LGROUP" --since "$SINCE" SINCE="$NOW" sleep 2 # Check if container is still running STATUS=$(aws ecs describe-tasks \ --cluster "$CLUSTER" \ --tasks "$TASKID" \ --query 'tasks[0].stopCode' \ --output text) done # Print final messages aws logs tail "$LGROUP" --since "$SINCE" echo "Container exited: $STATUS" }

您也许可以使用 
tail_task_logs "some-task-id"

进行简化,但我想要一个没有额外依赖项的版本。

    

© www.soinside.com 2019 - 2024. All rights reserved.