是否可以在AWS Cloudformation中指定数据格式转换?

时间:2018-09-26 17:40:36

标签: amazon-web-services amazon-cloudformation amazon-kinesis-firehose

AWS文档使您看起来好像可以在Cloudformation中为DataFormatConversionConfiguration指定AWS::KinesisFirehose::DeliveryStream一样,但是没有关于该属性应该去哪里的文档。尝试将其添加到PropertiesExtendedS3DestinationConfigurationProcessingConfigurationProcessors之一下。每次CF都会抱怨-

  

以下资源无法更新:[EventFirehose]。   12:24:32 UTC-0500

     

UPDATE_FAILED AWS :: KinesisFirehose :: DeliveryStream EventFirehose遇到了不受支持的属性DataFormatConversionConfiguration

有自己的文档说-

  

如果您希望Kinesis Data Firehose将输入数据的格式从JSON转换为Parquet或ORC,请在ExtendedS3DestinationConfiguration或ExtendedS3DestinationUpdate中指定可选的DataFormatConversionConfiguration元素。

我在做什么错了?

2 个答案:

答案 0 :(得分:10)

根据SDK documentation,它应位于ExtendedS3DestinationConfigurationExtendedS3DestinationUpdate中。但是,根据docs,cloudformation当前支持此属性。这是cloudformation与其他AWS服务之间非常常见的差异。 AWS ECS: Severe bug in ECS Service Cloudformation template(最近已解决)中提到了一个类似的问题。

目前,您可以通过SDK更新或等待一段时间以使cloudformation赶上。

  

如果要让Kinesis Data Firehose将输入数据的格式从JSON转换为Parquet或ORC,请在ExtendedS3DestinationConfiguration或ExtendedS3DestinationUpdate中指定可选的DataFormatConversionConfiguration元素

答案 1 :(得分:2)

这是我如何解决此任务的方法。 Firehose strem以实木复合地板格式将数据写入S3存储桶:

  LogsCollectionDatabase:
    Type: AWS::Glue::Database
    Properties:
      DatabaseInput:
        Description: Database for Kinesis Analytics
        Name: !Ref DatabaseName
      CatalogId: !Ref AWS::AccountId

  LogsCollectionTable:
    Type: AWS::Glue::Table
    DependsOn: LogsCollectionDatabase
    Properties:
      DatabaseName: !Ref LogsCollectionDatabase
      CatalogId: !Ref AWS::AccountId
      TableInput:
        Name: serverlogs
        Description: Table for storing logs from kinesis
        TableType: EXTERNAL_TABLE
        StorageDescriptor:
          Columns:
            - Type: string
              Name: col1
            - Type: string
              Name: col2
          Location: !Sub s3://${DestinationBucketName}/${DestinationBucketPrefix}
          InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
          OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
          SerdeInfo:
            SerializationLibrary: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe

  KinesisFirehoseDeliveryStream:
    Type: AWS::KinesisFirehose::DeliveryStream
    DependsOn: FirehoseDeliveryIAMPolicy
    Properties:
      DeliveryStreamName: !Ref RegionalStreamName
      DeliveryStreamType: DirectPut
      ExtendedS3DestinationConfiguration:
        BucketARN: !Ref DestinationBucketArn
        Prefix: !Ref DestinationBucketPrefix
        BufferingHints:
          IntervalInSeconds: 60
          SizeInMBs: 64
        ErrorOutputPrefix: errors/
        RoleARN: !GetAtt FirehoseDeliveryIAMRole.Arn
        DataFormatConversionConfiguration:
          Enabled: true
          InputFormatConfiguration:
            Deserializer:
              HiveJsonSerDe: {}
          OutputFormatConfiguration:
            Serializer:
              ParquetSerDe: {}
          SchemaConfiguration:
            CatalogId: !Ref AWS::AccountId
            RoleARN: !GetAtt FirehoseDeliveryIAMRole.Arn
            DatabaseName: !Ref LogsCollectionDatabase
            TableName: !Ref LogsCollectionTable
            Region: !Ref AWS::Region
            VersionId: LATEST

当然,需要为FirehosStream定义IAM角色和策略