Execução de um script ao iniciar uma instância de contêiner do Linux no Amazon ECS
Talvez seja necessário executar um contêiner específico em cada instância de contêiner para lidar com operações ou questões de segurança, como monitoramento, segurança, métricas, descoberta de serviços ou registros em log.
Para fazer isso, você pode configurar suas instâncias de contêiner de forma que elas chamem o comando docker run com esse script de dados de usuário na execução ou em algum sistema init como Upstart ou systemd. Quando esse método funciona, existem algumas desvantagens, pois o Amazon ECS não tem qualquer conhecimento de contêiner e não pode monitorar a CPU, a memória, as portas ou quaisquer outros recursos utilizados. Para garantir que o Amazon ECS possa assumir adequadamente todos os recursos de tarefas, crie uma definição de tarefa para que o contêiner seja executado nas instâncias de contêiner. Em seguida, use o Amazon ECS para trazer a tarefa até o momento da inicialização com dados de usuário do Amazon EC2.
No procedimento a seguir, o script de dados de usuário do Amazon EC2 usa a API de introspecção do Amazon ECS para identificar a instância de contêiner. Em seguida, ele usa a AWS CLI e o comando start-task para executar uma tarefa específica nele durante o startup.
Para iniciar uma tarefa no momento da execução da instância de contêiner
-
Modifique a função do IAM
ecsInstanceRole
para adicionar permissões para a operação de APIStartTask
. Para obter mais informações, consulte Modificar um perfil no Guia do usuário do AWS Identity and Access Management. -
Inicie uma ou mais instâncias de contêiner usando a AMI do Amazon Linux 2 otimizada para o Amazon ECS. Inicie novas instâncias de contêiner e use o script de exemplo apresentado a seguir nos dados do usuário do EC2. Substitua
your_cluster_name
pelo cluster no qual a instância de contêiner será registrada emy_task_def
pela definição de tarefa a ser executada na instância na inicialização.Para ter mais informações, consulte Iniciar uma instância de contêiner do Linux do Amazon ECS.
nota
O conteúdo MIME de várias partes abaixo usa um script de shell para definir valores de configuração e instalar os pacotes. Ele também usa um trabalho systemd para iniciar a tarefa depois que o serviço ecs estiver em execução e a API de introspecção ficar disponível.
Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Specify the cluster that the container instance should register into cluster=
your_cluster_name
# Write the cluster configuration variable to the ecs.config file # (add any other configuration variables here also) echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config START_TASK_SCRIPT_FILE="/etc/ecs/ecs-start-task.sh" cat <<- 'EOF' > ${START_TASK_SCRIPT_FILE} exec 2>>/var/log/ecs/ecs-start-task.log set -x # Install prerequisite tools yum install -y jq aws-cli # Wait for the ECS service to be responsive until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the container instance ARN and AWS Region from instance metadata instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' ) region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}') # Specify the task definition to run at launch task_definition=my_task_def
# Run the AWS CLI start-task command to start your task on this container instance aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region EOF # Write systemd unit file UNIT="ecs-start-task.service" cat <<- EOF > /etc/systemd/system/${UNIT} [Unit] Description=ECS Start Task Requires=ecs.service After=ecs.service [Service] Restart=on-failure RestartSec=30 ExecStart=/usr/bin/bash ${START_TASK_SCRIPT_FILE} [Install] WantedBy=default.target EOF # Enable our ecs.service dependent service with `--no-block` to prevent systemd deadlock # See https://github.com/aws/amazon-ecs-agent/issues/1707 systemctl enable --now --no-block "${UNIT}" --==BOUNDARY==-- -
Verifique se as suas instâncias de contêiner são executadas no cluster correto e se as suas tarefas foram iniciadas.
Abra o console em https://console.aws.amazon.com/ecs/v2
. -
Na barra de navegação, selecione a região em que seu cluster está localizado.
-
No painel de navegação, escolha Clusters e selecione o cluster que hospeda as suas instâncias de contêiner.
-
Na página Cluster, escolha Tarefas e, em seguida, escolha suas tarefas.
Cada instância de contêiner que você executou deve ter sua tarefa em execução nela.
Se você não vir suas tarefas, faça login em suas instâncias de contêiner com SSH e verifique o arquivo
/var/log/ecs/ecs-start-task.log
para obter informações de depuração.