Ejecución de un script al lanzar una instancia de contenedor de Linux de Amazon ECS
Es posible que tenga que ejecutar un contenedor específico en cada instancia de contenedor para tratar problemas de seguridad o de operaciones tales como la supervisión, seguridad, métricas, detección de servicios o registro.
Para ello, puede configurar sus instancias de contenedor para llamar al comando docker run con el script de datos de usuario durante el lanzamiento o en algún sistema de inicio como Upstart o systemd. Aunque este método funciona, tiene algunas desventajas ya que Amazon ECS no conoce el contenedor y no puede monitorear la CPU, la memoria, los puertos ni ningún otro recurso utilizado. A fin de garantizar que Amazon ECS pueda contabilizar correctamente todos los recursos de tareas, cree una definición de tareas para que el contenedor las ejecute en las instancias de contenedor. A continuación, utilice Amazon ECS para ubicar la tarea en el momento del lanzamiento con los datos de usuario de Amazon EC2.
En el siguiente procedimiento, el script de datos de usuario de Amazon EC2 utiliza la API de introspección de Amazon ECS para identificar la instancia de contenedor. A continuación, utiliza la AWS CLI y el comando start-task para ejecutar una tarea especificada en sí mismo durante el inicio.
Para iniciar una tarea en el momento del lanzamiento de una instancia de contenedor
-
Modifique el rol de IAM
ecsInstanceRole
para añadir permisos para la operaciónStartTask
de la API. Para obtener más información, consulte Modificación de un rol en la Guía del usuario de AWS Identity and Access Management. -
Lance una o más instancias de contenedor mediante la AMI de Amazon Linux 2 optimizada para Amazon ECS. Lance nuevas instancias de contenedor y utilice el siguiente script de ejemplo en Datos de usuario de EC2. Reemplace
your_cluster_name
por el clúster de la instancia de contenedor en el que desea registrarse ymy_task_def
por la definición de tarea que desea ejecutar en la instancia en el momento del lanzamiento.Para obtener más información, consulte Lanzamiento de una instancia de contenedor de Linux de Amazon ECS.
nota
El contenido multiparte de MIME a continuación utiliza un script de shell para establecer valores de configuración e instalar paquetes. También utiliza un trabajo systemd para iniciar la tarea después de la ejecución del servicio ecs y una vez que la API de introspección está disponible.
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==-- -
Compruebe que sus instancias de contenedor se lancen en el clúster correcto y que sus tareas se hayan iniciado.
Abra la consola en https://console.aws.amazon.com/ecs/v2
. -
En la barra de navegación, seleccione la región en la que se encuentra el clúster.
-
En el panel de navegación, seleccione Clusters y seleccione el clúster que aloja sus instancias de contenedor.
-
En la página Clúster, elija Tareas y, a continuación, elija las tareas.
Cada instancia de contenedor que lanzó debe tener la tarea ejecutándose en ella.
Si no ve las tareas, puede iniciar sesión en sus instancias de contenedor con SSH y comprobar la información de depuración del archivo
/var/log/ecs/ecs-start-task.log
.