

# Execução de um script ao iniciar uma instância de contêiner do Linux no Amazon ECS
<a name="start_task_at_launch"></a>

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**

1. Modifique a função do IAM `ecsInstanceRole` para adicionar permissões para a operação de API `StartTask`. Para obter mais informações, consulte [Atualizar permissões para um perfil](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_update-role-permissions.html) no *Guia do usuário do AWS Identity and Access Management*.

1. 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\$1cluster\$1name* pelo cluster no qual a instância de contêiner será registrada e *my\$1task\$1def* pela definição de tarefa a ser executada na instância na inicialização. 

   Para obter mais informações, consulte [Iniciar uma instância de contêiner do Linux do Amazon ECS](launch_container_instance.md).
**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==--
   ```

1. Verifique se as suas instâncias de contêiner são executadas no cluster correto e se as suas tarefas foram iniciadas.

   1. Abra o console em [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2).

   1. Na barra de navegação, selecione a região em que seu cluster está localizado.

   1. No painel de navegação, escolha **Clusters** e selecione o cluster que hospeda as suas instâncias de contêiner.

   1. 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.