Ir para o conteúdo

Como faço para enviar meus logs de contêiner para vários destinos no Amazon ECS no AWS Fargate?

5 minuto de leitura
0

Quero que meu contêiner de aplicação que é executado no AWS Fargate encaminhe logs para vários destinos, como Amazon CloudWatch, Amazon Data Firehose ou Splunk.

Breve descrição

Uma definição de tarefa do Amazon Elastic Container Service (Amazon ECS) permite que você especifique somente um único objeto de configuração de log para um determinado contêiner. Esse limite significa que é possível encaminhar logs somente para um único destino. Para encaminhar logs para vários destinos no Amazon ECS no Fargate, é possível usar o FireLens.

Observação: o FireLens funciona com os encaminhadores de log Fluent Bit e Fluentd. Essa resolução usa Fluent Bit porque ele é mais eficiente em termos de recursos do que o Fluentd.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Antes de começar, certifique-se de entender:

  • O FireLens usa os pares de chave-valor especificados como opções no objeto logConfiguration da definição de tarefa do ECS para gerar a definição de saída do Fluent Bit. O destino para o qual o FireLens roteia os logs é especificado na seção de definição [OUTPUT] de um arquivo de configuração do Fluent Bit. Para obter mais informações, consulte Output no site do Fluent Bit. Se você não especificar nenhuma opção, nenhuma saída será gerada.
  • O FireLens cria um arquivo de configuração em seu nome, mas também é possível especificar um arquivo de configuração personalizado. É possível hospedar esse arquivo de configuração no Amazon Simple Storage Service (Amazon S3). Ou criar uma imagem do Docker personalizada do Fluent Bit com o arquivo de configuração de saída personalizado adicionado à imagem.
  • É possível usar o Amazon ECS e o Fargate para obter um arquivo de configuração personalizado do Amazon S3, a menos que precise de plug-ins personalizados para o Fluent Bit.

Crie um arquivo de configuração de saída personalizado do Fluent Bit e faça o upload para o Amazon S3

Crie um arquivo de configuração personalizado do Fluent Bit chamado logDestinations.conf com sua escolha de definições de [OUTPUT]. Por exemplo, o arquivo de configuração inclui configurações definidas para CloudWatch, Amazon Data Firehose e Splunk. A diretiva Match encaminha seus dados. Quando o Amazon ECS preenche a configuração do Fluent Bit, ele marca os fluxos de entrada com um nome gerado automaticamente prefixado pelo nome do contêiner. O serviço de prefixo é usado no exemplo:

[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

Observação: destinos diferentes exigem que campos diferentes sejam especificados na definição [OUTPUT]. Para obter exemplos, consulte amazon-ecs-firelens-examples no site do GitHub.

Para fazer o upload desse arquivo em um bucket do Amazon S3 que você controla, execute o comando cp da AWS CLI:

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

Crie permissões do IAM

Crie permissões do AWS Identity and Access Management (AWS IAM) para permitir que seu perfil de tarefa adquira o arquivo de configuração do S3. Permita que seu perfil de tarefa roteie seus logs para destinos diferentes. Por exemplo, se seu destino for Amazon Data Firehose, você deverá dar permissão à tarefa para chamar a API firehose:PutRecordBatch.

Observação: o Fluent Bit suporta plug-ins como destinos de log. Destinos como CloudWatch e Kinesis exigem permissões que incluem logs:CreateLogGroup, logs:CreateLogStream, logs:DescribeLogStreams, logs:PutLogEvents e kinesis:PutRecords. Para obter mais informações, consulte Permissões para CloudWatch e Kinesis no site do GitHub.

No exemplo de política do IAM, o perfil de tarefa dá ao s3:GetObject acesso ao arquivo de configuração. É uma prática recomendada conceder à tarefa as permissões necessárias para registrar a saída da própria tarefa em outro grupo de logs do CloudWatch.

{
  "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:*"
    }
  ]
}

Observação: para obter mais informações sobre como criar um perfil do IAM de tarefa e as permissões necessárias, consulte Perfil do IAM de execução de tarefas do Amazon ECS.

O exemplo de perfil de tarefa do IAM concede as permissões necessárias para os drivers CloudWatch e Amazon Data Firehose usados no destino do exemplo:

{
  "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:*"
    }
  ]
}

Crie a definição da tarefa

Em sua definição de tarefa, use a imagem da AWS para Fluent Bit para incluir um contêiner essencial adicional. O exemplo executa o contêiner oficial do nginx. Use a AWS CLI ou o console do Amazon ECS para criar uma definição de tarefa completa:

{
    "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"
                }
            }
        }
    ]
}

Observação: para solucionar problemas, o exemplo de configuração direciona a saída do contêiner Fluent Bit para outro grupo de logs do CloudWatch com um prefixo diferente.

AWS OFICIALAtualizada há 9 meses