BLOG

Amazon S3 Select는 .NET을 위해 AWS SDK에서 지원합니다.
작성일: 2018-08-13

.NET을 위한 AWS SDK에서 Amazon S3 Select에 대한 지원을 출시했습니다. 이 기능은 개발자가 Amazon S3의 개체에 대해 간단한 SQL 쿼리를 실행할 수 있도록 합니다. 현재 전체 개체의 일부분을 사용하기 위해 자주 전체 개체를 끌어 오는 경우 이 기능을 사용하면 성능이 크게 향상될 수 있습니다.
S3 Select는 CSV 형식 또는 JSON 형식으로 저장된 개체에서 작동합니다. 또한, 이는 GZIP를 사용하여 압축된 개체 및 서버 측 암호화된 개체와도 작동합니다. 결과 형식을 CSV 또는 JSON으로 지정하고 결과의 레코드가 어떻게 구분되는지 확인할 수 있습니다.
추가 입력 및 출력 형식에 대한 지원을 계속 추가합니다. 현재 지원되는 기능을 보려면 S3 Select용 API 문서를 확인하십시오.
S3 Select의 용도는 다음과 같습니다.

  • 데이터베이스 백업에 대해 쿼리를 실행합니다(관계형 쿼리인지 아니면 NoSQL이 아닌지).
  • 구문 분석 구성.
  • 로그 탐색.

전제 조건

  • 쿼리하려고 하는 파일이 있는 Amazon S3 버킷:
    • 이러한 리소스에 대한 읽기 권한이 있어야 합니다.
    • 파일은 JSON 또는 CSV형식이어야 합니다.

 

요청하기
요청을 하려면, S3Client에서 SelectObjectContent/SelectObjectContentAsync 작업을 호출합니다. 요구 사항을 자세히 설명하는 요청 개체를 전달합니다.

예를 들어, 선으로 구분된 JSON개체로 저장된 개체를 쿼리 하려면

{“name”: “Joe”, “company”: “AMAZON”, “favorite_color”: “blue”}

{“name”: “Mike”, “company”: “WHOLE FOODS”, “favorite_color”: “green”}

{“name”: “Jane”, “company”: “AMAZON”, “favorite_color”: “yellow”}

{“name”: “Ash”, “company”: “AMAZON”, “favorite_color”: “white”}

{“name”: “Hikari”, “company”: “GITHUB”, “favorite_color”: “cyan”}

 

JSON을 다시 사용하고 싶으면 이렇게 해 주세요.

private static async Task<ISelectObjectContentEventStream> GetSelectObjectContentEventStream()

{

    var response = await Client.SelectObjectContentAsync(new SelectObjectContentRequest()

   {

        Bucket = _bucketName,

        Key = _keyName,

        ExpressionType = ExpressionType.SQL,

        Expression = “select * from S3Object s where s.COMPANY = ‘AMAZON'”,

        InputSerialization = new InputSerialization()

        {

            JSON = new JSONInput()

            {

                JsonType = JsonType.Lines

            }

        },

        OutputSerialization = new OutputSerialization()

        {

            JSON = new JSONOutput()

        }

     });

 

    return response.Payload;

}

 

그러면 다음이 반환됩니다.

{“name”:”Joe”,”company”:”AMAZON”,”favorite_color”:”blue”}

{“name”:”Jane”,”company”:”AMAZON”,”favorite_color”:”yellow”}

{“name”:”Ash”,”company”:”AMAZON”,”favorite_color”:”white”}

 

대신 CSV 형식으로 출력하려면 세미 콜론으로 구분합니다. OutputSerialization을 다음으로 변경합니다.

OutputSerialization = new OutputSerialization()

{

    CSV = new CSVOutput()

    {

        QuoteFields = QuoteFields.Always,

        FieldDelimiter = “;”

    }

}

 

그러면 다음이 반환됩니다.

“Joe”;”AMAZON”;”blue”

“Jane”;”AMAZON”;”yellow”

“Ash”;”AMAZON”;”white”

 

물론, CSV파일을 입력하면

“NAME”,”COMPANY”,”FAVORITE_COLOR”

“Joe”,”AMAZON”,”blue”

“Mike”,”WHOLE FOODS”,”green”

“Jane”,”AMAZON”,”yellow”

“Ash”,”AMAZON”,”white”

“Hikari”,”GITHUB”,”cyan”

 

InputSerialization을 변경합니다.

InputSerialization = new InputSerialization()

{

    CSV = new CSVInput()

    {

        FileHeaderInfo = FileHeaderInfo.Use

    }

},

 

이전 예제와 동일한 결과가 나타납니다.

이러한 옵션을 읽고 유스 케이스에 맞는 옵션을 찾으려면 SelectObjectContent의 S3 설명서를 참조하십시오.

 

응답 사용(이벤트스트림)

S3 Select는 매우 큰 개체에서 실행할 수 있으므로 작업이 완료되는 데 시간이 걸릴 수 있습니다. S3 Select 응답을 사용하여 응용 프로그램을 유지하려면 이 작업은 EventStream(이벤트스트림)이 응답으로 반환됩니다. EventStream(이벤트스트림)은 다른 서비스 작업에서 반환된 응답과 다릅니다. S3가 요청을 처리할 때 “events”를 전송합니다. 이러한 이벤트는 스트림에 이벤트 핸들러를 연결하고 백그라운드 프로세서를 시작하거나 제공된 열거형 지원을 사용하여 사용할 수 있습니다.

 

이벤트에 따라 결정

SelectObjectContentEventStream에는 다음이 함께 제공됩니다.

  • EventReceived–일반적인 “사건”이벤트
  • ExceptionReceived–스트림에 예외가 있을 때 발생하는 이벤트입니다.
  • 각 “이벤트” 유형에 입력되는 이벤트:
    • RecordsEventReceived–OutputSerialization에서 지정한 형식으로 레코드를 포함합니다.
    • StatsEventReceived–요청이 수행한 총 작업 양을 자세히 설명합니다.
    • ContinuationEventReceived-보통 무시될 수 있는 Keep-Alive(킵얼라이브)입니다.
    • ProgressEventReceived–시작되었지만 아직 완료되지 않은 쿼리의 진행에 대한 정보가 들어 있습니다.
    • EndEventReceived–응답의 끝을 나타냅니다.

이 기능은 매우 큰 개체를 쿼리 할 때 UI 또는 서비스와 같은 프로그램의 응답을 유지하려는 경우에 유용합니다. 또는 웹 응용 프로그램을 개발하는 중에 이벤트가 제공되면 클라이언트에 비동기 메시지를 게시할 수 있습니다.

다음은 콘솔 응용 프로그램에 포함할 수 있는 샘플입니다. “어떤” 이벤트,”레코드” 이벤트 및 “종료” 이벤트에 대한 이벤트 핸들러를 등록합니다. 그런 다음 StartProcessing을 호출하여 백그라운드 루프를 시작합니다. 프로그램이 중간에 종료되지 않도록 대기 핸들을 사용합니다. 핸들은 “종료” 이벤트가 수신될 때 “설정” 됩니다. 샘플은 이런 일이 일어날 때까지 또는 5초가 지날 때까지 기다립니다.

var endWaitHandle = new AutoResetEvent(false);

 

using (var eventStream = await GetSelectObjectContentEventStream())

{

    // Since everything happens on a background thread, exceptions are raised as events.

    // Here, we are just throwing the exception received.

    eventStream.ExceptionReceived += (sender, args) => throw args.EventStreamException;

 

    eventStream.EventReceived += (sender, args) =>

        Console.WriteLine($”Received {args.EventStreamEvent.GetType().Name}!”);

    eventStream.RecordsEventReceived += (sender, args) =>

    {

        Console.WriteLine(“The contents of the Records Event is…”);

        using (var reader = new StreamReader(args.EventStreamEvent.Payload, Encoding.UTF8))

        {

            Console.Write(reader.ReadToEnd());

        }

    };

    eventStream.EndEventReceived += (sender, args) => endWaitHandle.Set();

 

    eventStream.StartProcessing();

    endWaitHandle.WaitOne(TimeSpan.FromSeconds(5));

}

 

열거형 지원

SelectObjectContent (ISelectObjectContentEventStream)의 응답 페이로드는 IEnumerable을 구현합니다. 즉, 스트림에서 직접 기존 C# 구조를 활용할 수 있습니다.

열거하는 작업은 전체 응답이 스트리밍 될 때까지 기다리지 않습니다. 이벤트가 사용할 수 있게 되면 처리되므로 요청이 계속 진행될 때 응답을 처리할 수 있습니다.

예를 들어 패턴 일치와 함께 foreach 루프를 사용할 수 있습니다.

using (var eventStream = await GetSelectObjectContentEventStream())

{

    foreach (var ev in eventStream)

    {

        Console.WriteLine($”Received {ev.GetType().Name}!”);

        if (ev is RecordsEvent records)

        {

          Console.WriteLine(“The contents of the Records Event is…”);

            using (var reader = new StreamReader(records.Payload, Encoding.UTF8))

            {

                Console.Write(reader.ReadToEnd());

            }

        }

    }

}

 

또는 Linq를 사용할 수 있습니다.

using (var eventStream = await GetSelectObjectContentEventStream())

{

    var recordResults = eventStream

        .Where(ev => ev is RecordsEvent)

        .Cast<RecordsEvent>()

        .Select(records =>

        {

            using (var reader = new StreamReader(records.Payload, Encoding.UTF8))

            {

                return reader.ReadToEnd();

            }

        }).ToArray();

    var results = string.Join(Environment.NewLine, recordResults);

    Console.WriteLine(results);

}

 

결론

.NET을 위해 AWS SDK에서 Amazon S3 Select 기능을 지원합니다. .NET 개발자는 SQL을 사용하여 S3 개체를 쿼리하고 데이터 필터링을 S3으로 이동합니다. 이렇게 하면 기존 워크플로우가 간소화되고 S3 버킷에 저장된 데이터를 쿼리하는 유스 케이스의 성능이 향상됩니다. EventStream(이벤트스트림) 응답은 .NET 개발자에게 익숙하고 편리하도록 설계되었습니다.

자세한 내용은 S3 Select의 S3 개발자API 문서를 참조하십시오.

문제를 얘기하고 도움을 받으려면 Github 저장소에 문제를 제출하십시오.

 

원문 URL: https://aws.amazon.com/ko/blogs/developer/amazon-s3-select-support-in-the-aws-sdk-for-net/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.