Direkt zum Inhalt

Wie sende ich meine Container-Protokolle an mehrere Ziele in Amazon ECS auf AWS Fargate?

Lesedauer: 5 Minute
0

Ich möchte, dass mein Anwendungscontainer, der auf AWS Fargate ausgeführt wird, Protokolle an mehrere Ziele weiterleitet, z. B. Amazon CloudWatch, Amazon Data Firehose oder Splunk.

Kurzbeschreibung

Mit einer Amazon Elastic Container Service (Amazon ECS)-Aufgabendefinition kannst du nur ein einziges Protokollkonfigurationsobjekt für einen bestimmten Container angeben. Dieses Limit bedeutet, dass du Protokolle nur an ein einziges Ziel weiterleiten kannst. Um Protokolle an mehrere Ziele in Amazon ECS auf Fargate weiterzuleiten, kannst du FireLens verwenden.

Hinweis: FireLens funktioniert sowohl mit Fluent Bit- als auch mit Fluentd-Protokollweiterleitung. Die folgende Lösung verwendet Fluent Bit, da Fluent Bit ressourceneffizienter ist als Fluentd.

Lösung

**Hinweis:**Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, findest du weitere Informationen unter Troubleshoot AWS CLI errors. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Bevor du beginnst, stelle sicher, dass du Folgendes verstehst:

  • Um die Fluent Bit-Ausgabedefinition zu generieren verwendet FireLens die Schlüsselwertpaare, die als Optionen im logConfiguration-Objekt aus der ECS-Aufgabendefinition angegeben sind. Das Ziel, an das FireLens die Protokolle weiterleitet, ist im Definitionsabschnitt**[OUTPUT]** einer Fluent Bit-Konfigurationsdatei angegeben. Weitere Informationen findest du unter Ausgang auf der Fluent Bit-Website. Wenn du keine Optionen angibst, wird keine Ausgabe generiert.
  • FireLens erstellt in deinem Namen eine Konfigurationsdatei, du kannst jedoch auch eine benutzerdefinierte Konfigurationsdatei angeben. Du kannst diese Konfigurationsdatei in Amazon Simple Storage Service (Amazon S3) hosten. Oder erstelle ein benutzerdefiniertes Fluent Bit-Docker-Image, wobei die benutzerdefinierte Ausgabekonfigurationsdatei dem Image hinzugefügt wurde.
  • Du kannst Amazon ECS und Fargate verwenden, um eine benutzerdefinierte Konfigurationsdatei aus Amazon S3 abzurufen, es sei denn, du benötigst benutzerdefinierte Plugins für Fluent Bit.

Erstelle eine benutzerdefinierte Fluent Bit-Ausgabekonfigurationsdatei und lade sie auf Amazon S3 hoch

Erstelle eine benutzerdefinierte Fluent Bit-Konfigurationsdatei namens logDestinations.conf mit den von dir ausgewählten**[OUTPUT]**-Definitionen. Die Konfigurationsdatei enthält beispielsweise Konfigurationen, die für CloudWatch, Amazon Data Firehose und Splunk definiert sind. Die Match-Direktive leitet deine Daten weiter. Wenn Amazon ECS die Fluent Bit-Konfiguration auffüllt, kennzeichnet es die Eingabeströme mit einem automatisch generierten Namen, dem der Container-Name vorangestellt ist. Der Präfix-Service wird im Beispiel verwendet:

[OUTPUT]   
    Name                firehose   
    Match               service*
    region              us-west-2
    delivery_stream     nginx-stream  
[OUTPUT]
    Name                cloudwatch
    Match               service*
    region              us-east-1
    log_group_name      firelens-nginx-container
    log_stream_prefix   from-fluent-bit
    auto_create_group   true   
[OUTPUT]
    Name                splunk
    Match               service*
    Host                127.0.0.1
    Splunk_Token        xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
    Splunk_Send_Raw     On

Hinweis: Für unterschiedliche Ziele müssen unterschiedliche Felder in der**[OUTPUT]**-Definition angegeben werden. Beispiele findest du unter amazon-ecs-firelens-examples auf der GitHub-Website.

Um diese Datei in einen Amazon S3-Bucket hochzuladen, den du kontrollierst, führe den AWS CLI-Befehl cp aus:

aws s3 cp logDestinations.conf s3://example-bucket/logDestinations.conf

IAM-Berechtigungen erstellen

Erstelle AWS Identity and Access Management (IAM)-Berechtigungen, damit deine Aufgabenrolle die S3-Konfigurationsdatei abrufen kann. Erlaube deine Aufgabenrolle, deine Protokolle an verschiedene Ziele weiterzuleiten. Wenn das Ziel beispielsweise Amazon Data Firehose ist, musst du der Aufgabe die Erlaubnis geben, die firehose:PutRecordBatch-API aufzurufen.

Hinweis: Fluent Bit unterstützt Plugins als Protokollziele. Ziele wie CloudWatch und Kinesis benötigen Berechtigungen, die logs:CreateLogGroup, logs:CreateLogStream, logs:DescribeLogStreams, logs:PutLogEvents und kinesis:PutRecords beinhalten. Weitere Informationen findest du unter Berechtigungen für CloudWatch und Kinesis auf der GitHub-Website.

In der Beispiel-IAM-Richtlinie gewährt die Aufgabenrolle s3:GetObject Zugriff auf die Konfigurationsdatei. Es hat sich bewährt, der Aufgabe die erforderlichen Berechtigungen zu erteilen, um die eigene Ausgabe der Aufgabe in einer anderen CloudWatch-Protokollgruppe zu protokollieren.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ConfigurationFileAccess",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::example-bucket/logDestinations.conf"
    },
    {
      "Sid": "CloudWatchLogGroupPermissions",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-log-router"
    },
    {
      "Sid": "CloudWatchLogStreamPermissions",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-log-router:log-stream:*"
    }
  ]
}

**Hinweis:**Weitere Informationen zum Erstellen einer Aufgaben-IAM-Rolle und zu den erforderlichen Berechtigungen findest du unter Amazon ECS-IAM-Rolle zur Aufgabenausführung.

Die Beispiel-IAM-Aufgabenrolle gewährt die erforderlichen Berechtigungen für die CloudWatch- und Amazon Data Firehose-Treiber, die im Beispielziel verwendet werden:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DataFirehosePermissions",
      "Action": [
        "firehose:PutRecordBatch"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:firehose:us-west-2:555555555555:deliverystream/nginx-stream"
    },
    {
      "Sid": "CloudWatchLogGroupPermissions",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-nginx-container"
    },
    {
      "Sid": "CloudWatchLogStreamPermissions",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:logs:us-east-1:555555555555:log-group:firelens-nginx-container:log-stream:*"
    }
  ]
}

Erstellen einer Aufgabendefinition

Verwende in deiner Aufgabendefinition das AWS für Fluent-Bit-Image, um einen zusätzlichen wichtigen Container einzubeziehen. Das Beispiel führt den offiziellen Nginx-Container aus. Verwende die AWS CLI oder die Amazon ECS-Konsole, um eine vollständige Aufgabendefinition zu erstellen:

{
    "family": "firelens-example-task",
    "taskRoleArn": "arn:aws:iam::012345678901:role/exampleTaskRole",
    "taskExecutionRoleArn": "arn:aws:iam::444455556666:role/exampleTaskExecutionRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "256",
    "memory": "512",
    "containerDefinitions": [
        {
            "essential": true,
            "image": "public.ecr.aws/docker/library/nginx:latest",
            "name": "service_web_app",
            "logConfiguration": {
                "logDriver": "awsfirelens"
            }
        },
        {
            "essential": true,
            "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable",
            "name": "log_router",
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "firelens-log-router",
                    "awslogs-region": "us-east-1",
                    "awslogs-create-group": "true",
                    "awslogs-stream-prefix": "firelens-router-logs"
                }
            },
            "firelensConfiguration": {
                "type": "fluentbit",
                "options": {
                    "config-file-type": "s3",
                    "config-file-value": "arn:aws:s3:::example-bucket/logDestinations.conf"
                }
            }
        }
    ]
}

**Hinweis:**Um Probleme zu beheben, leitet die Beispielkonfiguration die Ausgabe des Fluent-Bit-Containers an eine andere CloudWatch-Protokollgruppe unter einem anderen Präfix weiter.

AWS OFFICIALAktualisiert vor 3 Monaten