AWS Container Service auf beliebiger Infrastruktur ausführen ECS Anywhere Workloads unter Ubuntu Server

Von Tytus Kurek * |

Mit ECS Anywhere lässt sich der Container-Service von AWS außerhalb der Amazon-Cloud nutzen. Den On-Premises-Betrieb auf einem Ubuntu Server beschreiben wir in diesem Beitrag.

Auch in einer On-Premises-Installation von Ubuntu-Server lässt sich der ECS-Anywhere-Agent betreiben.
Auch in einer On-Premises-Installation von Ubuntu-Server lässt sich der ECS-Anywhere-Agent betreiben.
(Bild: gemeinfrei / Pixabay)

Container standortunabhängig, On-Premises oder in der Cloud verwalten – das ermöglicht seit kurzem ECS Anywhere. Wer Ubuntu als Basis-Betriebssystem für seine ECS-Cluster im eigenen Rechenzentrum oder anderswo verwendet, kann sich auf Ubuntus Hardware-Support, Professional Services und das umfangreiche Ökosystem stützen. Das wiederum führt dazu, dass diese ECS-Cluster überall, wo sie benötigt werden, mit optimaler Leistung laufen.

Nachfolgend wird der Betrieb des ECS Anywhere-Agenten auf einem Ubuntu-Server in einer On-Premises-Installation beschrieben. Mithilfe von Multipass wird dafür ein On-Premises-Server simuliert. Diese Vorgehensweise ist aber auf jeder unterstützten Ubuntu-Version möglich, egal ob im eigenen Rechenzentrum oder einer Public Cloud.

Voraussetzungen

Um dieser Anleitung folgen zu können, muss das AWS-CLI-Dienstprogramm auf dem zu verwendenden Rechner installiert und konfiguriert sein. Multipass wird hier verwendet, um eine Ubuntu-VM zu erstellen. Diese Anweisungen können aber auch direkt auf den eigenen Ubuntu-Servern ausgeführt werden, auf denen die ECS Anywhere-Workloads ausgeführt werden sollen.

Mit Multipass kann man einfach und schnell offizielle Ubuntu-VMs für Windows, macOS und Linux erhalten. Die Installation von Multipass unter Linux gelingt wie folgt:

sudo snap install multipass

Launch-Variablen setzen und IAM-Profil erstellen

Im ersten Schritt müssen auf dem Linux-Rechner, auf dem AWS CLI installiert ist (nicht unbedingt der Rechner, auf dem die ECS Anywhere-Arbeitslasten ausgeführt werden sollen), die Umgebungsvariablen festgelegt werden:

AWS_DEFAULT_REGION=eu-west-1
ROLE_NAME=ecsMithrilRole
CLUSTER_NAME=test-ecs-anywhere
SERVICE_NAME=test-ecs-anywhere-svc

Nun wird eine Datei namens ssm-trust-policy.json mit dem folgenden Inhalt erzeugt:

{
   "Version": "2012-10-17",
   "Statement": {
      "Effect": "Allow",
      "Principal": {"Service": [
         "ssm.amazonaws.com"
      ]},
      "Action": "sts:AssumeRole"
   }
}

Anschließend wird das Profil erzeugt und verifiziert:

aws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://ssm-trust-policy.jsonaws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCoreaws iam attach-role-policy --role-name $ROLE_NAME --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role# Verify
aws iam list-attached-role-policies --role-name $ROLE_NAME

Erstellen des ECS-Anywhere-Clusters

Nun erstellen wir den ECS-Anywhere-Cluster und den Aktivierungsschlüssel:

aws ecs create-cluster --cluster-name $CLUSTER_NAMEaws ssm create-activation --iam-role $ROLE_NAME | tee ssm-activation.json

Starten einer Ubuntu-VM mit Multipass (optional)

Nun geht es daran, eine Ubuntu 20.04-VM mit Multipass zu erstellen. Dieser Schritt ist nicht erforderlich, wenn bereits ein Ubuntu-Server vorhanden ist, auf dem die ECS Anywhere-Workloads ausgeführt werden sollen.

Dies könnte eine beliebige Ubuntu-VM oder Bare-Metal-Maschine im eigenen Rechenzentrum sein oder sogar eine Ubuntu-Instanz, die in einer anderen PUblic Cloud läuft. In diesem Fall werden diese Befehle einfach direkt auf diesem Server ausgeführt:

multipass launch focal -n ecs-anywhere-ubuntu

Installation des ECS-Anywhere-Agenten und der erforderlichen Software unter Ubuntu

Jetzt wird der ECS Anywhere-Agent auf dem Ubuntu-Server installiert. Dabei muss sichergestellt werden, dass die ACTIVATION_ID und der ACTIVATION_CODE durch die in den vorherigen Schritten generierten Werte ersetzt werden:

# Führen Sie alle Befehle auf dem Ubuntu-System aus, auf dem Sie die ECS-Workloads ausführen werden
export ACTIVATION_ID=<your activation ID>
export ACTIVATION_CODE=<your activation code>
# Download the ecs-anywhere install Scriptcurl -o "ecs-anywhere-install.sh" "https://amazon-ecs-agent-packages-preview.s3.eu-west-1.amazonaws.com/ecs-anywhere-install.sh" && sudo chmod +x ecs-anywhere-install.sh# (Optional) Check integrity of the shell script
curl -o "ecs-anywhere-install.sh.sha256" "https://amazon-ecs-agent-packages-preview.s3.eu-west-1.amazonaws.com/ecs-anywhere-install.sh.sha256" && sha256sum -c ecs-anywhere-install.sh.sha256
# Run the install script
sudo ./ecs-anywhere-install.sh \
      --cluster test-ecs-anywhere \
      --activation-id $ACTIVATION_ID \
      --activation-code $ACTIVATION_CODE \
      --region eu-west-1

Installation validieren

Nach Abschluss der Installation wird die SSH-Sitzung beendet und zurückgegangen zu dem Rechner, auf dem die ursprünglichen AWS-CLI-Befehle ausgeführt wurden. Nun muss man überprüfen, ob die Instanzen verbunden sind und laufen:

aws ssm describe-instance-informationaws ecs list-container-instances --cluster $CLUSTER_NAME

Task-Definition registrieren und Task jetzt über die Befehlszeile ausführen

In diesem Schritt wird eine Datei namens external-task-definition.json erzeugt; sie hat die folgenden Inhalte:

{
   "requiresCompatibilities": [
      "EXTERNAL"
   ],
   "containerDefinitions": [
      {
         "name": "nginx",
         "image": "nginx:latest",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "portMappings": [
            {
               "containerPort": 80,
               "hostPort": 8080,
               "protocol": "tcp"
            }
         ]
      }
   ],
   "networkMode": "bridge",
   "family": "nginx"
}

Anschließend gilt es, eine neue Aufgabendefinition für den ECS Anywhere-Cluster zu registrieren und diese Aufgabe auf dem eigenen Ubuntu-Server auszuführen.

#Register the task definition
aws ecs register-task-definition --cli-input-json file://external-task-definition.json
#Run the task
aws ecs run-task --cluster $CLUSTER_NAME --launch-type EXTERNAL --task-definition nginx
#Get the Task ID
TEST_TASKID=$(aws ecs list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns[0]')
#Verify Task is Running
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $TEST_TASKID

Nun können wir überprüfen, ob der Container „zuhört“. Hierfür gehen wir auf http://<your VM IP>:8080 und sollten nun nginx lokal in Betrieb sehen.

Aufräumen

Für das Aufräumen sind die folgenden Schritte auszuführen:

# Cleanup SSM
aws ssm describe-activations | jq ".ActivationList | .[] | .ActivationId" | xargs -L 1 aws ssm delete-activation --activation-id
aws ssm describe-instance-information | jq ".InstanceInformationList | .[] | .InstanceId" | grep "mi-" | xargs -L 1 aws ssm deregister-managed-instance --instance-id
# Cleanup ECS resources
aws ecs list-container-instances --cluster $CLUSTER_NAME | jq ".containerInstanceArns | .[]" | xargs -L 1 aws ecs deregister-container-instance --cluster $CLUSTER_NAME --force --container-instance
aws ecs delete-cluster --cluster $CLUSTER_NAME# Verify all items deleted are empty
aws ssm describe-activations
aws ssm describe-instance-information
aws ecs list-container-instances --cluster $CLUSTER_NAME
#Remove Multipass VM (optional)
multipass stop ecs-anywhere-ubuntu
multipass delete ecs-anywhere-ubuntu

Fazit

Mit ECS Anywhere können Anwender AWS ECS-Container auf einem beliebigen Ubuntu-Server ausführen, sei es im eigenen Rechenzentrum oder in einer beliebigen Public Cloud. In diesem Beispiel wurde eine Anwendung als eigenständige Aufgabe bereitgestellt.

Tytus Kurek
Tytus Kurek
(Bild: Canonical)

In der AWS-Dokumentation finden sich Beispiele dafür, wie man eine ECS-Anwendung so bereitstellt, dass sie kontinuierlich ausgeführt wird, oder wie man sie hinter einem Load Balancer platziert. Durch die Kombination von ECS Anywhere mit Ubuntu Advantage erhalten Anwender die Sicherheit von Kernel-Live-Patching, volle Unterstützung für Tausende von Paketen, FIPS-Module und eine Reihe anderer Vorteile.

* Tytus Kurek ist Produktmanager bei Canonical, dem Herausgeber von Ubuntu. Als Autor bereichert er regelmäßig unser Ubuntu- und Open-Source-Special von Canonical mit neuen Beiträgen.

(ID:47481234)

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung