Журналы Cloudwatch -> Kinesis Firehose -> S3 - неправильно JSON? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать решение для централизованного ведения журналов, используя фильтры подписки Cloudwatch для записи журналов в Kinesis Firehose -> S3 -> AWS Glue -> Athena. У меня много проблем с форматированием данных.

Изначально я использовал AWS :: KinesisFirehose S3DestinationConfiguration для записи в S3, а затем пытался либо сканировать данные с помощью AWS: : Glue :: Crawler или создайте таблицу вручную в шаблоне Cloudformation. Я обнаружил, что у Crawler было много проблем с определением формата данных на S3 (обнаружен ION вместо JSON - ION не может быть запрошен Athena). Я сейчас пытаюсь ExtendedS3DestinationConfiguration, который позволяет явную конфигурацию форматов ввода и вывода, чтобы заставить его паркет.

К сожалению, при использовании этой настройки Kinesis Firehose возвращает журналы ошибок, говоря, что ввод недействителен JSON. Это заставляет меня задуматься о том, что фильтр подписки Cloudwatch не пишет правильно JSON - но на этом объекте нет параметров конфигурации для управления форматом данных.

Это не очень необычная формулировка проблемы, поэтому кто-то там должен иметь правильную конфигурацию. Вот некоторые фрагменты моей неудачной конфигурации:

ExtendedS3DestinationConfiguration:
        BucketARN: !Sub arn:aws:s3:::${S3Bucket}
        Prefix: !Sub ${S3LogsPath}year=!{timestamp:YYYY}/month=!{timestamp:MM}/day=!{timestamp:dd}/hour=!{timestamp:HH}/
        ErrorOutputPrefix: !Sub ${FailedWritePath}
        BufferingHints:
          IntervalInSeconds: 300
          SizeInMBs: 128
        CloudWatchLoggingOptions:
          Enabled: true
          LogGroupName: !Sub ${AppId}-logstream-${Environment}
          LogStreamName: logs
        CompressionFormat: UNCOMPRESSED
        RoleARN: !GetAtt FirehoseRole.Arn
        DataFormatConversionConfiguration:
          Enabled: true
          InputFormatConfiguration:
            Deserializer:
              OpenXJsonSerDe: {}
          OutputFormatConfiguration:
            Serializer:
              ParquetSerDe: {}
          SchemaConfiguration:
            CatalogId: !Ref AWS::AccountId
            DatabaseName: !Ref CentralizedLoggingDatabase
            Region: !Ref AWS::Region
            RoleARN: !GetAtt FirehoseRole.Arn
            TableName: !Ref LogsGlueTable
            VersionId: LATEST

Бывшая конфигурация:

S3DestinationConfiguration:
        BucketARN: !Sub arn:aws:s3:::${S3Bucket}
        Prefix: !Sub ${S3LogsPath}year=!{timestamp:YYYY}/month=!{timestamp:MM}/day=!{timestamp:dd}/hour=!{timestamp:HH}/
        ErrorOutputPrefix: !Sub ${FailedWritePath}
        BufferingHints:
          IntervalInSeconds: 300
          SizeInMBs: 128
        CloudWatchLoggingOptions:
          Enabled: true
          LogGroupName: !Sub ${AppId}-logstream-${Environment}
          LogStreamName: logs
        CompressionFormat: GZIP
        RoleARN: !GetAtt FirehoseRole.Arn

И сканер:

Type: AWS::Glue::Crawler
    Properties:
      Name: !Sub ${DNSEndPoint}_logging_s3_crawler_${Environment}
      DatabaseName: !Ref CentralizedLoggingDatabase
      Description: AWS Glue crawler to crawl logs on S3
      Role: !GetAtt CentralizedLoggingGlueRole.Arn
#      Schedule: ## run on demand
#        ScheduleExpression: cron(40 * * * ? *)
      Targets:
        S3Targets:
          - Path: !Sub s3://${S3Bucket}/${S3LogsPath}
      SchemaChangePolicy:
        UpdateBehavior: UPDATE_IN_DATABASE
        DeleteBehavior: LOG
      TablePrefix: !Sub ${AppId}_${Environment}_

Ошибка с использованием ExtendedS3DestinationConfiguration:

"попытки": 1, "прибытие-время": 1582650068665, "lastErrorCode": "DataFormatConversion.ParseError", "lastErrorMessage": "Обнаружено недопустимое JSON. Недопустимый символ ((CTRL-CHAR, код 31)): только обычные пробелы (\ r, \ n, \ t) разрешены между токенами \ n в [Source: com.faster xml .jackson.databind.util. ByteBufferBackedInputStream@2ce955fc; строка: 1, столбец : 2]

Похоже, здесь есть какая-то проблема конфигурации, но я не могу ее найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...