Amazon Web Services ブログ

Amazon Kinesis Agent for Windows を使用して、Windows DHCP Server ログを即時に利用可能なメトリクスへ変換する

グローバルな規模で、Windows システムとサービスの健全性を把握することは簡単ではありません。サーバーのログデータを取得し、リアルタイムでデータを分析かつ操作して、即時に実行可能なテレメトリーに関する正しい情報を作成しましょう。Amazon Kinesis Agent for Microsoft Windows では、AWS の分析エコシステムに Windows サーバーログデータを効率よく収集できるようにします。このブログ記事では、Kinesis Agent for Windows を使用して、Windows Dynamic Host Configuration Protocol (DHCP) のサーバーログを取得および集計する方法について説明します。次に、そのデータを Amazon CloudWatch で、サービスヘルスを示すグラフに変換します。

世界中に散らばるチームのネットワークアクセスのメトリクスを、どうやって数値化していますか? もっと具体的には、ビルの 9 階、北東の角部屋にいるチームのメトリクスは? ビルの中のその部屋のワイヤレスアクセスポイント (WAP) は、チームにネットワークアクセスを確実に安定して提供しているでしょうか? あるいは、WAP が設定されているサブネットが IP アドレスを使い果たしてしまい、そのチームがネットワークアクセスするのを拒否していませんか? この記事では、Kinesis Agent for Windows を使用して、こうした重大な問題を解決します。

スコープの枯渇がもたらす、顧客への影響を検出する

Windows DHCP リースは、スコープと呼ばれるネットワークサブネットに分割されています。これらのスコープは、大規模な企業ネットワーク上の、専用の物理的な位置にマップされています。スコープは、それに属するすべての IP アドレスが使用されている場合に、いっぱいであるとみなされます。これは「スコープの枯渇」として知られています。「スコープの枯渇」が発生すると、新しいクライアントはそのサブネット上での IP アドレスのリースを拒否されます。これは「リースの拒否」と呼ばれます。  一般に、DHCP スコープは、予想されるデバイスの正確な数に対して定義されます。スコープが枯渇していることが予想される場合、それもただ単にスコープの枯渇に基づいている場合では、アラートが出ても意味がありません。

Windows DHCP サーバーが「スコープの枯渇」のせいでリースを拒否した場合、特定のレコードを DHCP 監査ログに書き込みます。このイベントのレコードは、Event ID 14 「スコープのアドレスプールが枯渇したので、リース要求に対応できませんでした。」、となります。複数レコードを監視して、それらの発生とパターンを追跡しない限り、レコードには限定した値を持たせます。何百もの Windows Server DHCP のフェイルオーバーリレーションシップを持つグローバル規模の DHCP サービスが存在する場合、このシナリオをモニタリングすることは困難です。さらに、サービスには何千ものスコープと数百万の IP アドレスがあります。ここで、Kinesis Agent for Windows が効果を発揮します。

DHCP サーバーのログファイルは、デフォルトで、C:\Windows\System32\dhcp ディレクトリにあります。IPv4 ログファイル名の先頭には、DhcpSrvLog が付きます。IPv6 ログファイル名の先頭には、DhcpV6SrvLog が付きます。この記事では、IPv4 ログに焦点を当てています。

ログファイルには、潜在的な Event ID を定義し説明するヘッダーが各ファイルの先頭にあります。各ログレコードのカンマ区切り値の順列も表示されます。これらのログの詳細については、DHCP サービスによって生成されるログを参照してください。詳細は、Microsoft の公式ドキュメントである「Analyze DHCP Server Log Files」を参照してください。以下は、スコープがいっぱいであることを示す、Event 14 レコードを含むログレコードの例です。

24,10/19/18,00:00:18,Database Cleanup Begin,,,,,0,6,,,,,,,,,0
18,10/19/18,00:00:18,Expired,192.168.1.251,,,,0,6,,,,,,,,,0
30,10/19/18,00:00:18,DNS Update Request,192.168.1.35,TEST-SERVER.domain.com,,,0,6,,,,,,,,,0
17,10/19/18,00:00:18,DNS record not deleted,192.168.5.35,,,,0,6,,,,,,,,,0
25,10/19/18,00:00:18,0 leases expired and 5 leases deleted,,,,,0,6,,,,,,,,,0
32,10/19/18,00:00:18,DNS Update Successful,192.168.1.35,TEST-SERVER.domain.com,,,0,6,,,,,,,,,0
14,10/19/18,00:00:19,Scope Full,192.168.3.10,,,,0,6,,,,,,,,,0
11,10/19/18,00:00:20,Renew,192.168.2.105,,00AABBCCDDEE,,1584371322,0,,,,0x506F6C79636F6D2D53504950333335,Polycom,,,,0
36,10/19/18,00:00:25,Packet dropped because of Client ID hash mismatch or standby server.,192.168.1.100,,EEDDCCBBAA00,,0,6,,,,,,,,,0

重要 – Windows DHCP Server ログには、どのサーバーで生成されたかを識別するデータは含まれていません。ただし、これはスコープ許容イベントの集計データセットを分析する際に重要となる情報です。Kinesis Agent for Windows には、ObjectDecoration という機能があります。これで、カスタム値を各ログレコードに挿入することができます。値は、各コンピュータにある ComputerName などのハードコードされた値あるいは環境変数から動的に作成されます。このユースケースでは、メトリクスを投稿するたくさんの DHCP のフェイルオーバーリレーションシップがあります。したがって、フェイルオーバー関係名の値は、サーバーのホスト名から解釈されます。ホスト名の例は、次のようになります。An example hostname is: DHCP-<FailoverRelatioshipName>-nn.この投稿には、Kinesis Agent for Windows の設定に使う appsettings.json ファイルのコンテンツが用意されており、さらに、ここでの実装で使用する ObjectDecoration を含んでいます。

DHCP サーバーログを収集、保存、および分析する

このセクションでは、Windows DHCP サーバーログを収集、保存、分析するための AWS サーバーレスインフラストラクチャの設定について解説します。最初に 2 つのワークフロー、og ingestionog processing を定義します。

ログの取り込み

Kinesis Agent for Windows は、ほぼリアルタイムで新しいレコードを検出し、それらを Amazon Kinesis Data Firehose 配信ストリームに送信します。配信ストリームは、時間間隔またはサイズ制限のあるデータのバッチを、圧縮形式で Amazon S3 バケットへ送信するように設定されています。

ログの処理

S3 バケットは Amazon S3 Event NotificationsAmazon Simple Notification Service (Amazon SNS) トピックに送信するように設定されています。AWS Lambda 関数が SNS トピックに登録されています。トリガーされると、Amazon S3 からオブジェクトを取得し、ログデータを解凍して処理します。次に、見つかったすべての Event ID 14 に関する Amazon CloudWatch メトリクスを投稿します。

注意 : S3 バケットから Amazon SNS トピックにトリガーすることで、データの他のコンシューマーが同じ SNS トピックに登録することができます。レコードを収集したくない場合は、RegexFilterPipe 機能を使用して、Kinesis Agent for Windows で直接 Event 14 以外のレコードをフィルタリングすることができます。さらに、Kinesis Agent for Windows が、同じログデータまたはそのフィルタリングしたサブセットの別のストリームを、別の専用の Kinesis Data Firehose、または Sink Declarations for Kinesis Agent for Windows でサポートされている他の宛先に「パイピングする」よう設定することも可能です。

ログ取り込みインフラストラクチャを構築する

次のステップでは、AWS リソースを作成します。ログソースは Windows 環境であるため、PowerShell を使用して構築プロセスを自動化します。AWS Tools for PowerShell は、AWS のエコシステム内のインフラストラクチャを開発および管理するためのコマンドレットを提供しています。

ログ取り込みパスのヘルプについては、Amazon Kinesis Firehose の使用方法に関するこちらの記事を参照してください。Amazon S3 バケットと Amazon Kinesis Firehose 配信ストリームを自動作成する方法を紹介しています。このパスの Kinesis Agent for Windows のセットアップパートは、インフラストラクチャコンポーネントの構築後に適用されます。

S3 バケットと Kinesis Firehose 配信ストリームを作成したら、次の手順を実行して追加の設定を行います。

  • データを Amazon Glacier にアーカイブするバケットライフサイクルポリシーを有効にする。これで、ストレージコストを最小限に抑えることができます。
  • Amazon S3 に送信する前にデータを圧縮する。これで、ストレージコストを最小限に抑えることができます。
  • Amazon S3 に送信する前にデータをバッチ処理する。これにより、最短の送信時間で、最大量のデータがバッチ処理されます。
  • ログの宛先に S3 バケット接頭辞を含める。これは、異なるスキーマでログを区切るのに役立ちます。
  • 配信ストリームで CloudWatch のログを有効にする。これは、取り込みの際の、潜在的な問題のトラブルシューティングになります。

これらの設定を行うためのコードサンプルを、次に示します。

# Get existing objects
$s3BucketName = '<s3-bucket-name>'
$firehoseDeliveryStreamName = '<delivery-stream-name>'
$roleName = '<role-name>'

$s3Bucket = Get-S3Bucket -BucketName $s3BucketName
$firehoseDeliveryStream = Get-KINFDeliveryStream -DeliveryStreamName $firehoseDeliveryStreamName
$iamRole = Get-IAMRole -RoleName $roleName

# Enable S3 Bucket archival to Glacier
$s3BucketLifecycleRuleId = 'Archive to Glacier after 14 days'
$s3BucketLifecycleRuleTransition = New-Object Amazon.S3.Model.LifecycleTransition
$s3BucketLifecycleRuleTransition.Days = 14
$s3BucketLifecycleRuleTransition.StorageClass = 'GLACIER'

$s3BucketLifecycleRule = New-Object Amazon.S3.Model.LifecycleRule
$s3BucketLifecycleRule.Id = $s3BucketLifecycleRuleId
$s3BucketLifecycleRule.Status = 'Enabled'
$s3BucketLifecycleRule.Transition = $s3BucketLifecycleRuleTransition
$s3BucketLifecycleRule.Prefix = $null

Write-S3LifecycleConfiguration –BucketName $s3Bucket.BucketName -Configuration_Rule $s3BucketLifecycleRule

# Enable CW Logging options including creation of a log group and a log stream 
$logGroupName = "/aws/kinesisfirehose/$firehoseDeliveryStreamName"
$logStreamName = 'S3Delivery'

# Create CloudWatch LogGroup and LogStream
New-CWLLogGroup -LogGroupName $logGroupName
New-CWLLogStream -LogGroupName $logGroupName -LogStreamName $logStreamName

# Define Kinesis Firehose Logging Options
$loggingOptions = New-Object Amazon.KinesisFirehose.Model.CloudWatchLoggingOptions
$loggingOptions.Enabled = $true
$loggingOptions.LogGroupName = $logGroupName
$loggingOptions.LogStreamName = $logStreamName

# Define Buffering hints object for traffic between Delivery Stream and S3
$bufferingHints = New-Object Amazon.KinesisFirehose.Model.BufferingHints
$bufferingHints.IntervalInSeconds = 60
$bufferingHints.SizeInMBs = 128

# Define Kinesis Firehose S3 Destination Update
$s3Destination = New-Object Amazon.KinesisFirehose.Model.ExtendedS3DestinationUpdate
$s3Destination.BucketARN = 'arn:aws:s3:::{0}' -f $s3Bucket.BucketName
$s3Destination.RoleARN = $iamRole.Arn
$s3Destination.CompressionFormat = 'GZIP'
$s3Destination.BufferingHints = $bufferingHints
$s3Destination.Prefix = 'DHCPServerLogs'
$s3Destination.CloudWatchLoggingOptions = $loggingOptions

# Update the Kinesis Firehose Delivery Stream
$kinfdUpdateParams = @{
    CurrentDeliveryStreamVersionId   = $firehoseDeliveryStream.VersionId
    DeliveryStreamName               = $firehoseDeliveryStreamName
    DestinationId                    = $firehoseDeliveryStream.Destinations.DestinationId
    ExtendedS3DestinationUpdate      = $s3Destination
}
Update-KINFDestination @kinfdUpdateParams

ログ処理インフラストラクチャを構築する

# Create the SNS topic.作成したトピックの ARN が返されます。
$snsTopicName = 'DHCPLogLambdaNotifier'
$topicArn = New-SNSTopic -Name $snsTopicName

# Give S3 permissions to send notifications to the Topic
$topicPolicy = @"
{
    "Version": "2008-10-17",
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "S3Publish",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "SNS:Publish"
            ],
            "Resource": "$topicArn",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:s3:::$s3BucketName"
                }
            }
        }
    ]
}
"@
Set-SNSTopicAttribute -TopicArn $topicArn -AttributeName 'Policy' -AttributeValue $topicPolicy

# Configure S3 Bucket SNS Topic Event Notification
$s3BucketTopicConfigurationFilterRule = New-Object Amazon.S3.Model.FilterRule
$s3BucketTopicConfigurationFilterRule.Name = 'Prefix'
$s3BucketTopicConfigurationFilterRule.Value = 'DHCPServerLogs/'

$s3BucketTopicConfigurationS3KeyFilter = New-Object Amazon.S3.Model.S3KeyFilter
$s3BucketTopicConfigurationS3KeyFilter.FilterRules = $s3BucketTopicConfigurationFilterRule

$s3BucketTopicConfigurationFilter = New-Object Amazon.S3.Model.Filter
$s3BucketTopicConfigurationFilter.S3KeyFilter = $s3BucketTopicConfigurationS3KeyFilter

$s3BucketTopicConfiguration = New-Object Amazon.S3.Model.TopicConfiguration
$s3BucketTopicConfiguration.Id = 'NotifySNS'
$s3BucketTopicConfiguration.Topic = $topicArn
$s3BucketTopicConfiguration.Filter = $s3BucketTopicConfigurationFilter
$s3BucketTopicConfiguration.Events = New-Object Amazon.S3.EventType 's3:ObjectCreated:*'
Write-S3BucketNotification -BucketName $s3BucketName -TopicConfiguration $s3BucketTopicConfiguration

# Create IAM policy and add AssumeRole policy for Lambda
$lambdaPolicy = @"
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CloudWatch",
            "Effect": "Allow",
            "Action": [
                  "cloudwatch:PutMetricData",
                  "cloudwatch:GetMetricData",
                  "cloudwatch:GetMetricStatistics",
                  "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        },
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                  "s3:ListBucket",
                  "s3:GetObject",
                  "s3:GetBucketLocation",
                  "s3:GetBucketNotification"
            ],
            "Resource": [
                  "arn:aws:s3:::$s3BucketName",
                  "arn:aws:s3:::$s3BucketName/*"
            ]
        },
        {
            "Sid": "Log",
            "Effect": "Allow",
            "Action": [
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
            ],
            "Resource": [
                  "arn:aws:logs:*:*:*"
            ]
        }
    ]
}
"@

$iamRoleName = 'LambdaDHCPLogProcessor'
New-IAMPolicy -PolicyName $iamRoleName -PolicyDocument $lambdaPolicy
$assumeRolePolicy = @"
{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Sid": "LambdaAssumeRole",
        "Effect": "Allow",
        "Principal": {
            "Service": "lambda.amazonaws.com"
        },
        "Action": [
            "sts:AssumeRole"
        ]
    }]
}
"@
$lambdaIamRole = New-IAMRole -RoleName $iamRoleName -AssumeRolePolicyDocument $assumeRolePolicy
$iamPolicy = Get-IAMPolicies | Where-Object {$_.PolicyName -eq $iamRoleName}
Register-IAMRolePolicy -RoleName $iamRoleName -PolicyArn $iamPolicy.Arn

# Create the Lambda Function
$lambdaFunctionParams = @{
        Description = 'For DHCP lease refusal metric posting'
        FunctionName = 'LeaseRefusalMetrics'
        ZipFilename = '.\LeaseRefusalMetrics.zip'
        Handler = 'LeaseRefusalMetrics.lambda_handler'
        Role = $lambdaIamRole.Arn
        Runtime = 'python3.6'
}
$lambdaFunction = Publish-LMFunction @lambdaFunctionParams

# Subscribe the Lambda Function to the SNS topic
$snsSubscriptionArn = Connect-SNSNotification -TopicARN $topicArn -Protocol Lambda -Endpoint $lambdaFunction.FunctionArn

# Add permission to the Lambda Function's policy so SNS can invoke it
Add-LMPermission -FunctionName $lambdaFunctionParams.FunctionName -Action "lambda:Invoke" -Principal sns.amazonaws.com -SourceArn $topicArn -StatementId (Get-Random)

ログを処理し、メトリクスを作成するための Lambda 関数

Lambda 関数では、スコープ許容イベントの識別やメトリクスの投稿に関するログデータを検査します。コードはもともと Python で書かれていました。しかし、AWS Lambda では、最近リリースされた PowerShell 言語で実行するように変換できます。このスクリプト名は LeaseRefusalMetrics.py の方です。このスクリプトは、buildout 実行に示しているように、LeaseRefusalMetrics.zip ファイルに含まれている必要があります。ワークフローは次のとおりです。

  • S3 オブジェクトを取得し、解凍する。
  • S3 オブジェクトのデータをバイトストリームとして読み込み、個々のレコードに分割する。
  • Event 14 のデータ (枯渇したスコープ) をスキャンする。
  • 各カンマ区切りの値を Event 14 レコードから区切る。
  • メトリクスディメンションの値をパースする。
  • メトリクスデータを CloudWatch に投稿し、3 つのメトリクスを取得する
from __future__ import print_function
import json
import urllib.parse
from io import BytesIO
from gzip import GzipFile
import datetime
from datetime import timedelta
import re
import boto3

s3Client = boto3.client('s3')
cwClient = boto3.client('cloudwatch')

def lambda_handler(event, context):
    print(json.dumps(event))

    s3message = json.loads(event['Records'][0]['Sns']['Message'])
    print(json.dumps(s3message))

    bucket = s3message['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(s3message['Records'][0]['s3']['object']['key'], encoding='utf-8')

    # Decompress the S3 object and read data in as byte stream
    try:
        response = s3Client.get_object(Bucket=bucket, Key=key)
        bytestream = BytesIO(response['Body'].read())
        s3object_text = GzipFile(None, 'rb', fileobj=bytestream).read().decode('utf-8')
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}.Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e


    # Split ByteStream into individual records and search for event 14 (scope exhausted)
    # When Event 14 is found, break apart each individual CSV record to parse out values
    # for metric dimensions: dhcpFailoverRelationshipName, dhcpScopeId.Finally, post a metric to CloudWatch.
    # Sample record: "DHCP-FailoverRelationshipName-01:::14,11/06/18,03:04:00,Scope Full,192.168.243.0,,,,0,6,,,,,,,,,0"

    records = s3object_text.splitlines()
    for record in records:
        recordValues = ""
        hostTemp = ""
        temp = ""
        date = ""
        time = ""
        dhcpFailoverRelationshipNameTemp = ""
        dhcpFailoverRelationshipName = ""
        dhcpHostName = ""
        dhcpScopeId = ""

        if re.match(r'^DHCP-.*:::14,', record, re.IGNORECASE):
            print("DHCP Full Scope Event: " + record)
            recordValues = record.split(',')
            hostTemp = recordValues[0]
            dhcpScopeId = str(recordValues[4])

            eventDate = str(recordValues[1]).replace("/","-")
            eventTime = recordValues[2]
            strDateTime = eventDate + " " + eventTime
            eventDTime = datetime.datetime.strptime(strDateTime, "%m-%d-%y %H:%M:%S")

            temp = hostTemp.split(':::')
            dhcpHostName = temp[0]
            dhcpFailoverRelationshipNameTemp = dhcpHostName.split('-')
            dhcpFailoverRelationshipName = dhcpFailoverRelationshipNameTemp[1]

            response = cwClient.put_metric_data(
                Namespace='DHCPService',
                MetricData=[
                    {
                        'MetricName': 'ScopeFullLeaseRefusal',
                        'Dimensions': [
                            {
                                'Name': 'DHCPFailoverRelationshipName',
                                'Value': dhcpFailoverRelationshipName
                            },
                            {
                                'Name': 'DHCPScopeId',
                                'Value': dhcpScopeId
                            }
                        ],
                        'Timestamp': eventDTime,
                        'Value': 1,
                        'Unit': 'Count',
                        'StorageResolution': 60
                    },
                    {
                        'MetricName': 'ScopeFullLeaseRefusal',
                        'Dimensions': [
                            {
                                'Name': 'DHCPFailoverRelationshipName',
                                'Value': dhcpFailoverRelationshipName
                            }
                        ],
                        'Timestamp': strDateTime,
                        'Value': 1,
                        'Unit': 'Count',
                        'StorageResolution': 60
                    },
                    {
                        'MetricName': 'AggregateLeaseRefusal',
                        'Dimensions': [
                            {
                                'Name': 'ScopeFullLeaseRefusal',
                                'Value': 'ScopeFullLeaseRefusal'
                            }
                        ],
                        'Timestamp': strDateTime,
                        'Value': 1,
                        'Unit': 'Count',
                        'StorageResolution': 60
                    }
                ]
            )

            print("CW.Put_Metric Response: ", response)

Kinesis Agent for Windows がログを送信するように設定する

次に、Kinesis Agent for Windows がログデータの収集を開始し処理ができるように設定します。Installing Kinesis Agent for Windows guide に従って、エージェントをインストールし、設定します。エージェントが使用する appsettings.json ファイルコンテンツは、この実装だけに特有のコメントとともに、以下に示しています。

{
    "Sources": [
        {
            "Id": "DHCPServerLog",
            "SourceType": "DirectorySource",
            "Directory": "C:\\Windows\\System32\\dhcp",
            "FileNameFilter": "Dhcp*SrvLog-*.log", <--------------- Only capture specific file names
            "InitialPosition": "Bookmark",
            "RecordParser": "SingleLine" <------------------------- Indicates that each distinct record is line delimited
        }
    ],
    "Pipes": [
        {
            "Id": "DHCPServerLog2Firehose",
            "SourceRef": "DHCPServerLog",
            "SinkRef": "DHCPServerLogsToFirehose",
            "Type": "RegexFilterPipe",
            "FilterPattern": "^\\d{2},.*" <------------------------ Indicates to only collect records that begin with two 
        }                                                           digits followed by a comma.Recall our log file has a
    ],                                                              header which we don't need to collect.
    "Sinks": [
        {
            "Id": "DHCPServerLogsToFirehose",
            "SinkType": "KinesisFirehose",
            "StreamName": "DHCPServerLogs",
            "TextDecoration": "{ComputerName}:::{_record}" <------- Decorate each log record by pre-pending the hostname 
        }                                                           and the following custom delimiter ':::'
    ]
}

ログデータを表示する

以下は、Amazon S3 で取得したデータを効率的に表示する方法です。

  1. AWS マネジメントコンソールにサインインし、Amazon S3 コンソールを開きます。Kinesis Data Firehose 配信ストリームがストリーミングされている S3 バケットに移動し、オブジェクトを選択します。
  2. [Select from] を選択します。
  3. [File format]CSV を選択し、[Show file preview] を選択します。

プレビューテキストボックスに DHCP ログが表示されます。これには、Kinesis Agent for Windows の設定に適応した ObjectDecoration が含まれています。

ログ処理出力

ログ処理の結果、CloudWatch に次の一連のメトリクスが追加されます。

  • グローバルなすべての DHCP フェイルオーバーリレーションシップのうち、リース拒否メトリクスの集計。
  • 各 DHCP フェイルオーバーリレーションシップのリース拒否を示すメトリクスグラフ。
  • 所有する DHCP フェイルオーバーリレーションシップのある、各スコープのリース拒否に関するメトリクスグラフ。

CloudWatch メトリクスのグラフを表示する

このセクションでは、Lambda 関数が CloudWatch メトリクスに追加したグラフを表示する方法を示します。 これは、これまでに処理された Event 14 のレコードが存在することを前提としています。

注意 : Event 14 のテストレコードを DHCP ログファイルに挿入することができます。詳細については、「Amazon CloudWatch メトリクスの使用」、またはより具体的には、「利用可能なメトリクスを表示する」を参照してください。

グラフを表示するには :

  1. Amazon CloudWatch コンソールにサインインします。
  2. ナビゲーションペインで [Metrics] を選択し、Lambda 関数が追加された DHCPService 名前空間をブラウズします。名前空間には、作成された 3 つのメトリクスディメンションのセット (「DHCPScopeId、DHCPFailoverRelationship」、「DHCPFailoverRelationship」、および「ScopeFullLeaseRefusal」) が表示されます。
  3. メトリクスディメンションのいずれかにさらにドリルダウンすると、グラフを表示できます。[ScopeFullLeaseRefusal] メトリクスディメンションを選択します。1つ のメトリクス、AggregateLeaseRefusal、が存在する必要があります。これは、リース拒否のグローバルな集計です。
  4. メトリクスを選択してデータポイントを表示します。

ここでは、メトリクスディメンションごとのグラフが、全体的なスナップショットが見れる CloudWatch ダッシュボードに追加されています。これを実行する方法の詳細については、「Amazon CloudWatch ダッシュボードの使用」を参照してください。次のグラフは、1 つのフェイルオーバーリレーションシップ名 (ABC) を示しています。

このグラフは、ABC フェイルオーバーリレーションシップにある特定の DHCP スコープ (192.168.4.0) において、スコープの枯渇の結果、リース拒否の量が大きくなっていることを示しています。実際には、ある時点で、1 時間に 335 回のリース拒否があります。

さらにこのグラフから、メトリクスグラフの線が特定の時間に中断し、ゼロに戻らないことも分かります。これは、Event 14 が検出された時にのみ、値が投稿されるからです。Event 14 が検出されない時、ゼロは投稿されません。これにより、Lambda 関数が簡略化され、実行時に 0 を投稿するかどうかを決定する必要がなくなります。多くのフェイルオーバーリレーションシップまたはスコープがある場合、データの視覚化の機能を追加すると、混乱する可能性があります。いつ、どこで、どれくらいのリース拒否が発生しているかだけを知りたいので、これらのメトリクスグラフは効率的に機能し、その目的を果たしてくれます。

結論

Kinesis Agent for Windows を使用することで、さまざまな DHCP サーバーのログデータが、即時に実行できる CloudWatch メトリクスに変換されました。これにより、DHCP スコープの枯渇とその結果生じる顧客への影響を特定することが可能となります。その後には、ネットワークエンジニアリングチームと協力して、特定の DHCP スコープを追加の IP アドレスで拡張し、全体的な顧客エクスペリエンスを向上させることができます。

つまり、Amazon Kinesis Agent for Microsoft Windows を使用すると、より効率的に仕事ができるようになるのです。ソリューションの構築に専念できるようになるため、結果をすばやく出せるようになります。ログデータを収集して保存するというソリューションの実装で、立ち往生してしまうことはもうありません。このユースケースを読んで、特に AWS サービスを幅広く活用したい場合、Amazon Kinesis Agent for Microsoft Windows をより創造的で洗練されたかたちで使ってみたい、という気持ちになってくれるとうれしいです。Amazon Kinesis Agent for Microsoft Windows には、ほんとうに多くの可能性があるのです。

その他のリソース

 


著者について

Ted Balsimo は、システム開発エンジニアとしてアマゾン ウェブ サービスで働いています