Ausführen eines Skripts beim Starten einer Linux-Container-Instance von Amazon ECS
Sie müssen unter Umständen einen bestimmten Container auf jeder Container-Instance ausführen, um Vorgänge oder Sicherheitsbelange zu behandeln (z. B. Überwachung, Sicherheit, Metriken, Serviceerkennung oder Protokollierung).
Zu diesem Zweck können Sie Ihre Container-Instances so konfigurieren, dass der Befehl docker run mit dem Benutzerdatenskript beim Start oder in manchen Init-Systemen wie Upstart oder systemd aufgerufen wird. Diese Methode funktioniert zwar, hat aber einige Nachteile, da Amazon ECS nichts über den Container weiß und CPU, Arbeitsspeicher, Ports oder sonstige verwendete Ressourcen nicht überwachen kann. Damit Amazon ECS alle Aufgabenressourcen ordnungsgemäß berücksichtigen kann, sollten Sie eine Aufgabendefinition für den Container erstellen, der auf Ihren Container-Instances ausgeführt werden soll. Verwenden Sie anschließend Amazon ECS, um die Aufgabe beim Start mit Amazon EC2-Benutzerdaten zu platzieren.
Bei dem Amazon EC2-Benutzerdatenskript im folgenden Verfahren wird die Amazon-ECS-Introspektions-API zur Ermittlung der Container-Instance verwendet. Anschließend werden die AWS CLI und der Befehl start-task verwendet, um eine angegebene Aufgabe beim Startup auszuführen.
So starten Sie eine Aufgabe beim Start einer Container-Instance
-
Ändern Sie Ihre
ecsInstanceRole-IAM-Rolle, um Berechtigungen für die API-OperationStartTaskhinzuzufügen. Weitere Informationen finden Sie unter Berechtigungen für eine Rolle aktualisieren im Benutzerhandbuch für AWS Identity and Access Management. -
Starten Sie eine oder mehrere Container-Instances mit dem Amazon-ECS-optimierten AMI für Amazon Linux 2. Starten Sie neue Container-Instances und verwenden Sie das folgende Beispielskript in den EC2-Benutzerdaten. Ersetzen Sie
your_cluster_namedurch den Cluster, in dem sich die Container-Instance registrieren soll, undmy_task_defdurch die Aufgabendefinition, die beim Start auf der Instance ausgeführt werden soll.Weitere Informationen finden Sie unter Starten einer Amazon ECS Linux-Container-Instance.
Anmerkung
Der mehrteilige MIME-Inhalt unten verwendet zum Einstellen von Konfigurationswerten und Installieren von Paketen ein Shell-Skript. Außerdem verwendet er einen systemd-Auftrag zum Starten der Aufgabe, wenn der ecs-Service ausgeführt wird und die Introspektions-API verfügbar ist.
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==-- -
Überprüfen Sie, ob Ihre Container-Instances im richtigen Cluster gestartet werden und ob Ihre Aufgaben gestartet wurden.
Öffnen Sie die Konsole unter https://console.aws.amazon.com/ecs/v2
. -
Wählen Sie auf der Navigationsleiste die Region aus, in der sich der Cluster befindet.
-
Wählen Sie im Navigationsbereich Clusters und dann den Cluster aus, der Ihre Container-Instances hostet.
-
Wählen Sie auf der Seite Cluster Aufgaben und dann Ihre Aufgaben aus.
Auf jeder Container-Instance, die Sie gestartet haben, sollte Ihre Aufgabe ausgeführt werden.
Wenn Ihre Aufgaben nicht angezeigt werden, können Sie sich mit SSH bei Ihren Container-Instances anmelden und die Datei
/var/log/ecs/ecs-start-task.logauf Debugging-Informationen überprüfen.