Engineering

Überwachen von Amazon ECS mit Elastic Observability

In Zeiten, in denen immer mehr Teams ihre Anwendungen und Arbeitslasten auf Container verlagern, ist es essenziell geworden, den Zustand und die Nutzung der Container überwachen und verfolgen zu können. Vielerorts ist bereits das Metricbeat-Docker-Modul im Einsatz, mit dem sich Daten für das Docker-Container-Monitoring erfassen lassen. Diese Daten können dann zur weiteren Analyse in Elasticsearch gespeichert werden. Aber was, wenn die Nutzer Amazon ECS nutzen? Kann Metricbeat auch zur Überwachung von Amazon ECS verwendet werden? Ja, das geht.

In diesem Blogpost führen wir Sie durch die Schritte, die Sie für die Überwachung von Amazon ECS mit Elastic Observability ausführen müssen.

Was ist Amazon ECS?

Amazon ECS (Elastic Container Service) ist ein hochgradig skalierbarer, vollständig verwalteter Dienst, mit dem sich Docker-Container einfach und schnell orchestrieren und bereitstellen lassen. Er wird von zwei verschiedenen zugrundeliegenden Cloud-Diensten („Starttypen“) unterstützt, die festlegen, wie die Rechenressourcen verwaltet werden: EC2 und Fargate.

Wenn der Starttyp EC2 verwendet wird, laufen die Container auf EC2-Instanzen, die die Nutzer selbst verwalten müssen. Kommt hingegen Fargate zum Einsatz, müssen die Nutzer nur Container und Aufgaben angeben. Fargate kümmert sich dann um die Einrichtung, Konfiguration und Verwaltung der Backend-Infrastruktur.

Sehen wir uns an, wie Sie Metricbeat verwenden können, um die einzelnen Starttypen zu überwachen. 

Überwachen von Amazon ECS-EC2-Containern mit Elastic

Nutzer, die Container auf EC2 bereitstellen, sind für das Bereitstellen und Verwalten ihres Amazon ECS-Clusters selbst verantwortlich. Aus Monitoring-Sicht verhalten sich diese EC2-Instanzen wie jede normale VM, d. h., Nutzer können sich mit ihnen verbinden und direkt vom Docker-Daemon Docker-Statistikdaten beziehen. Sehen wir uns an, wie wir mit ein paar einfachen Schritten die Überwachung unserer Amazon ECS-Container auf EC2 einrichten können:

Voraussetzung: SSL-Schlüssel

Achten Sie beim Erstellen Ihres Amazon ECS-Clusters darauf, einen gültigen SSL-Schlüssel anzuhängen, um die Zugänglichkeit der Instanzen über SSH zu gewährleisten:

Schritt 1: Sicherheitsgruppe festlegen

Wählen Sie im Abschnitt „Netzwerk“ eine Sicherheitsgruppe aus, mit der Sie den SSH-Zugriff aktivieren können (Port 22):

Schritt 2: EC2-Instanz verifizieren

Nachdem Sie den Amazon ECS-Cluster ordnungsgemäß gestartet haben, können Sie sich Ihre EC2-Instanzen ansehen:

Schritt 3: SSL-Verbindung herstellen

Über das in Schritt 1 angehängte Schlüsselpaar können Sie sich per SSH mit jeder Instanz verbinden, z. B.:

ssh -i "ec2-ecs-test.pem" ec2-user@3.125.104.129

Schritt 4: Metricbeat installieren

Da Sie Zugriff auf alle Instanzen des Clusters haben, können Sie auf jeder Instanz Metricbeat installieren und damit beginnen, vom Docker-Daemon Metriken abzurufen:

curl -L -O <a href="https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm">https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.11.1-x86_64.rpm</a> 
sudo rpm -vi metricbeat-7.10.1-x86_64.rpm 
sudo metricbeat modules disable system 
sudo metricbeat modules enable docker

Jetzt können wir den Elasticsearch-Endpoint definieren, an den die Metriken gesendet werden sollen. In diesem Fall verwenden wir eine auf Elastic Cloud laufende Instanz. Wenn Sie die Schritte nachvollziehen möchten, können Sie Elastic Cloud kostenlos ausprobieren.

Bearbeiten Sie die Datei metricbeat.yml, indem Sie ihr Elastic Cloud-Optionen hinzufügen:

Sie finden diese Datei in der Regel unter /etc/metricbeat/metricbeat.yml. Bearbeiten Sie sie wie folgt:

sudo vi /etc/metricbeat/metricbeat.yml
cloud.id: "elastic-observability-deployment:ZXV…….k3MTI1ZTA1Ng==" 
cloud.auth: "elastic:2vXXXXXXXXXXXxxxxxxxxxxxV"

Wenn Sie ein selbst verwaltetes Elasticsearch-Cluster ausführen, müssen Sie den Elasticsearch-Output konfigurieren:

output.elasticsearch: 
  hosts: ["https://myEShost:9200"] 
  username: "elastic" 
  password: "changeme"

Als Nächstes können Sie vordefinierte Dashboards, Indizes und Mappings einrichten:

sudo metricbeat setup -e

Metricbeat starten:

./metricbeat -e -d & 
sudo service metricbeat start

Sie können auch festlegen, dass der Metricbeat-Dienst bei jedem Systemstart automatisch mit startet:

systemctl enable metricbeat
Hinweis: Dieser Prozess muss auf allen EC2-Instanzen des Clusters ausgeführt werden.

Schritt 5: Prüfen, ob die Metriken tatsächlich erfasst werden

Nachdem wir Metricbeat eingerichtet haben, können wir einen Blick auf die Docker-bezogenen Metriken in der Kibana-Ansicht „Discover“ werfen, um zu prüfen, ob die Ereignisse auch wirklich in unserem Elasticsearch-Cluster gespeichert werden:

Jetzt können wir damit fortfahren, Aufgaben auf unserem Amazon ECS-Cluster bereitzustellen, die Metriken produzieren, die dann von Metricbeat erfasst werden. Mit diesen Metriken können wir anschließend Visualisierungen und Dashboards erstellen und dabei auch die standardmäßig hinzugefügten zusätzlichen Metadaten, wie cloud_metadata und host_metadata, nutzen, um die Metriken anhand von AWS-Konten, Regionen, Host-IDs, Typen usw. zu korrelieren. So lässt sich zum Beispiel durch die Kombination von docker.info.containers.running mit host.name ein Überblick darüber gewinnen, wie viele laufende Container es in einem bestimmten Zeitraum pro Host gibt:

Schritt 6: Metriken in vordefinierten Kibana-Dashboards betrachten

Auch das Docker-Dashboard, das standardmäßig in Metricbeat enthalten ist, bietet einen guten Überblick über unsere Container-Arbeitslasten:

Die Überwachung von Amazon ECS-Aufgaben ist schnell eingerichtet. So können Sie sich mit Metricbeat zusätzliche Informationen über Ihr EC2-Cluster verschaffen. Als Nächstes sehen wir uns an, wie wir unsere Amazon ECS-Container auf Fargate überwachen können:

Überwachen von Amazon ECS-Fargate-Containern mit Elastic

Amazon ECS auf Fargate stellt verschiedene Metadaten, Netzwerkmetriken und Docker-Statistiken über das Ausführen von Aufgaben und Containern durch den Endpunkt für Aufgabenmetadaten bereit. Metricbeat nutzt Version 4 des Endpunkts für Aufgabenmetadaten, der auf Containerebene verfügbar und auf der AWS Fargate-Plattform ab Version 1.4.0 standardmäßig aktiviert ist.

Um eine auf Fargate laufende Aufgabe zu überwachen, müssen Sie einen Metricbeat-Container für die Aufgabe bereitstellen, indem Sie manuell eine neue Container-Definition hinzufügen. Im Abschnitt Standard können Sie unter Container name einen Namen wie metricbeat-container festlegen und als Metricbeat-Image das Metricbeat-Docker-Image aus der Elastic Docker-Registry docker.elastic.co/beats/metricbeat:7.11.0 verwenden.

Außerdem müssen wir auch einen Befehl hinzufügen, damit dieser Container Metricbeat einrichtet und mit dem Senden von Daten an Elastic Cloud beginnt:

./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

Sie müssen im Abschnitt Environment variables (Umgebungsvariablen) die zu den tatsächlichen Anmeldeinformationen passenden Werte für $ELASTIC_CLOUD_ID und $ELASTIC_CLOUD_AUTH hinzufügen. Möglicherweise macht sich die Verwendung des AWS Secrets Managers erforderlich, um zu verhindern, dass diese Werte in Klartext gespeichert werden:

Nachdem die neue Version der Aufgabendefinition erstellt wurde, können Sie durch Klicken auf run task (Aufgabe starten) im Dropdown-Menü „Actions“ (Aktionen) festlegen, dass der Aufgabe beim nächsten Neustart Metricbeat hinzugefügt wird.

Wenn Sie mehr als nur ein paar Aufgaben überwachen müssen, kann das manuelle Hinzufügen von Metricbeat-Containern recht mühsam und zeitaufwendig sein. In diesem Fall empfehlen wir, AWS CloudFormation zu nutzen, ein natives AWS-Feature zur Verwaltung von Ressourcen, das dafür sorgt, dass die Ressourcen ohne manuelle Eingriffe bereitgestellt und über ihre gesamte Lebensdauer hinweg aktualisiert werden. Mit AWS CloudFormation können Sie Infrastruktur als Code behandeln und sie über eine Vorlagendatei verwalten, in der alle erforderlichen Ressourcen und deren Abhängigkeiten definiert sind.

Das folgende Beispiel zeigt in vereinfachter Form, wie Sie mit CloudFormation einer Aufgabe Metricbeat-Container hinzufügen können:

 TaskDefinition: 
   Type: AWS::ECS::TaskDefinition 
   Properties: 
     Family: !Ref TaskName 
     Cpu: 256 
     Memory: 512 
     NetworkMode: awsvpc 
     ExecutionRoleArn: !Ref ExecutionRole 
     ContainerDefinitions: 
       - Name: metricbeat-container 
         Image: docker.elastic.co/beats/metricbeat:7.11.0 
         Secrets: 
           - Name: ELASTIC_CLOUD_ID 
             ValueFrom: !Ref CloudIDArn 
           - Name: ELASTIC_CLOUD_AUTH 
             ValueFrom: !Ref CloudAuthArn 
                 EntryPoint: 
           - sh 
           - -c 
         Command: 
           - ./metricbeat setup -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH && ./metricbeat modules disable system && ./metricbeat modules enable awsfargate && ./metricbeat -e -E cloud.id=$ELASTIC_CLOUD_ID -E cloud.auth=$ELASTIC_CLOUD_AUTH

Es gibt auch eine komplette AWS CloudFormation-Vorlage mit einem awsfargate-Modul, die einen neuen Cluster erstellt, eine Aufgabendefinition mit einem Metricbeat-Container und einem Stresstestcontainer bereitstellt und den Dienst startet. Sie können sie gern in eine lokale cloudformation.yml-Datei kopieren und ausprobieren.

Wenn Sie Elastic Cloud verwenden, wird empfohlen, sowohl die Cloud-ID als auch den Cloud-Auth-Wert im AWS Secrets Manager zu speichern. Es folgt ein entsprechendes Beispiel unter Nutzung der AWS-Befehlszeile:

Geheimen ELASTIC_CLOUD_AUTH-Wert erstellen:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_AUTH --secret-string XXX

Geheimen ELASTIC_CLOUD_ID-Wert erstellen:

aws --region us-east-1 secretsmanager create-secret --name ELASTIC_CLOUD_ID --secret-string YYY

Nachdem wir nun unsere geheimen Werte erstellt haben, erstellen wir jetzt mit nur einem Befehl in der AWS-Befehlszeile und unter Nutzung der CloudFormation-Vorlagendatei cloudformation.yml einen kompletten Stack.

CloudFormation-Stack erstellen:

aws --region us-east-1 cloudformation create-stack --stack-name test-metricbeat-deployment --template-body file://./cloudformation.yml --capabilities CAPABILITY_NAMED_IAM --parameters ParameterKey=SubnetID,ParameterValue=subnet-5d89de27 ParameterKey=CloudAuthArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_AUTH-abc ParameterKey=CloudIDArn,ParameterValue=arn:aws:secretsmanager:us-east-1:xxx:secret:ELASTIC_CLOUD_ID-abc ParameterKey=ClusterName,ParameterValue=metricbeat-fargate ParameterKey=RoleName,ParameterValue=ecsFargateTaskExecutionRole 
ParameterKey=TaskName,ParameterValue=task-metricbeat ParameterKey=ServiceName,ParameterValue=metricbeat-service ParameterKey=LogGroupName,ParameterValue=metricbeat-fargate-log-group

Nachdem der CloudFormation-Status für den Stack auf CREATE_COMPLETE umgesprungen ist, können Sie sehen, wie alle 10 Sekunden Monitoring-Metriken in Elasticsearch eintreffen. Das Modul awsfargate erfasst Laufzeitmetriken der einzelnen Container, wie CPU-, Arbeitsspeicher-, Netzwerk- und diskIO-Informationen. Darüber hinaus gibt es ein Out-of-the-Box-Dashboard, mit dem Sie sich alle Monitoring-Daten aus awsfargate in Kibana ansehen können:

Wenn Sie alles genug ausprobiert haben, können Sie mithilfe der AWS-Befehlszeile den gesamten Stack problemlos wieder löschen:

aws --region us-east-1 cloudformation delete-stack --stack-name test-metricbeat-deployment

Wie geht es weiter?

Sind Sie auf der Suche nach einer Monitoring-Lösung für Ihre Amazon ECS-Container-Deployments? Mit den Metricbeat-Modulen docker und awsfargate können Nutzer einfach und schnell die Überwachung von Amazon ECS-Containern einrichten und Metriken an den Elasticsearch Service auf Elastic Cloud senden. Falls Sie Fragen oder Feedback haben, nutzen Sie bitte unser Beats-Diskussionsforum.

We're hiring

Work for a global, distributed team where finding someone like you is just a Zoom meeting away. Flexible work with impact? Development opportunities from the start?