

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Windows プラグイン用 Kinesis エージェントの作成
<a name="creating-kinesis-agent-windows-plugins"></a>

ほとんどの場合、Microsoft Windows 用 Amazon Kinesis エージェントプラグインを作成する必要はありません。Windows 用 Kinesis Agent は高度に設定可能で、`DirectorySource`および`KinesisStream`です。これはほとんどのシナリオで十分です。既存のソースとシンクの詳細については、「[Microsoft Windows 用の Amazon Kinesis エージェントの設定](configuring-kinesis-agent-windows.md)」を参照してください。

異常なシナリオでは、カスタムプラグインを使って Kinesis Agent for Windows を拡張する必要があるかもしれません。ここで説明するシナリオは以下のとおりです。
+ `Regex` または `Delimited` レコードパーサーを使用して複雑な `DirectorySource` 宣言をパッケージ化すると、さまざまな種類の設定ファイルに簡単に適用できます。
+ ファイルベースではない、または既存のレコードパーサーが提供する解析機能を超える、新型のソースを作成します。
+ 現在サポートされていない AWS のサービス用のシンクを作成します。

**Topics**
+ [Windows プラグイン用 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)

## Windows プラグイン用 Kinesis エージェントの使用開始
<a name="creating-kinesis-agent-windows-plugins-overview"></a>

カスタムプラグインに関して特別なことは何もありません。既存のすべてのソースとシンクは、Kinesis Agent for Windows の起動時にカスタムプラグインがロードするのと同じメカニズムを使用し、それらは、`appsettings.json`設定ファイル。

Windows 用の Kinesis エージェントが起動すると、次のシーケンスが発生します。

1. Windows 用 Kinesis エージェントは、をインストールディレクトリ (`%PROGRAMFILES%\Amazon\AWSKinesisTap`を実装するクラスの`IFactory<T>`で定義された`Amazon.KinesisTap.Core`Assembly このインターフェイスは、`Amazon.KinesisTap.Core\Infrastructure\IFactory.cs`Kinesis エージェント for Windows のソースコードを参照してください。

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` メソッドを追加します。

   たとえば、次のコードは、ランダムデータを生成するソースを作成する Kinesis Agent for Windows プラグインファクトリを作成します。

   ```
   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` クラスは `Id` プロパティを提供するので `EventSource<T>` クラスから継承します。この例ではブックマークをサポートしていませんが、この基本クラスはその機能を実装するのにも役立ちます。エンベロープは、シンクへのストリーミング用にメタデータを格納し、任意のデータをラップする方法を提供します。`RandomData` クラスは次のステップで定義され、このソースからの出力オブジェクトの種類を表します。

1. ソースからストリーミングされたデータを含むクラスを以前に定義したプロジェクトに追加します。

   たとえば、ランダムデータのコンテナは次のように定義できます。

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

1. 以前に定義したプロジェクトをコンパイルします。

1. アセンブリを Kinesis Agent for Windows のインストールディレクトリにコピーします。

1. を作成または更新します。`appsettings.json`設定ファイルを作成して、それを Kinesis Agent for Windows のインストールディレクトリに配置します。

1. Windows 用の Kinesis エージェントを停止し、起動します。

1. 現在の Kinesis エージェント for Windows ログファイル (通常は`%PROGRAMDATA%\Amazon\AWSKinesisTap\logs`ディレクトリにあります) を確認して、カスタムソースプラグインに問題がないことを確認します。

1. データが目的の AWS のサービスに到着していることを確認してください。

を拡張する方法の例については、`DirectorySource`特定のログ形式の解析を実装するには、`Amazon.KinesisTap.Uls\UlsSourceFactory.cs`および`Amazon.KinesisTap.Uls\UlsLogParser.cs`Kinesis エージェント for Windows のソースコードを参照してください。

ブックマーク機能を提供するソースを作成する方法の例については、`Amazon.KinesisTap.Windows\WindowsSourceFactory.cs`および`Amazon.KinesisTap.Windows\EventLogSource.cs`Kinesis エージェント for Windows のソースコードを参照してください。

## 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` シンククラスはレコードを JSON や XML などのさまざまなシリアル化形式に変換する機能を提供するため、`EventSink` クラスから継承します。

1. 以前に定義したプロジェクトをコンパイルします。

1. アセンブリを Kinesis Agent for Windows のインストールディレクトリにコピーします。

1. を作成または更新します。`appsettings.json`設定ファイルを作成して、それを Kinesis Agent for Windows のインストールディレクトリに配置します。たとえば、`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"
   	}
     ]
   }
   ```

   この設定では、10 秒ごとに 0 〜 50 の乱数に設定された `RandomValue` で `RandomData` のインスタンスを送信する送信元が作成されます。受信した `RandomData` インスタンスを JSON に変換し、その JSON をログに記録してからインスタンスを破棄するシンクを作成します。サンプルの設定ファイルを使用するには、サンプルファクトリ、`RandomSource` ソースクラス、および `NullSink` シンククラスの両方を、前に定義したプロジェクトに必ず含めてください。

1. Windows 用の Kinesis エージェントを停止し、起動します。

1. 現在の Kinesis エージェント for Windows ログファイル (通常は`%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 エージェントのソースコードで。