Я пытаюсь создать решение для централизованного ведения журналов, используя фильтры подписки 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]
Похоже, здесь есть какая-то проблема конфигурации, но я не могу ее найти.