

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 윈도 플러그인용 Kinesis 에이전트 생성
<a name="creating-kinesis-agent-windows-plugins"></a>

대부분의 경우, 마이크로소프트 윈도우용 Amazon Kinesis 에이전트 플러그인을 생성할 필요가 없습니다. Windows용 Kinesis 에이전트는 고도로 구성할 수 있으며 다음과 같은 강력한 소스 및 싱크가 포함되어 있습니다.`DirectorySource`및`KinesisStream`이며 대부분의 시나리오에 충분합니다. 기존 소스 및 싱크에 대한 자세한 내용은 단원을 참조하십시오.[마이크로소프트 윈도우용 Amazon Kinesis 에이전트 구성](configuring-kinesis-agent-windows.md).

비정상적인 시나리오의 경우 사용자 지정 플러그인을 사용하여 Windows용 Kinesis 에이전트를 확장해야 할 수 있습니다. 몇 가지 이러한 시나리오는 다음과 같습니다.
+ 컴플렉스 패키징`DirectorySource`를 사용하여 선언을`Regex`또는`Delimited`레코드 파서를 사용하여 다양한 종류의 구성 파일에 쉽게 적용 할 수 있습니다.
+ 파일 기반이 아니거나 기존 레코드 파서가 제공하는 구문 분석 기능을 초과하는 새로운 소스를 만듭니다.
+ 현재 지원되지 않는 AWS 서비스용 싱크 생성

**Topics**
+ [윈도 플러그인용 Kinesis 에이전트 시작하기](#creating-kinesis-agent-windows-plugins-overview)
+ [Windows 플러그인 팩토리를 위한 Kinesis 에이전트 구현](#creating-kinesis-agent-windows-plugins-factory)
+ [Windows 플러그인 소스용 Kinesis 에이전트 구현](#creating-kinesis-agent-windows-plugins-source)
+ [Windows 플러그인 싱크용 Kinesis 에이전트 구현](#creating-kinesis-agent-windows-plugins-sink)

## 윈도 플러그인용 Kinesis 에이전트 시작하기
<a name="creating-kinesis-agent-windows-plugins-overview"></a>

사용자 정의 플러그인에는 특별한 것이 없습니다. 기존의 모든 소스 및 싱크는 사용자 정의 플러그인이 Windows용 Kinesis 에이전트가 시작될 때 로드하는 데 사용하는 것과 동일한 메커니즘을 사용하며`appsettings.json`구성 파일을 참조하십시오.

Windows용 Kinesis 에이전트가 시작되면 다음 순서가 발생합니다.

1. Windows용 Kinesis 에이전트는 설치 디렉토리 (`%PROGRAMFILES%\Amazon\AWSKinesisTap`) 를 구현 하는 클래스에 대 한`IFactory<T>`인터페이스에 정의 된`Amazon.KinesisTap.Core`어셈블리를 생성합니다. 이 인터페이스는`Amazon.KinesisTap.Core\Infrastructure\IFactory.cs`를 Windows용 Kinesis 에이전트 소스 코드에 입력합니다.

1. Windows용 Kinesis 에이전트는 이러한 클래스를 포함하는 어셈블리를 로드하고`RegisterFactory`메서드를 호출합니다.

1. Windows용 Kinesis 에이전트는`appsettings.json`구성 파일을 참조하십시오. 구성 파일의 각 소스 및 싱크에 대해`SourceType`및`SinkType`키-값 페어가 검사됩니다. 의 값과 같은 이름으로 등록 된 공장이있는 경우`SourceType`및`SinkType`키-값 페어의 경우`CreateInstance`메서드가 해당 팩토리에서 호출됩니다. 이`CreateInstance`메서드는 구성 및 기타 정보를`IPluginContext`객체입니다. 이`CreateInstance`메소드는 플러그인을 구성하고 초기화하는 것을 담당합니다.

플러그인이 올바르게 작동하려면 플러그인을 생성하는 등록 된 팩토리 클래스가 있어야하며 플러그인 클래스 자체를 정의해야합니다.

Windows용 Kinesis 에이전트 소스 코드는[https://github.com/awslabs/kinesis-agent-windows](https://github.com/awslabs/kinesis-agent-windows).

## Windows 플러그인 팩토리를 위한 Kinesis 에이전트 구현
<a name="creating-kinesis-agent-windows-plugins-factory"></a>

다음 단계에 따라 Windows용 Kinesis 에이전트 플러그인 팩토리를 구현합니다.

**Windows용 Kinesis 에이전트 플러그인 팩토리를 생성하려면**

1. .NET Framework 4.6을 대상으로 C\# 라이브러리 프로젝트를 생성합니다.

1. 를 참조할 항목을 추가합니다.`Amazon.KinesisTap.Core`어셈블리를 생성합니다. 이 어셈블리는`%PROGRAMFILES%\Amazon\AWSKinesisTap`디렉터리에 설치할 수 있습니다.

1. `NuGet`를 사용하여 `Microsoft.Extensions.Configuration.Abstractions` 패키지를 설치합니다.

1. `NuGet`를 사용하여 `System.Reactive` 패키지를 설치합니다.

1. `NuGet`를 사용하여 `Microsoft.Extensions.Logging` 패키지를 설치합니다.

1. 다음 중 하나를 구현하는 팩토리 클래스를 만듭니다.`IFactory<IEventSource>`소스 또는`IFactory<IEventSink>`싱크 용. 를 추가합니다.`RegisterFactory`및`CreateInstance`메서드를 사용합니다.

   예를 들어 다음 코드에서는 임의의 데이터를 생성하는 소스를 생성하는 Windows용 Kinesis 에이전트 플러그인 팩토리를 생성합니다.

   ```
   using System;
   using Amazon.KinesisTap.Core;
   using Microsoft.Extensions.Configuration;
   
   namespace MyCompany.MySources
   {
       public class RandomSourceFactory : IFactory<ISource>
       {
           public void RegisterFactory(IFactoryCatalog<ISource> catalog)
           {
               catalog.RegisterFactory("randomsource", this);
           }
   
           public ISource CreateInstance(string entry, IPlugInContext context)
           {
               IConfiguration config = context.Configuration;
   
               switch (entry.ToLower())
               {
                   case "randomsource":
                       string rateString = config["Rate"];
                       string maxString = config["Max"];
                       TimeSpan rate;
                       int max;
   
                       if (string.IsNullOrWhiteSpace(rateString))
                       {
                           rate = TimeSpan.FromSeconds(30);
                       }
                       else
                       {
                           if (!TimeSpan.TryParse(rateString, out rate))
                           {
                               throw new Exception($"Rate {rateString} is invalid for RandomSource.");
                           }
                       }
    
                       if (string.IsNullOrWhiteSpace(maxString))
                       {
                           max = 1000;
                       }
                       else
                       {
                           if (!int.TryParse(maxString, out max))
                           {
                               throw new Exception($"Max {maxString} is invalid for RandomSource.");
                           }
                       }
   
                       return new RandomSource(rate, max, context);
                   default:
                       throw new ArgumentException($"Source {entry} is not recognized.", entry);
               }
           }
       }
   }
   ```

   이`switch`문에 사용되는`CreateInstance`메서드를 사용하면 결국 팩토리를 향상시켜 다른 종류의 인스턴스를 만들 수 있습니다.

   아무 것도하지 않는 싱크를 만드는 싱크 팩토리를 만들려면 다음과 유사한 클래스를 사용하십시오.

   ```
   using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.Threading.Tasks;
   using Amazon.KinesisTap.Core;
   using Microsoft.Extensions.Configuration;
   
   namespace MyCompany.MySinks 
   {
       public class NullSinkFactory : IFactory<IEventSink>
       {
           public void RegisterFactory(IFactoryCatalog<IEventSink> catalog)
           {
               catalog.RegisterFactory("nullsink", this);
           }
   
           public IEventSink CreateInstance(string entry, IPlugInContext context)
           {
               IConfiguration config = context.Configuration;
   
               switch (entry.ToLower())
               {
                   case "nullsink":
                       return new NullSink(context);
                   default:
                       throw new Exception("Unrecognized sink type {entry}.");
               }
           }
       }
   }
   ```

## Windows 플러그인 소스용 Kinesis 에이전트 구현
<a name="creating-kinesis-agent-windows-plugins-source"></a>

다음 단계에 따라 Windows용 Kinesis 에이전트 플러그인 소스를 구현합니다.

**Windows용 Kinesis 에이전트 플러그인 소스를 생성하려면**

1. 를 구현하는 클래스를 추가합니다.`IEventSource<out T>`인터페이스를 원본에 대해 이전에 생성 된 프로젝트에 추가합니다.

   예를 들어, 다음 코드를 사용하여 임의의 데이터를 생성하는 원본을 정의합니다.

   ```
   using System;
   using System.Reactive.Subjects;
   using System.Timers;
   using Amazon.KinesisTap.Core;
   using Microsoft.Extensions.Logging;
   
   namespace MyCompany.MySources
   {
       public class RandomSource : EventSource<RandomData>, IDisposable
       {
           private TimeSpan _rate;
           private int _max;
           private Timer _timer = null;
           private Random _random = new Random();
           private ISubject<IEnvelope<RandomData>> _recordSubject = new Subject<IEnvelope<RandomData>>();
           
   
   
           public RandomSource(TimeSpan rate, int max, IPlugInContext context) : base(context)
           {
               _rate = rate;
               _max = max;
           }
   
           public override void Start()
           {
               try
               {
                   CleanupTimer();
                   _timer = new Timer(_rate.TotalMilliseconds);
                   _timer.Elapsed += (Object source, ElapsedEventArgs args) =>
                   {
                       var data = new RandomData()
                       {
                           RandomValue = _random.Next(_max)
                       };
                       _recordSubject.OnNext(new Envelope<RandomData>(data));
                   };
                   _timer.AutoReset = true;
                   _timer.Enabled = true;
                   _logger?.LogInformation($"Random source id {this.Id} started with rate {_rate.TotalMilliseconds}.");
               }
               catch (Exception e)
               {
                   _logger?.LogError($"Exception during start of RandomSource id {this.Id}: {e}");
               }
           }
   
           public override void Stop()
           {
               try
               {
                   CleanupTimer();
                   _logger?.LogInformation($"Random source id {this.Id} stopped.");                
               }
               catch (Exception e)
               {
                   _logger?.LogError($"Exception during stop of RandomSource id {this.Id}: {e}");
               }
           }
   
           private void CleanupTimer()
           {
               if (_timer != null)
               {
                   _timer.Enabled = false;
                   _timer?.Dispose();
                   _timer = null;
               }
           }
   
           public override IDisposable Subscribe(IObserver<IEnvelope<RandomData>> observer)
           {
               return this._recordSubject.Subscribe(observer);
           }
   
           public void Dispose()
           {
               CleanupTimer();
           }
       }
   }
   ```

   이 예에서는`RandomSource`클래스에서 상속`EventSource<T>`클래스를 제공하기 때문에`Id`속성입니다. 이 예제에서는 책갈피를 지원하지 않지만 이 기본 클래스는 해당 기능을 구현하는 데에도 유용합니다. 봉투는 메타 데이터를 저장하고 싱크로 스트리밍하기 위해 임의의 데이터를 래핑하는 방법을 제공합니다. 이`RandomData`클래스는 다음 단계에서 정의되며 이 소스의 출력 객체 유형을 나타냅니다.

1. 원본에서 스트리밍되는 데이터가 들어 있는 이전에 정의된 프로젝트에 클래스를 추가합니다.

   예를 들어, 랜덤 데이터에 대한 컨테이너는 다음과 같이 정의 될 수 있습니다.

   ```
   namespace MyCompany.MySources
   {
       public class RandomData
       {
           public int RandomValue { get; set; }
       }
   }
   ```

1. 이전에 정의 된 프로젝트를 컴파일하십시오.

1. 어셈블리를 Windows용 Kinesis 에이전트의 설치 디렉터리에 복사합니다.

1. 생성 또는 업데이트`appsettings.json`구성 파일을 열고 Windows용 Kinesis 에이전트의 설치 디렉토리에 저장합니다.

1. Windows용 Kinesis 에이전트를 중지했다가 시작합니다.

1. 현재 Windows용 Kinesis 에이전트 로그 파일 (일반적으로`%PROGRAMDATA%\Amazon\AWSKinesisTap\logs`디렉토리) 를 사용하여 사용자 정의 소스 플러그인에 문제가 없는지 확인하십시오.

1. 데이터가 원하는 AWS 서비스에 도착하는지 확인합니다.

를 확장하는 방법의 예는 단원을 참조하십시오.`DirectorySource`기능을 사용하여 특정 로그 형식의 구문 분석을 구현하는 방법에 대한 자세한 내용은`Amazon.KinesisTap.Uls\UlsSourceFactory.cs`및`Amazon.KinesisTap.Uls\UlsLogParser.cs`를 Windows용 Kinesis 에이전트 소스 코드에 입력합니다.

책갈피 기능을 제공하는 소스를 생성하는 방법의 예제는 단원을 참조하십시오.`Amazon.KinesisTap.Windows\WindowsSourceFactory.cs`및`Amazon.KinesisTap.Windows\EventLogSource.cs`를 Windows용 Kinesis 에이전트 소스 코드에 입력합니다.

## Windows 플러그인 싱크용 Kinesis 에이전트 구현
<a name="creating-kinesis-agent-windows-plugins-sink"></a>

다음 단계에 따라 Windows용 Kinesis 에이전트 플러그인 싱크를 구현합니다.

**Windows용 Kinesis 에이전트 플러그인 싱크를 만들려면**

1. 구현 하는 이전에 정의 된 프로젝트에 클래스를 추가`IEventSink`인터페이스를 구현해야 합니다.

   예를 들어, 다음 코드는 다음 폐기되는 레코드의 도착을 기록 이외의 아무것도하지 않는 싱크를 구현합니다.

   ```
   using Amazon.KinesisTap.Core;
   using Microsoft.Extensions.Logging;
   
   namespace MyCompany.MySinks
   {
       public class NullSink : EventSink
       {
           public NullSink(IPlugInContext context) : base(context)
           {
           }
   
           public override void OnNext(IEnvelope envelope)
           {
               _logger.LogInformation($"Null sink {Id} received {GetRecord(envelope)}.");
           }
   
           public override void Start()
           {
               _logger.LogInformation($"Null sink {Id} starting.");
           }
   
           public override void Stop()
           {
               _logger.LogInformation($"Null sink {Id} stopped.");
           }
       }
   }
   ```

   이 예에서는`NullSink`싱크 클래스는 상속`EventSink`클래스는 레코드를 JSON 및 XML과 같은 다른 직렬화 형식으로 변환하는 기능을 제공하기 때문입니다.

1. 이전에 정의 된 프로젝트를 컴파일하십시오.

1. 어셈블리를 Windows용 Kinesis 에이전트의 설치 디렉터리에 복사합니다.

1. 생성 또는 업데이트`appsettings.json`구성 파일을 찾아 Windows용 Kinesis 에이전트의 설치 디렉토리에 저장합니다. 예를 들어 를 사용합니다.`RandomSource`및`NullSink`사용자 정의 플러그인을 사용할 수 있습니다.`appsettings.json`구성 파일:

   ```
   {
     "Sources": [
     {
   	"Id": "MyRandomSource",
   	"SourceType": "RandomSource",
   	"Rate": "00:00:10",
   	"Max": 50
     }
       
     ],
     "Sinks": [
     {
       "Id": "MyNullSink",
   	"SinkType": "NullSink",
   	"Format": "json"
     }
     ],
     "Pipes": [
       {
   	  "Id": "MyRandomToNullPipe",
   	  "SourceRef": "MyRandomSource",
   	  "SinkRef": "MyNullSink"
   	}
     ]
   }
   ```

   이 구성은의 인스턴스를 보내는 소스를 만듭니다`RandomData`와`RandomValue`10초마다 0에서 50 사이의 임의 숫자로 설정됩니다. 들어오는 것을 변형시키는 싱크를 만듭니다.`RandomData`인스턴스를 JSON으로 변환하고 해당 JSON을 기록한 다음 인스턴스를 삭제합니다. 두 예제 팩토리를 모두 포함해야 합니다.`RandomSource`소스 클래스 및`NullSink`싱크 클래스를 사용하여 예제 구성 파일을 사용할 수 있습니다.

1. Windows용 Kinesis 에이전트를 중지했다가 시작합니다.

1. 현재 Windows용 Kinesis 에이전트 로그 파일 (일반적으로`%PROGRAMDATA%\Amazon\AWSKinesisTap\logs`디렉토리) 를 사용하여 사용자 정의 싱크 플러그인에 문제가 없는지 확인하십시오.

1. 데이터가 원하는 AWS 서비스에 도착하는지 확인합니다. 예가 있기 때문에`NullSink`가 AWS 서비스로 스트리밍되지 않는 경우 레코드가 수신되었음을 나타내는 로그 메시지를 찾아 싱크의 올바른 작동을 확인할 수 있습니다.

   예를 들어 다음과 유사한 로그 파일을 볼 수 있습니다.

   ```
   2018-10-18 12:36:36.3647 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.AWS.AWSEventSinkFactory.
   2018-10-18 12:36:36.4018 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.Windows.PerformanceCounterSinkFactory.
   2018-10-18 12:36:36.4018 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory MyCompany.MySinks.NullSinkFactory.
   2018-10-18 12:36:36.6926 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.Core.DirectorySourceFactory.
   2018-10-18 12:36:36.6926 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.ExchangeSource.ExchangeSourceFactory.
   2018-10-18 12:36:36.6926 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.Uls.UlsSourceFactory.
   2018-10-18 12:36:36.6926 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.Windows.WindowsSourceFactory.
   2018-10-18 12:36:36.6926 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory MyCompany.MySources.RandomSourceFactory.
   2018-10-18 12:36:36.9601 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.Core.Pipes.PipeFactory.
   2018-10-18 12:36:37.4694 Amazon.KinesisTap.Hosting.LogManager INFO Registered factory Amazon.KinesisTap.AutoUpdate.AutoUpdateFactory.
   2018-10-18 12:36:37.4807 Amazon.KinesisTap.Hosting.LogManager INFO Performance counter sink  started.
   2018-10-18 12:36:37.6250 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink starting.
   2018-10-18 12:36:37.6250 Amazon.KinesisTap.Hosting.LogManager INFO Connected source MyRandomSource to sink MyNullSink
   2018-10-18 12:36:37.6333 Amazon.KinesisTap.Hosting.LogManager INFO Random source id MyRandomSource started with rate 10000.
   2018-10-18 12:36:47.8084 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":14}.
   2018-10-18 12:36:57.6339 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":5}.
   2018-10-18 12:37:07.6490 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":9}.
   2018-10-18 12:37:17.6494 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":47}.
   2018-10-18 12:37:27.6520 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":25}.
   2018-10-18 12:37:37.6676 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":21}.
   2018-10-18 12:37:47.6688 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":29}.
   2018-10-18 12:37:57.6700 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":22}.
   2018-10-18 12:38:07.6838 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":32}.
   2018-10-18 12:38:17.6848 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":12}.
   2018-10-18 12:38:27.6866 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":46}.
   2018-10-18 12:38:37.6880 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":48}.
   2018-10-18 12:38:47.6893 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":39}.
   2018-10-18 12:38:57.6906 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":18}.
   2018-10-18 12:39:07.6995 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":6}.
   2018-10-18 12:39:17.7004 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":0}.
   2018-10-18 12:39:27.7021 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":3}.
   2018-10-18 12:39:37.7023 Amazon.KinesisTap.Hosting.LogManager INFO Null sink MyNullSink received {"RandomValue":19}.
   ```

AWS 서비스에 액세스하는 싱크를 만드는 경우 유용한 기본 클래스가 있습니다. 사용하는 싱크의 경우`AWSBufferedEventSink`기본 클래스에 대한 자세한 내용은`Amazon.KinesisTap.AWS\CloudWatchLogsSink.cs`를 Windows용 Kinesis 에이전트의 소스 코드에 입력하십시오.