Wie sorge ich dafür, dass CloudWatch Logs an meine Domäne von Amazon OpenSearch Service streamt?

Lesedauer: 6 Minute
0

Ich kann meine Amazon CloudWatch Logs nicht an meine Domäne von Amazon OpenSearch Service streamen. Wie behebe ich dieses Problem?

Lösung

Ich kann nicht mehrere CloudWatch-Protokollgruppen auf dieselbe OpenSearch-Service-Domäne streamen

Standardmäßig erstellt Amazon CloudWatch nur eine AWS-Lambda-Funktion für jede OpenSearch-Service-Domäne. Wenn Sie mehrere Protokollgruppen einrichten, um Daten in Ihre Domäne zu indizieren, rufen dann alle mehreren Protokollgruppen dieselbe Lambda-Funktion auf. Wenn die erste Protokollgruppe eine Lambda-Funktion aufruft, erstellt der Aufruf einen Index und ein Typfeld in Ihrer Domäne.

Indizes, die in Amazon OpenSearch Service 6.0.0 oder höher erstellt wurden, können nur einen einzigen Zuordnungstyp enthalten. Indizes, die in 5.x mit mehreren Zuordnungstypen erstellt wurden, funktionieren in OpenSearch Service 6.x weiterhin wie zuvor. Weitere Informationen über die Veraltung von OpenSearch-Servicezuordnungstypen finden Sie unter Removal of mapping types (Entfernung von Zuordnungstypen) auf der Elastic-Website.

Wenn andere Protokollgruppen versuchen, dieselbe Lambda-Funktion aufzurufen, schlägt der Aufruf mit der folgenden Fehlermeldung fehl:

"reason": "Rejecting mapping update to [

] as the final mapping would have more than 1 type: [log-group-1, log-group-2]” („Grund“: „Aktualisierung der Zuordnung auf [<index_name>] wird abgelehnt, da die endgültige Zuordnung mehr als 1 Typ haben würde: [log-group-1, log-group-2]“)

Aktualisieren Sie zunächst Ihre Lambda-Funktion mit der folgenden Syntax, um dieses Problem zu beheben:

var indexName = [
     'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),
     ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),
     ('0' + timestamp.getUTCDate()).slice(-2) 
     ].join('.');

Diese Syntax erstellt mehrere Indizes für die verschiedenen Protokollgruppen, die in Ihre OpenSearch-Service-Domäne streamen.

Speichern Sie dann die aktualisierte Lambda-Funktion, um separate Indizes für die mehreren Protokollgruppen zu erstellen, die in Ihre Domäne streamen.

Ich kann nicht auf eine VPC-basierte OpenSearch-Service-Domäne im selben AWS-Konto streamen

Wichtig: Bevor Sie die CloudWatch-Protokollgruppen auf Ihre VPC-basierte OpenSearch-Service-Domäne streamen, müssen Sie Ihre Rollenrichtlinie für AWS Identity and Access Management (IAM) aktualisieren. An die IAM-Rolle, die an die entsprechende Lambda-Funktion angehängt ist, muss die Richtlinie AWSLambdaVPCAccessExecutionRole angefügt sein.

Hier ist eine Richtlinie für AWSLambdaVPCAccessExecutionRole im JSON-Format:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "ec2:CreateNetworkInterface",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DeleteNetworkInterface"
      ],
      "Resource": "*"
    }
  ]
}

Hinweis: Diese verwaltete Richtlinie ermöglicht es der Lambda-Funktion, die CloudWatch-Protokollgruppe in Ihren Cluster in der VPC zu schreiben.

Nachdem Sie die Richtlinie an Ihre Lambda-Funktion angehängt haben, können Sie damit beginnen, die Protokolle an Ihre OpenSearch-Service-Domäne in der VPC zu streamen.

Ich kann meine CloudWatch-Protokollgruppe nicht auf eine OpenSearch-Service-Domäne streamen, wenn eine feinkörnige Zugriffssteuerung aktiviert ist

Wenn Sie Ihre CloudWatch Logs mit differenzierter Zugriffssteuerung an eine OpenSearch-Service-Domäne streamen, tritt möglicherweise der folgende Berechtigungsfehler auf:

"{"statusCode":403,"responseBody":{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]"},"status":403}}"

Wenn Sie diese Fehlermeldung aus Ihren Lambda-Funktionsprotokollen erhalten, ist die Rollenzuordnung unvollständig.

Hinweis: Standardmäßig erstellt OpenSearch Service eine AWS-Lambda-Funktion für Sie.

OpenSearch-Service-Domänen mit 7.9 und höher (einschließlich OpenSearch Version 1.x)

Führen Sie die folgenden Schritte aus, um die Fehlermeldung zu beheben:

1.    Öffnen Sie OpenSearch Dashboards. Einen Link zu OpenSearch Dashboards finden Sie in der Domänenübersicht Ihrer OpenSearch-Service-Konsole.

2.    Wählen Sie im Navigationsbereich Sicherheit.

3.    Wählen Sie Rollen.

4.    Wählen Sie die Rolle all_access.

5.    Wählen Sie die Registerkarte Zugeordnete Benutzer.

6.    Wählen Sie auf der Dialogseite Zugeordnete Benutzer die Option Zuordnung verwalten.

7.    Geben Sie unter Backend-Rollen die Lambda-Funktion zum Ausführen der Rolle ARN ein.

8.    Wählen Sie Map. Ihre Protokolle sollten jetzt auf Ihre OpenSearch-Service-Domäne streamen.

Weitere Informationen zum Rollen-Mapping finden Sie unter Rollen den Benutzern zuordnen.

OpenSearch-Service-Domänen mit 7.8 und früher

Führen Sie die folgenden Schritte aus, um die Fehlermeldung zu beheben:

1.    Öffnen Sie OpenSearch Dashboards. Einen Link zu OpenSearch Dashboards finden Sie in der Domänenübersicht Ihrer OpenSearch-Service-Konsole.

2.    Wählen Sie im linken Navigationsbereich das Schlosssymbol.

3.    Wählen Sie Rollenzuordnungen aus.

4.    Wählen Sie all_access und security_manager als Ihre Rollen.

Hinweis: Die Rolle all_access bietet nur Zugriff auf Ihren Cluster. Basierend auf Ihrem Anwendungsfall können Sie Ihrem Cluster auch eine feinkörnige Zugriffssteuerung hinzufügen.

5.    Bearbeiten Sie das Mapping für all_access.

6.    Fügen Sie für die Backend-Rolle die Ausführungsrolle der Lambda-Funktion hinzu und wählen Sie Senden. Ihre Protokolle sollten jetzt auf Ihre OpenSearch-Service-Domäne streamen.

Meine CloudWatch-Protokolle werden nicht an meine OpenSearch-Service-Domäne zugestellt

Wenn Sie CloudWatch-Protokolle (mit der standardmäßigen AWS-Lambda-Funktion) an Ihre OpenSearch-Service-Domäne streamen, tritt möglicherweise der folgende Indizierungsfehler auf:

"errorMessage": "{"statusCode":200,"responseBody":{"took":42,"errors":true}}",

Hinweis: AWS-Lambda-Fehler werden standardmäßig als 200-OK-Antworten zurückgegeben.

Führen Sie die folgenden Schritte aus, um diese Fehlermeldung zu beheben:

1.    Öffnen Sie die standardmäßige AWS-Lambda-Funktion.

2.    Finden Sie die folgende Code-Zeile:

"var logFailedResponses = false;"

3.    Aktualisieren Sie den Wert var logFailedResponses auf „wahr“. Dieses Update bietet zusätzliche Informationen für alle neuen Indexierungsanfragen mithilfe der AWS-Lambda-Funktion. Sie können die zusätzlichen Informationen verwenden, um die Ursache Ihres Indizierungsproblems zu ermitteln.

Ich erhalte einen cluster_block_exception-Fehler

Clusterblock-Ausnahmen werden durch Folgendes verursacht:

  • Mangel an freiem Speicherplatz
  • Übermäßiger JVM-Speicherdruck

Weitere Informationen zur Fehlerbehebung bei Clusterblock-Ausnahmen finden Sie unter ClusterBlockException.

Mein CloudWatch-Abonnementfilter kann über eine standardmäßige Lambda-Funktion (OpenSearch Service 2.0 und höher) keine Daten an meinen Cluster senden

Möglicherweise erhalten Sie eine Fehlermeldung, wenn Sie einen CloudWatch-Abonnementfilter haben, um Protokolle mithilfe der standardmäßigen Lambda-Funktion an Amazon OpenSearch Service 2.x zu senden. Wenn der Abonnementfilter die Protokolle nicht erfassen kann und der folgende Fehler angezeigt wird, wird der Fehler durch einen deaktivierten Parameter verursacht:

"{"statusCode":400,"responseBody":{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}}"

In OpenSearch-Service-Versionen ab 2.0 wird der Parameter _type von API-Endpunkten entfernt. Um diesen Fehler zu beheben, müssen Sie den Parameter auch aus dem Code Ihrer Lambda-Funktion entfernen.

1.    Öffnen Sie die AWS-Lambda-Konsole.

2.    Wählen Sie die Standard-Lambda-Funktion für Ihren Abonnementfilter aus.

3.    Sehen Sie sich den Code für Ihre Funktion unter Code source (Codequelle) an.

4.    Suchen Sie die Funktion transform, die im Code definiert ist. Innerhalb dieser Funktion werden die Daten in das JSON-Indizierungsformat für OpenSearch Service konvertiert. Die ersten Zeilen dieses Codes sehen etwa wie folgt aus:

function transform(payload) {
    if (payload.messageType === 'CONTROL_MESSAGE') {
        return null;
    }

    var bulkRequestBody = '';

    payload.logEvents.forEach(function(logEvent) {
                var timestamp = new Date(1 * logEvent.timestamp);

5.    Suchen Sie unter der transform-Funktion den Parameter _type. In den meisten Fällen befindet er sich in Zeile 79. Entfernen Sie die Codezeile, die den Parameter _type hinzufügt, oder kommentieren Sie sie aus. Nach dem Entfernen sieht Ihr Code etwa wie folgt aus:

var action = {
    "index": {}
};
action.index._index = indexName;
//action.index._type = payload.logGroup;
action.index._id = logEvent.id;

bulkRequestBody += [

Sie können jetzt erfolgreich Indizierungsanforderungen senden.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr